工作几年对于PHP的一些基础知识的回顾,做为多年来学习和使用PHP的总结。
PHP做为一门宏定义语言,主要用来处理网页表单,可以内嵌在HTML文本文件中。为了区分HTML代码,PHP的代码块的起始界定使用 “ <?php ” 和 “ ?> ” 或者 PHP5.4版本以后的短标签“ <? ”和 “ ?> ”。对于纯PHP文件,同样使用以上的标签进行起始表示,但建议省略结束的 “ ?> ”标签。
PHP-变量/常量
变量:
PHP中的变量定义以美元符号 “ $ ”开头,例如:$name = “zhangsan”;变量名不支持生命变量类型,大小写敏感。合法的变量名以字母、下划线开头,但不能以数字、点、加减乘除等特殊符号开头,但是可以以中文中文汉字开头。
变量声明的合法性验证:
```
1、$name = "zhangsan"; // 合法
2、$.name = "zhangsan"; // 不合法,不能以点开头
3、$1234 = "zhangsan"; // 不合法,不能以数字开头
4、$my-name = "zhangsan"; // 不合法,变量名不能有减号
5、$myName = "zhangsan"; // 合法
6、$名字 = "zhangsan"; // 合法
```
常量:
常量的定义方式有两种:define和const。常量名中的字母必须全部大写,可以用下划线连接。
常量声明的合法性验证:
```
1、define('NAME','zhangsan'); // 合法
2、define('NAME_first','zhangsan');// 不合法,字母必须全部大写
3、define('NAME_FIRST','zhangsan'); // 合法
4、define('NAME_2','zhangsan'); // 合法
5、define('NAME_中国',‘张三’); // 合法
6、define('COLOR',[0 => '红', 1=> '蓝', 2 => '绿', 3 => '黑']); // define定义常量数组,需要PHP7.0+
7、echo NAME; // 无需使用 “ $ ” 或者引号
8、const NAME = 'zhangsan'; // 合法,但是前提define已经定义了NAME,运行时会报错
9、const NAME_Add = 'zhangsan'; // 非法,定义的常量名必须全大写
10、const COLOR = [0 => '红', 1=> '蓝', 2 => '绿', 3 => '黑']; // const定义常量数组,需要PHP5、6+
```
常量定义后,不能更改或者取消。define可以判断一个常量是否定义,constant函数可以取出常量的值(效果通直接取值)。define和const的主要区别是define可以用在判断语句中,但是const不行。如果你需要灵活的方式定义常量,使用define,否则建议使用const定义常量。
PHP-函数
函数的定义以“ function ”关键字开头,后接函数名和参数,以大括号包含的函数体结束。
代码的定义形式为:
```
function demo($name,$age,...){
//函数...
}
```
函数名的要求同变量名,不能以数字开头,不能包含点、加减乘除等特殊符号和字符,但是可以使用中文命名,不同于变量,函数名不区分大小写。
函数的参数可以没有,也可以有多个。支持默认参数,但是默认参数后不可出现必须传值的参数。对于基本类型,参数默认按值传递,对象和资源默认引用传参。
函数体可以为空,也可以有多个语句。可以使用return进行返回,也可以不返回。如果函数没有返回值,则默认为NULL。
函数各种形式的实例:
1、function printName($name = 'World')
{
echo "Hello, $name!";
}
2、function printName2(array $names) // array参数约束,需要PHP5.1+
{
print_r($names);
}
3、function printName3(array $names, callable $filter) // callable参数约束,需要PHP5.4+
{
print_r(array_map($filter, $names));
}
4、function sum(...$args) // 可变参数数组,需要PHP5.6+
{
return array_sum($args);
}
5、function printName4(string $name = 'World') // int, float, bool参数类型提示,需要PHP7+
{
echo "Hello, $name!";
}
6、function getGreeting(string $name = 'World') : string // 返回类型声明,需要PHP7+
{
return "Hello, $name!";
}
7、function getGreeting2(string $name = null) : ?string // 可空返回类型声明,需要PHP7.1+
{
return !$name ? null : "Hello, $name!";
}
注意:如果限定参数和返回值是bool类型,应该使用bool而不是boolean,否则运行会出错。 PHP目前不支持重载。一种变相的重载实现方式是:以 …args定义函数参数,函数体根据参数的个数实现不同功能。
PHP-操作符
PHP支持常规算数运算符、赋值运算符、位运算符等。
各类运算符实例:
1、$a = 2; $b = 3;
echo $a (+ | - | * | / |% |**) $b; // 加减乘除、取模、指数
2、$c = $a + $b; // 赋值
3、$d = $a (&,|,^,<<,>>) $b; // 并、或、异或、左移、右移位运算
4、$e = ~$a; // 取反
5、echo $a (==|===|!=|<>|<|>|<=|>=|<=>) $b; // 比较运算符:相等、全等、不等、不等、小于、大于、小于等于、大于等于、太空符(需要PHP7+)
$str1 = 'Hello'; $str2 = 'World';
6、echo $str1 . ',' . $str2 . '!'; // . 作为字符串连接符
7、if ($a (|| , && , xor , and, or) !$b) {} // 逻辑运算符:或、并、异或、并、或、非
$arr1 = [1, 2]; $arr2 = [3, 4];
8、print_r($arr1 + $arr2); // 数组合并
9、var_dump($arr1 !=|!==|<>|==|=== $arr2); // 数组比较
10、var_dump($arr1 instanceof int); // instanceof操作符
11、@coun($arr1); //错误控制符@。当@加在函数调用前,函数抛出的错误将被忽略
12、var_dump(`ls -al`); // ``, 非单引号, shell执行符号
PHP-流程控制
PHP支持常见的分支判断、循环等流程控制。
几种流程控制示例:
1、分支判断
$array = range(0,10);
$len = count($array);
(1)单分支判断
if($len < 10){
echo '<10';
}
(2)多分支判断1
if($len <10){
echo '<10';
}else{
echo '10 <= length <=20';
}
(3) 多分支判断2
if($len > 20){
echo '>=20';
}elseif($len < 10){
echo ’<10‘;
}else{
echo '10 <= length <=20';
}
2、循环流程控制
(1) for循环
for($i=0;$i<=20;i++){
// 循环体...
}
(2)foreach() 循环
$array = array(1,2,3,4,5,6,7,...);
foreach($array as $key => $val){
// 循环体...
}
(3)while循环
$index = 0;
while($index <= $len){
if($index%2 == 0 ){
continue;
}
echo $array[$index];
++ $index;
if($index == 9){
break;
}
}
(4)do-while循环 // 无论条件是否成立,程序都进行循环一次
do{
echo $array[$index];
++$index;
}while($index < $len);
(5)switch循环
switch($len){
case:1:
....
break;
case 2:
....
break;
...
default:
break;
}
PHP的数据类型
PHP只是9种原始数据类型:
四种标量类型:
boolean 布尔类型
integer 整数类型
float 浮点数类型(也可称为 double)
string 字符串类型
三种复合类型:
array 数组
object 对象
callable 可调用类型
两种特殊类型:
NULL 空(无类型)
resource 资源
1、数组类型Array:
PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。由于数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的。
数组语法定义:
可以用 array() 语言结构来新建一个数组。它接受任意数量用逗号分隔的 键(key) => 值(value)对。PHP5.4版本后,可以使用[]代替array()进行定义。
数组定义实例:
(1)、$array = array(1,2,3,4,5,...);
(2)、$array = [1,2,3,4,5,6]; #PHP5.4+支持
2、字符串类型String:
一个字符串 string 就是由一系列的字符组成,其中每个字符等同于一个字节。这意味着 PHP 只能支持 256 的字符集,因此不支持 Unicode 。
字符串语法定义:
有4中语法定义模式,单引号、双引号、heredoc 语法结构、nowdoc 语法结构(自 PHP 5.3.0 +支持)
单引号模式:要在字符串中表达一个单引号“ ’ ”,需要使用反斜杠“ \ ”进行转义,要表达一个反斜线自身,则用两个反斜线“ \ ”,其它任何方式的反斜线都会被当成反斜线本身:也就是说如果想使用其它转义序列例如 “ \r ” 或者 “ \n ”,并不代表任何特殊含义,就单纯是这两个字符本身。单引号模式,字符串中的变量和特殊字符的转义序列将不会被替换
单引号定义实例:
```
echo 'string'; // 输出 string;
echo 'I \'m Tom'; // 输出 I'm Tom;
echo 'My name is $name'; // 输出 My name is $name *单引号字符串不会将变量进行转义*
```
双引号模式:字符串的内容被 “” 进行包含,PHP会对一些字符进行转义,和单引号字符串一样,转义任何其它字符都会导致反斜线被显示出来
双引号定义实例:
```
\n 换行(ASCII 字符集中的 LF 或 0x0A (10))
\r 回车(ASCII 字符集中的 CR 或 0x0D (13))
\t 水平制表符(ASCII 字符集中的 HT 或 0x09 (9))
\v 垂直制表符(ASCII 字符集中的 VT 或 0x0B (11))(自 PHP 5.2.5 起)
\e Escape(ASCII 字符集中的 ESC 或 0x1B (27))(自 PHP 5.4.0 起)
\f 换页(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起)
\\ 反斜线
\$ 美元标记
\" 双引号
\[0-7]{1,3} 符合该正则表达式序列的是一个以八进制方式来表达的字符
\x[0-9A-Fa-f]{1,2} 符合该正则表达式序列的是一个以十六进制方式来表达的字符
```
PHP变量解析:当字符串。用双引号或 heredoc 结构定义时,其中的变量将会被解析
这里共有两种语法规则:一种简单规则,一种复杂规则。简单的语法规则是最常用和最方便的,它可以用最少的代码在一个 string 中嵌入一个变量,一个 array 的值,或一个 object 的属性
1、简单语法:当 PHP 解析器遇到一个美元符号($)时,它会和其它很多解析器一样,去组合尽量多的标识以形成一个合法的变量名。可以用花括号来明确变量名的界线。
2、任何具有 string 表达的标量变量,数组单元或对象属性都可使用此语法。只需简单地像在 string 以外的地方那样写出表达式,然后用花括号 { 和 } 把它括起来即可。由于 { 无法被转义,只有 $ 紧挨着 { 时才会被识别。