PHP-2: 基本语法
1. 什么是 php 程序?
1.1 php 是什么
- PHP: (PHP: Hypertext Preprocessor), 超文本预处理器的缩写
- PHP 是开源的,免费的,运行在服务端的,用来动态生成网页数据的脚本语言
- 所谓脚本语言,是指不需要编译,直接由解释器/虚拟机执行的编程语言
1.2 php 程序执行流程
- php 程序是用 php 指令编写并由 php 解析器执行的代码
- php 程序必须使用
.php
做为扩展名
- php 程序可以使用标签方式嵌入到 html 文档中
执行流程哪下:
- 客户端请求服务器端的 php 程序
- 服务器端将 php 程序转发给 php 解释器执行
- php 解释器执行完毕将生成的 html 或其它内容返回到服务器
- 服务器将最终生成的 html 代码做为响应内容返回客户端
1.3 php 集成运行环境
初学者推荐使用集成环境,省去手工逐一安装配置麻烦
序号 |
集成环境 |
操作系统 |
描述 |
1 |
phpStudy |
Windows / Linux |
中文,免费,功能全, 推荐 |
2 |
MAMP |
MacOS |
英文,收费, 功能全, 推荐 |
1.4 php 程序文档
序号 |
组成 |
描述 |
1 |
<?php ... ?> |
PHP 代码标记 |
2 |
; 分号 |
语句分隔符,代码块使用右大括号 |
3 |
空白符 |
合理使用空白符可增强代码可读性 |
4 |
注释 |
// 单行注释 , /* 多行注释 */ |
php 标记之外的内容会原样返回客户端,如 html 代码
示例代码: demo1.php
<?php
function sum(int $a, int $b): int
{
return $a + $b;
}
echo sum(10, 20);
?>
1.5 打印结果
序号 |
指令 |
描述 |
1 |
echo |
语言结构, 可查看多个变量 |
2 |
print |
语言结构,功能与echo 类似,区别是有返回值 |
3 |
print_r() |
函数,以更容易理解的格式打印变量信息,常用于数组 |
4 |
var_dump() |
函数,可查看一个变量更多信息,如类型 |
5 |
var_export() |
函数,输出或返回一个变量的字符串表示(源代码) |
实际工作中, echo
和var_dump()
基本可以满足大多数需求
示例代码: demo2.php
<?php
$email = 'admin@php.cn';
echo $email, '<br>';
echo print $email;
echo '<br>';
var_dump($email);
echo '<br>';
var_export($email);
2. php 变量一网打尽
2.1 变量是什么
概念 |
描述 |
临时存储数据的空间 |
并不所有数据都需要保存到文件中,对于只用于当前程序的数据用变量更合适 |
数据复用的手段 |
将程序需要反复调用的数据,保存到一个变量中, 可以实现数据复用 |
2.2 命名规范
序号 |
规则 |
描述 |
1 |
语法 |
$ + 标识符 (必须以$ 做为变量标志) |
2 |
标识符 |
[a-z][A-Z][0-9]_ 只允许使用大小写英文字母,数字或下划线, 且不能以数字开始 |
3 |
大小写敏感 |
严格区分大小写: $name 和 $Name 是完全不同的变量 |
示例代码: demo3.php
$username = 'admin';
$userName = 'peter';
echo $username, '<br>', $userName, '<hr>';
$我的邮箱 = 'peter@php.cn';
echo $我的邮箱;
$aaa = 'php.cn';
$_ = 123;
$_123 = 888;
推荐一个变量命名网站,告别命名恐惧症:unbug.github.io/codelf/
2.3 创建方式
php 是动态语言,所以它的类型,值和变量名都是动态的
序号 |
名称 |
描述 |
1 |
弱类型 |
变量的类型,由它的当前值决定 |
2 |
变量传递 |
变量的值来自另一个变量时,有"值传递与引用传递"二种方式 |
3 |
动态变量名 |
也叫"可变变量", 即变量标识符可以来自另一个变量的值 |
2.3.1 弱类型
- php 是弱类型语言, 它的变量类型,由赋给它的值决定
- 因此, php 变量也不需要使用前进行声明
示例代码: demo4.php
$var = 100;
var_dump($var);
echo '<br>';
$var = 'Hello World';
var_dump($var);
2.3.2 值传递与引用传递
将变量赋值给另一个变量时,有值传递与引用传递二种方式
序号 |
传递方式 |
描述 |
1 |
值传递 |
将原变量的副本(变量值)复制到新变量中 |
2 |
引用传递 |
将原变量内存访问地址&引用 赋值给新变量 |
变量的值保存在"栈"中, 引用地址保存在"堆"中, 想深入了解请学习数据结构知识
示例代码: demo5.php
$price1 = 99;
$price2 = $price1;
$price2 = 199;
echo 'price1 = ' . $price1;
echo '<hr>';
$price1 = 99;
$price2 = &$price1;
$price2 = 199;
echo 'price1 = ' . $price1;
2.3.3 可变变量
- 可变变量: 是指变量的标识符可以动态的改变,即变量标识符可以来自另一个变量的值
- 应用场景: 需要通过动态改变变量来处理不同需求的时候,例如图像处理,请求处理时
示例代码: demo6.php
?php
$var = 'email';
?var = 'admin@php.cn';
echo $email;
2.4 检测与删除
序号 |
函数 |
描述 |
1 |
isset() |
检测变量是否存在且值非null |
2 |
unset() |
删除变量,无返回值 |
3 |
empty() |
是否为空(""/0/'0'/null/false/[]/\$a ) |
4 |
is_null() |
NULL : 赋值为null /未赋值/unset() |
error_reporting(E_ALL);
echo $username;
if (isset($username)) echo $username . '<br>';
$username = 'peter zhu';
echo $username, '<br>';
unset($username);
echo $username;
$email;
var_dump($email);
var_dump(is_null($email));
$var = '';
var_dump(empty($var));
var_dump(is_null($var));
2.5 数据类型
变量的访问方式,受以下条件的限制
序号 |
名称 |
描述 |
1 |
数据类型 |
主要有基本类型, 复用类型,特殊类型 |
2 |
作用域 |
变量的有效范围,即可见性,查询变量的工具 |
3 |
生命周期* |
变量从创建到注销的全过程(程序结束会自动注销) |
- 确定了数据类型, 才可以确定数据的 "取值范围" 与 "操作方式",所以非常重要
- 变量数据类型由值决定, 值的数据类型有三类:
2.5.1 基本类型
基本类型: 是构成复合类型的基本数据单元
序号 |
类型 |
标识符 |
检测函数 |
举例 |
1 |
整数 |
integer |
is_int() |
150 , 999 |
2 |
浮点数 |
float |
is_float() |
3.14 , .315 |
2 |
字符 |
string |
is_string() |
'php' , "email" |
4 |
布尔 |
boolean |
is_bool() |
true , false |
2.5.2 复合类型
序号 |
类型 |
标识符 |
检测函数 |
举例 |
1 |
对象 |
object |
is_object() |
new stdClass() |
2 |
数组 |
array |
is_array() |
$arr = [1,2,3] |
2.5.3 特殊类型
序号 |
类型 |
标识符 |
检测函数 |
举例 |
1 |
空 |
null |
is_object() |
new stdClass() |
2 |
资源 |
resource |
is_resource() |
$f = fopen(...) |
示例代码: demo7.php
<?php
$name = '手机';
$price = 3890;
$is5G = true;
echo $name . '价格: ' . $price . ', 是否5G? ' . ($is5G ? '是' : '否') . '<br>';
$obj = new stdClass;
$obj->email = 'admin@php.cn';
echo $obj->email, '<br>';
$arr = ['电脑', 8000, 'huawei'];
echo '<pre>' . print_r($arr, true) . '</pre>';
$num = null;
var_dump($num);
$f = fopen('demo6.php', 'r');
var_dump($f);
echo gettype($f);
2.5.4 类型查询
- 类型检测函数,如
is_int()
返回的都是一个布尔值
gettype()
: 返回类型的字符串表示
2.6 类型转换
2.6.1 自动转换
- 自动转换: 表达式根据操作符, 将操作数转为一致的数据类型后再进行运算
- 自动转换, 通常只发生在 基本类型 参与的算术或字符串运算中
序号 |
类型 |
转换规则 |
1 |
null |
null => 0 |
2 |
boolean |
true => 1 , false => 0 |
3 |
string |
123abc => 123 , abc123 => 0 |
4 |
integer |
int => float |
2.6.2 强制转换
- 强制转换分为: 临时转换 和 永久转换 二种
- 临时转换, 可使用类型提示符,或者类型函数实现
使用类型提示符:
序号 |
类型 |
转换规则 |
1 |
(int) |
转为整数 |
2 |
(float) |
转为浮点数 |
3 |
(string) |
转为字符串 |
4 |
(array) |
转为数组 |
5 |
(object) |
转为对象 |
使用类型函数:
序号 |
类型 |
转换规则 |
1 |
intval() |
转为整数 |
2 |
floatval() |
转为浮点数 |
3 |
strval() |
转为字符串 |
4 |
boolval() |
转为布尔 |
- 永久转换: 使用函数
settype($var , $type)
示例代码: demo8.php
<?php
$a = null;
$b = true;
$c = false;
$d = '5g';
$e = 'php';
$f = 15;
echo $a + 10, '<br>';
echo $b + 10, '<br>';
echo $d + 10, '<br>';
echo $e + 10, '<br>';
echo $e . $f;
echo '<hr>';
echo (int) $d + 10, '<br>';
echo intval($d) + 18, '<br>';
echo strval($f) . ' hello', '<br>';
echo gettype($f), '<br>';
settype($f, 'string');
echo gettype($f), '<br>';
2.7 作用域
- 变量作用域,也叫"变量范围", 即定义变量时的上下文环境
- 变量作用域,通俗的说,就是变量的生效范围
- 一个变量必定属于一个作用域, 这个作用域也包括了当前作用域中引入其它文件
- 也有不受作用域限制的变量,例如超全局变量, 在程序中任何地方都是有定义的
- 函数作用域: php 中只有函数可以创建作用域, 函数之外的代码全部在全局空间中
序号 |
作用域 |
描述 |
1 |
函数作用域 |
使用function 关键字创建的作用域 |
2 |
全局作用域 |
函数之外的变量生效范围 |
- php 中没有块作用域的概念, 这与其它编程语言不同, 请留意
- 根据作用域不同, 变量可以分为三类:
序号 |
变量类型 |
描述 |
1 |
私有变量 |
函数中定义的变量 |
2 |
全局变量 |
函数之外定义的变量 |
3 |
超全局变量 |
也叫预定义变量,访问不受作用域限制 |
- 超全局变量,也叫超全局数组,随系统加载,因此在所有脚本中均有定义,全局和函数中都可以访问
序号 |
变量名 |
描述 |
1 |
$GLOBALS |
引用全局作用域中可用的全部变量 |
2 |
$_SERVER |
服务器和执行环境信息 |
3 |
$_GET |
HTTP GET 请求:通过 URL 参数传递给当前脚本的变量的数组 |
4 |
$_POST |
HTTP POST 请求: 将变量以关联数组形式传入当前脚本 |
5 |
$_FILES |
HTTP 文件上传变量,保存着上传文件的全部信息 |
6 |
$_COOKIE |
通过 HTTP Cookies 方式传递给当前脚本的变量的数组 |
7 |
$_SESSION |
当前脚本可用 SESSION 变量的数组 |
8 |
$_REQUEST |
默认情况下包含了 $_GET ,$_POST 和 $_COOKIE 的数组 |
9 |
$_ENV |
通过环境方式传递给当前脚本的变量的数组 |
示例代码: demo9.php
$siteName = 'php中文网';
function getInfo(): string
{
global $siteName;
$local = $siteName;
$local = $GLOBALS['siteName'];
echo $_SERVER['SCRIPT_NAME'] . '<br>';
return $local;
}
echo getInfo(), '<br>';
echo $_SERVER['SCRIPT_NAME'];
2.8 静态变量
2.8.1 基本常识
- 定义在函数中的静态变量使用
static
修饰,并且与函数作用域绑定
- 静态变量定义时必须初始化,且只能初始化一次,默认为
0
- 当程序执行离开函数作用域后,静态变量的值不丢失
- 静态变量的值,可以在函数的多次调用中保持不变,即可带入下次调用中
- 函数中静态变量遵循私有变量约束, 全局不可访问
2.8.2 应用场景
- 当多次调用同一函数,且要求每次调用之间共享或保留某些变量的时候
- 尽管全局变量也可以办到,但没必要, 采用局部静态变量更合适
示例代码: demo10.php
namespace ns1;
function test1(): float
{
$sum = 0;
$sum = $sum + 1;
return $sum;
}
echo test1(), '<br>';
echo test1(), '<br>';
echo test1(), '<br>';
echo '<hr>';
namespace ns2;
$sum = 0;
function test1(): float
{
global $sum;
$sum = $sum + 1;
return $sum;
}
echo test1(), '<br>';
echo test1(), '<br>';
echo test1(), '<br>';
echo '<hr>';
namespace ns3;
function test1(): float
{
static $sum = 0;
$sum = $sum + 1;
return $sum;
}
echo test1(), '<br>';
echo test1(), '<br>';
echo test1(), '<br>';
2.9 变量过滤器
- PHP 过滤器用于验证和过滤来自非安全来源的外部数据
- 外部数据来源:
序号 |
数据来源 |
描述 |
1 |
表单 |
来自表音的用户输入数据 |
2 |
Cookies |
来自浏览器中的 cookie |
3 |
服务器变量 |
防止伪装的合法访问 |
4 |
Web 服务数据 |
Web 请求的数据 |
5 |
数据库查询结果 |
数据表中的数据并不可信 |
序号 |
函数 |
描述 |
1 |
filter_list() |
|
2 |
filter_id() |
|
3 |
filter_var() |
过滤单个变量 |
4 |
filter_var_array() |
过滤多个变量 |
5 |
filter_has_var() |
检测是否存在某个外部变量 |
6 |
filter_input() |
过滤单个外部变量 |
7 |
filter_input_array() |
过滤多个外部变量 |
- 外部变量类型:
INPUT_GET
, INPUT_POST
, INPUT_COOKIE
, INPUT_SERVER
, INPUT_ENV
- 过滤器主要分为二类: 验证过滤器, 清理过滤器
2.9.1 验证过滤器常量
- 验证过滤器: 又叫"验证器", 主要用于数据的类型和格式验证
序号 |
过滤器函数 |
描述 |
1 |
FILTER_VALIDATE_INT |
验证整数 |
2 |
FILTER_VALIDATE_FLOAT |
浮点点验证 |
3 |
FILTER_VALIDATE_BOOLEAN |
验证布尔项 |
4 |
FILTER_VALIDATE_EMAIL |
验证邮箱 |
5 |
FILTER_VALIDATE_URL |
验证 URL 地址 |
6 |
FILTER_VALIDATE_IP |
验证 IP 地址 |
7 |
FILTER_VALIDATE_REGEXP |
正则验证 |
FILTER_VALIDATE_BOOLEAN
: 布尔选项的返回值类型
序号 |
返回值 |
描述 |
1 |
true |
"1", "true", "on" 和 "yes" |
2 |
false |
"0", "false", "off", "no", "" |
3 |
null |
除以上情形外 |
2.9.2 清理过滤器常量
序号 |
过滤器函数 |
描述 |
1 |
FILTER_UNSAFE_RAW |
保持原始数据 |
2 |
FILTER CALLBACK |
自定义函数过滤数据 |
3 |
FILTER_SANITIZE_STRING |
去除标签以及特殊字符:strip_tags() |
4 |
FILTER_SANITIZE_STRIPPED |
"string" 过滤器别名 |
5 |
FILTER_SANITIZE_ENCODED |
URL-encode 字符串,去除或编码特殊字符 |
6 |
FILTER_SANITIZE_SPECIAL_CHARS |
HTML 转义字符, 等价于 htmlspecialchars() |
7 |
FILTER_SANITIZE_EMAIL |
仅保留邮箱地址的合法字符 |
8 |
FILTER_SANITIZE_URL |
仅保留合法的 URL, 必须从协议开始http/https |
9 |
FILTER_SANITIZE_NUMBER_INT |
仅保留合法的数字和正负号+- |
10 |
FILTER_SANITIZE_NUMBER_FLOAT |
仅保留合法的数字和正负号+- 以及指数 .,eE |
11 |
FILTER_SANITIZE_MAGIC_QUOTES |
等价于函数: addslashes() |
2.9.3 选项与标志
- 可以对过滤器设置选项和标志, 对数据进行更加精准的过滤处理
- 选项与标志使用数组键名表示:
'options'=>[...], 'flags'=>...
(复数)
- 举例:
filter_var($int, FILTER_VALIDATE_INT, ['options'=>['min_range'=>10,'max_range'=>80]]);
filter_var($data, FILTER_VALIDATE_EMAIL, ['flags'=>FILTER_REQUIRE_SCALAR]);
示例代码: demo11.php
foreach (filter_list() as $filter) {
}
echo '<hr>';
$age = 30;
var_dump(filter_var($age, FILTER_VALIDATE_INT));
$age = '30';
var_dump(filter_var($age, FILTER_VALIDATE_INT));
echo '<br>';
var_dump(filter_var(10, FILTER_VALIDATE_INT, ['options' => ['min_range' => 18, 'max_range' => 60]]));
$age = 40;
var_dump(filter_var($age, FILTER_VALIDATE_INT, ['options' => ['min_range' => 18, 'max_range' => 60]]));
echo '<br>';
$email = 'admin@php.cn';
var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
echo '<br>';
var_dump(filter_var($email, 274));
echo '<br>';
var_dump(filter_var('peter@qq.com', 274));
echo '<br>';
$a = 10;
$b = 'php';
var_dump(filter_var_array([$a, $b], FILTER_VALIDATE_INT));
echo '<br>';
$data = [$a, $b, 'html', [6, 7, 8], 150, 200];
var_dump(filter_var_array($data, FILTER_VALIDATE_INT));
var_dump(array_filter(filter_var_array($data, FILTER_VALIDATE_INT)));
echo '<hr>';
var_dump(filter_has_var(INPUT_GET, 'id'));
echo '<br>';
$res = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]);
var_dump($res);
echo '<hr>';
var_dump(filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING));
$args = [
'username' => FILTER_SANITIZE_STRING,
'email' => FILTER_VALIDATE_EMAIL,
'age' => ['filter' => FILTER_VALIDATE_INT, 'flags'=>FILTER_REQUIRE_SCALAR, 'options' => ['min_range' => 18]],
'blog' => FILTER_VALIDATE_URL,
];
var_dump(filter_input_array(INPUT_GET, $args));
3. 细说常量
3.1 常量的特征
序号 |
特征 |
1 |
常量前面没有美元符号$ |
2 |
常量创建时必须初始化 |
3 |
常量禁止更新和删除 |
4 |
常量不受作用域限制 |
5 |
推荐使用大写字母加下划线命名 |
3.2 常量函数/关键字
序号 |
定义方式 |
描述 |
1 |
get_defined_constants() |
查看系统所有常量 |
2 |
defined() |
检测常量是否存在 |
3 |
define() |
创建常量 |
4 |
const 关键字 |
创建常量 |
5 |
constant() |
获取常量值 |
get_defined_constants(true)
: 常量分组打印,自定义常量在user
分组
defined()
: 返回布尔值
print_r(get_defined_constants(true));
print_r(get_defined_constants(true)['user']);
3.3 创建常量
序号 |
定义方式 |
区别 |
1 |
define() |
除了不能创建类常量, 可以在程序的任何地方定义 |
2 |
const 关键字 |
必须全局定义,不能用在函数和流程控制中,允许创建类常量 |
- 常量值:
int
, float
, string
, boolean
,null
, array
(php7+)
define($name, true)
: 允许忽略常量名大小写
const
在编译阶段处理, define()
在运行阶段处理,所以const
必须定义在全局才有效
class
类声明在编译时处理,且并不会创建作用域,当然也是全局中, 所以const
可以用
3.4 获取常量
序号 |
函数/关键字 |
区别 |
1 |
echo |
通常使用已知的常量名 |
2 |
constant() |
常量名不确定或在变量中 |
示例代码: demo12.php
define('LECTURE', '朱老师');
const COURSE = 'PHP';
function test1()
{
echo LECTURE . '教: ' . COURSE . '<br>';
define('SEX', '男');
echo SEX, '<br>';
}
test1();
echo '<hr>';
if (true) {
define('EMAIL', 'admin@php.cn');
echo EMAIL;
}
echo '<hr>';
class Demo
{
const HELLO = 'php.cn';
}
echo Demo::HELLO, '<br>';
var_dump(defined('EMAIL'));
echo '<hr>';
echo '<pre>' . print_r(get_defined_constants(true)['user'], true) . '</pre>';
const DB_LINKS = [
'host' => 'localhost',
'username' => 'root',
'password' => 'root',
'charset' => 'utf8',
];
echo '<pre>' . print_r(DB_LINKS, true) . '</pre>';
echo '<hr>';
echo constant('LECTURE') . '<br>';
echo LECTURE . '<br>';
$constName = 'EMAIL';
echo $constName, '<br>';
echo constant($constName), '<br>';
define('', "其实我也是常量");
echo '', '<br>';
echo constant('');
3.5 预定义常量
预定义常量非常多,有许多与具体扩展相关,如 PDO
, 这里仅列出系统级常用的:
序号 |
预定义常量 |
描述 |
1 |
PHP_VERSION |
PHP 版本 |
2 |
PHP_MAXPATHLEN |
PHP 路径最大长度:1024 |
3 |
PHP_OS_FAMILY |
操作系统:Windows/Darwin/Linux |
4 |
PHP_SAPI |
web 服务器与 php 之间接口: apache2handler |
5 |
PHP_EOL |
行尾结束符 |
6 |
PHP_INT_MAX |
最大整数: 9223372036854775807 |
7 |
PHP_INT_MIN |
最小整数: -9223372036854775808 |
8 |
PHP_INT_SIZE |
整数宽度: 8 |
9 |
PHP_FLOAT_MAX |
最大浮点数:1.7976931348623E+308 |
10 |
PHP_FLOAT_MIN |
整小浮点数: 2.2250738585072E-308 |
11 |
DEFAULT_INCLUDE_PATH |
默认 PHP 命令路径 |
12 |
PHP_EXTENSION_DIR |
默认 PHP 扩展路径 |
13 |
E_ERROR |
运行时错误: 致命中断 |
14 |
E_PARSE |
语法解析错误: 致命中断 |
15 |
E_NOTICE |
运行时提示: 不中断 |
16 |
E_WARNING |
运行时警告: 不中断 |
17 |
E_ALL |
所有级别错误(除E_STRICT ) |
18 |
E_STRICT |
更加严格的错误处理机制,高于E_ALL |
19 |
TRUE |
布尔真 |
20 |
FALSE |
布尔假 |
21 |
NULL |
空 |
22 |
DIRECTORY_SEPARATOR |
目录分隔符 |
更多预定义常量:www.php.net/manual/zh/r…
3.6 魔术常量
- 魔术常量也属于"预定义常量", 比较特殊所有单独列出
- 所谓"魔术", 是指常量的值, 会随它们在代码中的位置改变而改变
- 魔术常量不区分大小写, 但是推荐全部大写
序号 |
魔术常量 |
描述 |
1 |
__LINE__ |
文件中的当前行号 |
2 |
__FILE__ |
文件的完整路径和文件名 |
3 |
__DIR__ |
文件所在目录 |
4 |
__FUNCTION__ |
当前的函数名称 |
5 |
__CLASS__ |
当前类名称 |
6 |
__TRAIT__ |
当前Trait 名称 |
7 |
__METHOD__ |
当前类方法名称 |
8 |
__NAMESPACE__ |
当前命名空间名称 |
示例代码: demo13.php
echo '版本号: ' . PHP_VERSION . '<br>';
echo '操作系统: ' . PHP_OS_FAMILY . '<br>';
echo '最大整数: ' . PHP_INT_MAX . '<br>';
echo '最大浮点数: ' . PHP_FLOAT_MAX . '<br>';
echo '目录分隔符: ' . DIRECTORY_SEPARATOR . '<hr>';
echo '当前行号: ' . __LINE__ . '<br>';
echo '当前文件: ' . __FILE__ . '<br>';
echo '当前目录: ' . __DIR__ . '<br>';
3.7 常量命名空间
- 当使用的第三方组件(类库)中存在也当前脚本命名冲突的常量名时,可以用命名空间解决
- 命名空间允许将同名的标识符,定义在不同的空间中,类似同名文件可存放在不同目录下
- 命名空间使用关键字
namespace
声明, 必须放在脚本的首行,且前面不允许有任何输出
# 常量的命名空间
// 报重复声明错误
// const APP_PATH = __DIR__ . '/public/';
// const APP_PATH = __DIR__ . '/home/';
// 将同名常量定义在不同的空间中, 则不会报错
namespace ns1 {
const APP_PATH = __DIR__ . '/public/';
}
namespace ns2 {
const APP_PATH = __DIR__ . '/home/';
}
// 全局空间,不需要空间名
namespace {
// 访问命名空间中的常量, 必须带上空间名称
echo \ns1\APP_PATH . '<br>';
echo \ns2\APP_PATH . '<br>';
}
4. 细说运算符
4.1 算术运算符
序号 |
运算符 |
示例 |
描述 |
1 |
+ |
$a+$b |
b 的和 |
2 |
- |
$a-$b |
b 的差 |
3 |
* |
$a*$b |
b 的积 |
4 |
/ |
$a/$b |
b 的商 |
5 |
% |
$a%$b |
b 的余(模) |
6 |
++ |
$a++/++$a |
先用再加/先加再用 |
7 |
-- |
$a--/--$a |
先用再减/先减再用 |
8 |
** |
2**4 |
幂运算:2 的 4 次方 |
$a++
=>$a = $a + 1
, $a--
=>$a = $a - 1
**
: 幂运算需要 php5.6+
版本
4.2 字符串运算符
运算符 |
示例 |
描述 |
. |
$str1 . $str2 |
连接运算,返回连接之后的字符串 |
4.3 赋值运算符
序号 |
运算符 |
示例 |
描述 |
1 |
= |
$a = 10 |
将表达式的值赋给变量 |
2 |
+= |
$a += 10 |
$a = $a + 10; |
3 |
-= |
$a -= 10 |
$a = $a - 10; |
4 |
*= |
$a *= 10 |
$a = $a * 10; |
5 |
/= |
$a /= 10 |
$a = $a / 10; |
6 |
%= |
$a %= 10 |
$a = $a % 10; |
7 |
.= |
$a .= 'a' |
$a = $a . 'a'; |
4.4 比较运算符
序号 |
运算符 |
示例 |
描述 |
1 |
> |
$a > $b |
大于 |
2 |
>= |
$a >= $b |
大于或等于 |
3 |
< |
$a < $b |
小于 |
4 |
<= |
$a <= $b |
小于或等于 |
5 |
== |
$a == $b |
等于 (值相等即可) |
6 |
=== |
$a == $b |
全等于(二边值与类型全等) |
7 |
!= |
$a != $b |
不相等 |
8 |
!== |
$a !== $b |
不全等 |
9 |
<=> |
$a <=> $b |
太空船php7+ |
- 比较运算符: 返回布尔值,常用于流程控制中(
if/while/for...
)
<=>
: 也叫组合比较符, 例如$a <=> $b
, 有三种返回结果
序号 |
运算 |
结果 |
1 |
$a > $b |
返回>0 的整数 |
2 |
$a < $b |
返回<0 的整数 |
3 |
$a = $b |
返回=0 的整数 |
示例代码: demo15.php
var_dump(10 > 20);
var_dump('10' == 10);
var_dump('10' === 10);
echo '<hr>';
var_dump(10 <=> 20);
var_dump(10 <=> 5);
var_dump(10 <=> 10);
4.5 逻辑运算符
序号 |
运算符 |
示例 |
描述 |
1 |
&& |
$a && $b |
逻辑与 |
2 |
|| |
$a || $b |
逻辑或 |
3 |
! |
!$a |
逻辑非 |
4 |
xor |
$a xor $b |
逻辑异或 |
- 逻辑运算符二边表达式必须是布尔类型
- 对应别名:
&&
=> and
, ||
=> or
, !
=> not
- 优先级:
!
> &&
> ||
- 异或: 当二边表达式运算结果不相同时,结果为
true
示例代码: demo16.php
error_reporting(E_ALL ^ E_NOTICE);
var_dump((3 < 4) && (5 > 8));
var_dump((3 < 4) || (5 > 8));
if ($name && $name === 'admin') {
echo '欢迎您';
} else {
echo '未登录';
}
4.6 三元运算符
序号 |
运算符 |
示例 |
描述 |
场景 |
1 |
?: |
$a ?: $b |
仅判断表达式true/false |
简化双分支 |
2 |
?? |
$a ?? $b |
判断变量存在且不为 null |
设置默认值 |
- 其实
??
不算三元运算符: 准确讲应该是NULL合并符
??
: 需要满足二个条件(1)变量存在(2)且值不为null
,其实就是isset()
的要求
示例代码: demo17.php
$price = 1200;
if ($price > 1000) {
echo '太贵了';
} else {
echo '真便宜';
}
echo $price > 1000 ? '太贵了' : '真便宜';
echo '<hr>';
echo isset($password) ? $password : 'root';
$password = $password ?? 'root';
echo $password;
4.7 错误屏蔽符
运算符 |
示例 |
描述 |
场景 |
@ |
@(10/0) |
屏蔽所有运行错误 |
线上生产环境 |
示例代码: demo18.php
echo @$username;
@(10 / 0);
@include('hello.php');
5. 流程控制
5.1 分支结构
序号 |
类型 |
语法 |
模板语法 |
1 |
单分支 |
if(){...} |
if(): ... endif; |
2 |
双分支 |
if(){...} else {...} |
if(): ... else: ... endif; |
3 |
多分支 |
if(){...} elseif {...} else {...} |
if(): ... elseif: ... else: ... endif; |
4 |
switch |
switch() {case: ... break...} |
switch(): ...endswitch; |
示例代码: demo19.php
$amount = 5500;
$payment = $amount;
if ($amount > 5000) {
$payment = $amount * 0.9;
}
if ($amount) :
$payment = $amount * 0.9;
endif;
echo '实际支付: ' . $payment . '<br>';
echo '<hr>';
$amount = 3500;
if ($amount > 5000) {
$payment = $amount * 0.9;
} else {
$payment = $amount;
}
if ($amount > 5000) :
$payment = $amount * 0.9;
else :
$payment = $amount;
endif;
echo '实际支付: ' . $payment . '<br>';
echo '<hr>';
$amount = 13500;
if ($amount > 5000 && $amount < 10000) {
$payment = $amount * 0.9;
} elseif ($amount >= 10000 && $amount < 20000) {
$payment = $amount * 0.7;
} elseif ($amount >= 20000 && $amount < 30000) {
$payment = $amount * 0.5;
} else {
$payment = $amount;
}
if ($amount > 5000 && $amount < 10000) :
$payment = $amount * 0.9;
elseif ($amount >= 10000 && $amount < 20000) :
$payment = $amount * 0.7;
elseif ($amount >= 20000 && $amount < 30000) :
$payment = $amount * 0.5;
else :
$payment = $amount;
endif;
echo '实际支付: ' . $payment . '<br>';
echo '<hr>';
$amount = 23500;
switch (true) {
case $amount > 5000 && $amount < 10000:
$payment = $amount * 0.9;
break;
case $amount >= 10000 && $amount < 20000:
$payment = $amount * 0.7;
break;
case $amount >= 20000 && $amount < 30000:
$payment = $amount * 0.5;
break;
default:
$payment = $amount;
}
$amount = 8500;
switch (true):
case $amount > 5000 && $amount < 10000:
$payment = $amount * 0.9;
break;
case $amount >= 10000 && $amount < 20000:
$payment = $amount * 0.7;
break;
case $amount >= 20000 && $amount < 30000:
$payment = $amount * 0.5;
break;
default:
$payment = $amount;
endswitch;
echo '实际支付: ' . $payment . '<br>';
$discount = 0.8;
switch ($discount):
case 0.9:
$payment = $amount * $discount;
break;
case 0.7:
$payment = $amount * 0.7;
break;
case 0.5:
$payment = $amount * 0.5;
break;
default:
die('不支持的折扣率');
endswitch;
echo '实际支付: ' . $payment . ', 折扣率: ' . $discount;
5.2 循环结构
序号 |
类型 |
语法 |
模板语法 |
1 |
入口判断型 |
while(){...} |
while(): ... endwhile; |
2 |
出口判断型 |
do {...} while(); |
do : ... while(); |
3 |
计数型 |
for(){...} |
for () : ... endfor; |
循环控制关键字:
序号 |
关键字 |
描述 |
1 |
continue |
终止本次循环,提前进入下一轮 |
2 |
break |
跳出本层循环 |
示例代码: demo20.php
<?php
$cities = ['武汉', '合肥', '南京', '杭州', '上海'];
while ($city = current($cities)) {
echo $city . '<br>';
next($cities);
}
reset($cities);
while ($city = current($cities)) :
echo $city . '<br>';
next($cities);
endwhile;
echo '<hr>';
reset($cities);
do {
echo $city . '<br>';
next($cities);
} while ($city = current($cities));
echo '<hr>';
reset($cities);
for ($i = 0; $i < count($cities); $i++) {
echo $cities[$i] . '<br>';
}
reset($cities);
for ($i = 0; $i < count($cities); $i++) :
echo $cities[$i] . '<br>';
endfor;
echo '<hr>';
$cities = ['武汉', '合肥', false, '南京', null, '杭州', '上海'];
while ($city = current($cities)) :
echo $city . '<br>';
next($cities);
endwhile;
reset($cities);
for ($i = 0; $i < count($cities); $i++) :
if (!$cities[$i]) continue;
echo $cities[$i] . '<br>';
if ($cities[$i] === '杭州') break;
endfor;