## 基本语法
php的标记使用`<?php ?>` 也可以使用`<? ?>` (需要打开短标签) 建议使用前者
> 文件末尾的 PHP 代码段结束标记可以不要,有些情况下当使用 [include](http://php.net/manual/zh/function.include.php) 或者 [require](http://php.net/manual/zh/function.require.php) 时省略掉会更好些,这样不期望的空白符就不会出现在文件末尾,之后仍然可以输出响应标头。在使用输出缓冲时也很便利,就不会看到由包含文件生成的不期望的空白符
```php
<?php
echo "hello";
```
PHP 支持 C,C++ 和 Unix Shell 风格(Perl 风格)的注释
`#` 开头的注释 `// ` 开头的注释,` /**/` 段落注释
```php
<?php
// 行内注释
# 行内注释
/*
段落注释
*/
?>
```
## 数据类型
四种标量类型:
- [boolean](http://php.net/manual/zh/language.types.boolean.php)(布尔型)
- [integer](http://php.net/manual/zh/language.types.integer.php)(整型)
- [float](http://php.net/manual/zh/language.types.float.php)(浮点型,也称作 [double](http://php.net/manual/zh/language.types.float.php))
- [string](http://php.net/manual/zh/language.types.string.php)(字符串)
三种复合类型:
- [array](http://php.net/manual/zh/language.types.array.php)(数组)
- [object](http://php.net/manual/zh/language.types.object.php)(对象)
- [callable](http://php.net/manual/zh/language.types.callable.php)(可调用)
最后是两种特殊类型:
- [resource](http://php.net/manual/zh/language.types.resource.php)(资源)
- [NULL](http://php.net/manual/zh/language.types.null.php)(无类型)
### 1.布尔类型 Boolean
布尔类型只有true和false两个值
以下的值会认为是false。其他之外的都是true
- [布尔](http://php.net/manual/zh/language.types.boolean.php)值 **FALSE** 本身
- [整型](http://php.net/manual/zh/language.types.integer.php)值 0(零)
- [浮点型](http://php.net/manual/zh/language.types.float.php)值 0.0(零)
- 空[字符串](http://php.net/manual/zh/language.types.string.php),以及[字符串](http://php.net/manual/zh/language.types.string.php) "0"
- 不包括任何元素的[数组](http://php.net/manual/zh/language.types.array.php)
- 特殊类型 [NULL](http://php.net/manual/zh/language.types.null.php)(包括尚未赋值的变量)
- 从空标记生成的 [SimpleXML](http://php.net/manual/zh/ref.simplexml.php) 对象
```php
var_dump((bool)'false') //true #字符串false
var_dump((bool) false) //false #布尔值false
```
### 2. 整型int
整型值可以使用十进制,十六进制,八进制或二进制表示,前面可以加上可选的符号(- 或者 +)
自 PHP 4.4.0 和 PHP 5.0.5后,整型最大值可以用常量 **PHP_INT_MAX** 来表示,最小值可以在 PHP 7.0.0 及以后的版本中用常量 **PHP_INT_MIN**
```php
123
-123
0123 #八进制
0x123 #十六进制
```
给定的一个数超出了 [integer](http://php.net/manual/zh/language.types.integer.php) 的范围,将会被解释为 [float](http://php.net/manual/zh/language.types.float.php)。同样如果执行的运算结果超出了 [integer](http://php.net/manual/zh/language.types.integer.php) 范围,也会返回 [float](http://php.net/manual/zh/language.types.float.php)
从其他类型转换成整型
- 布尔值转整型 **false** 产生 0 **true** 产生 1
- 从浮点型转换 向下取整 0.5 转换成 0
- 字符串转整型
> 如果该字符串没有包含 '.','e' 或 'E' 并且其数字值在整型的范围之内(由 **PHP_INT_MAX** 所定义),该字符串将被当成 [integer](http://php.net/manual/zh/language.types.integer.php) 来取值。其它所有情况下都被作为 [float](http://php.net/manual/zh/language.types.float.php) 来取值。该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0(零)。合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 'e' 或 'E' 后面跟着一个或多个数字构成
```php
bob3+1 //1
3bob+1 //4
```
### 3. 浮点数float
浮点数,也就是我们说的小数。由于浮点数的精度有限。尽管取决于系统,PHP 通常使用 IEEE 754 双精度格式,则由于取整而导致的最大相对误差为 1.11e-16
**永远不要比较两个浮点数的值**
### 4.字符串string
字符串由一些字符组成。字符串有四种表示方法
- 单引号
单引号是最简单的表示方法。在C语言中 单个字符用单引号表示。单引号的变量不解析.表达一个单引号自身,需在它的前面加个反斜线(*\*)来转义
```php
$a = 'abc';
$b = '$a';//$a
$c = "$a"; //abc
```
- 双引号
双引号非转义任何其它字符都会导致反斜线被显示出来。\*\\{$var}* 中的反斜线还不会被显示出来。
- heredoc
heredoc 结构是一种提供一个开始标记和一个结束标记。方便书写大段的字符串。结束标记必须**顶格写**。
类似双引号。单引号不转义。变量解析
```php
<?php
$heredoc = <<<START
FDSFDSFS
SDFSDTHIS DDSFS
任意字符
SF
START
?>
```
- nowdoc
Nowdoc 结构是类似于单引号字符串的。Nowdoc 结构很象 heredoc 结构,但是 nowdoc 中不进行解析操作 nowdoc前需要加上单引号。
```php
<?php
$str = <<<'EOD'
Example of string
spanning multiple lines
using nowdoc syntax.
EOD;
```
string中的字符可以通过一个从 0 开始的下标,用类似 array结构中的方括号包含对应的数字来访问和修改
**字符串的链接**
字符串的连接使用.(点)
转成字符串
布尔值 true转成1 。false 转成 “”
数组array转成 "array".object总是被转换成字符串 *"Object"*,
### 5. 数组array
php中的数组和C语言中的数组还有区别。它是一种hash 的类型。通过key=>value.通过数组可以实现丰富的数据类型,如字典、列表、集合、栈等。
定义数组
```php
$arr = array(1,2,3);
//简写 php5.4+
$arr2 = [1,2,3];
$arr2[1];
$arr3 = ["key"=>"value"];
$arr3["key"];
```
PHP 将自动使用之前用过的最大 INT键名加上 1 作为新的键名.PHP 实际并不区分索引数组和关联数组。
### 6. 对象object
创建一个新的对象的时候,使用new 关键字
```
class obj {}
$a = new obj();
```
### 7.资源类型resource
资源类型是保持外部的一个引用。如数据库的链接,文件的句柄等。
```php
$fp = fopen("./a.log");//resource
```
### 8. NULL类型
当一个变量没有被赋值,那么该变量的值就是null。以下的情况是一个变量被认为是null
- 被赋值成null
- 未赋值
- 被unset
```php
$a = null // null
$b;//var_dump($b); null
$c = 1;
unset($c);//var_dump($c); null
```
### 9. 回调 callback
```php
function test(){
echo "echo";
}
call_user_function('test');
```
## 变量
php中的变量是以 `$` 开头的。变量名区分大小写。合法的变量名是字母或者下划线开头,后面跟着任意数量的字母,数字,或者下划线
在此所说的字母是 a-z,A-Z,以及 ASCII 字符从 127 到 255(*0x7f-0xff*)
变量默认总是传值赋值
```php
$a $_a $张三 // 合法的
$2aaa //非法的
$a = 123;
```
### 变量的作用域
在最外层定义的是全局变量。在全局都有效。在函数内部的成为局部变量。只有函数内部可以访问。使用static修饰的变量,是静态变量。静态变量不会被销毁。只有等程序运行结束后才被回收.
**$this 是一个特殊的变量。不能定位成this变量**
```php
<?php
$a = 123;//全局
function f1(){
$b = 234;//局部变量
}
echo $b;//未定义
function f2(){
global $a;
echo $a;
}
f2();// 123;
function s(){
static $c = 1;
$c++;
}
s();//2
s();//3
?>
```
确定变量的类型。php提供了以下函数
```php
gettype() is_bool() is_string() is_object() is_array();
```
## 常量
常量一般是定义之后不能再更改的变量。传统上使用大写字母来定义常量.合法的常量命名跟变量一致。只是不需要加 `$` 符号。
```php
IS_DEBUG;
define("IS_DEBUG",0);
```
#### 魔术常量
魔术常量是php内置的。可能跟着代码的变化而变化。一般魔术常量 以双下划线开始 双下划线结束。
```php
__LINE__
__DIR__
__FILE__
__CLASS__
```
## 表达式
最精确的定义一个表达式的方式就是“任何有值的东西”。最简单的表达式。常量和变量。
```php
$a;
;// 空表达式
$a = 1;//赋值表达式
function f(){} //函数表达式
$a>1 //比较表达式
```
## 运算符
运算符就是通过一个或者多个符号产生另外一个结果的符号。常见的有加减乘除等
### 运算符优先级
运算符是有优先级的,优先级的先结合。
| 结合方向 | 运算符 | 附加信息 |
| ----- | ---------------------------------------- | ---------------------------------------- |
| 无 | clone new | [clone](http://php.net/manual/zh/language.oop5.cloning.php) 和 [new](http://php.net/manual/zh/language.oop5.basic.php#language.oop5.basic.new) |
| 左 | *[* | [array()](http://php.net/manual/zh/function.array.php) |
| 右 | **\** | [算术运算符](http://php.net/manual/zh/language.operators.arithmetic.php) |
| 右 | *++* *--* *~* *(int)* *(float)* *(string)* *(array)* *(object)* *(bool)* *@* | [类型](http://php.net/manual/zh/language.types.php)和[递增/递减](http://php.net/manual/zh/language.operators.increment.php) |
| 无 | *instanceof* | [类型](http://php.net/manual/zh/language.types.php) |
| 右 | *!* | [逻辑运算符](http://php.net/manual/zh/language.operators.logical.php) |
| 左 | *** */* *%* | [算术运算符](http://php.net/manual/zh/language.operators.arithmetic.php) |
| 左 | *+* *-* *.* | [算术运算符](http://php.net/manual/zh/language.operators.arithmetic.php)和[字符串运算符](http://php.net/manual/zh/language.operators.string.php) |
| 左 | *<<* *>>* | [位运算符](http://php.net/manual/zh/language.operators.bitwise.php) |
| 无 | *<* *<=* *>* *>=* | [比较运算符](http://php.net/manual/zh/language.operators.comparison.php) |
| 无 | *==* *!=* *===* *!==* *<>* *<=>* | [比较运算符](http://php.net/manual/zh/language.operators.comparison.php) |
| 左 | *&* | [位运算符](http://php.net/manual/zh/language.operators.bitwise.php)和[引用](http://php.net/manual/zh/language.references.php) |
| 左 | *^* | [位运算符](http://php.net/manual/zh/language.operators.bitwise.php) |
| 左 | *\|* | [位运算符](http://php.net/manual/zh/language.operators.bitwise.php) |
| 左 | *&&* | [逻辑运算符](http://php.net/manual/zh/language.operators.logical.php) |
| 左 | *\|\|* | [逻辑运算符](http://php.net/manual/zh/language.operators.logical.php) |
| 左 | *??* | [比较运算符](http://php.net/manual/zh/language.operators.comparison.php) |
| 左 | *? :* | [ternary](http://php.net/manual/zh/language.operators.comparison.php#language.operators.comparison.ternary) |
| right | *=* *+=* *-=* **=* **\*=* */=* *.=* *%=* *&=* *\|=* *^=* *<<=* *>>=* | [赋值运算符](http://php.net/manual/zh/language.operators.assignment.php) |
| 左 | *and* | [逻辑运算符](http://php.net/manual/zh/language.operators.logical.php) |
| 左 | *xor* | [逻辑运算符](http://php.net/manual/zh/language.operators.logical.php) |
| 左 | *or* | [逻辑运算符](http://php.net/manual/zh/language.operators.logical.php) |
```php
3+2*4// 11
5/3 // 1.33333
5%2 //2
```
- 除法运算符总是返回浮点数.
- 取模运算符的操作数在运算之前都会转换成整数(除去小数部分)
### 递增、递减
| ++$a | 前加 | $a 的值加一,然后返回 $a。 |
| ---- | ---- | ------------------ |
| $a++ | 后加 | 返回 $a,然后将 $a 的值加一。 |
| --$a | 前减 | $a 的值减一, 然后返回 $a。 |
| $a-- | 后减 | 返回 $a,然后将 $a 的值减一。 |
```php
$a = 1;
echo $a++;//1
$b = 1;
echo ++$b;
$c = 'A';
echo ++$c;//B
$bool = false;
$bool++;
var_dump($bool); //false;
```
- 处理字符变量的算数运算时,PHP 沿袭了 Perl 的习惯,而非 C 的
- 字符变量只能递增,不能递减,并且只支持纯字母(a-z 和 A-Z)
- **递增或递减布尔值没有效果。**
### 位运算
| **\$a \&\ $b** | And(按位与) | 将把 $a 和 $b 中都为 1 的位设为 1。 |
| -------------- | --------------- | ---------------------------------- |
| **$a \|\$b** | Or(按位或) | 将把 $a 和 $b 中任何一个为 1 的位设为 1。 |
| **$a ^ \$b** | Xor(按位异或) | 将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。 |
| **~ \$a** | Not(按位取反) | 将 $a 中为 0 的位设为 1,反之亦然。 |
| **\$a << \$b** | Shift left(左移) | 将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。 |
| **\$a >> \$b** | Shift right(右移) | 将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。 |
### 比较运算符
| $a == $b | 等于 | **TRUE**,如果类型转换后 $a 等于 $b。 |
| --------------- | :-----------: | :--------------------------------------- |
| $a === $b | 全等 | **TRUE**,如果 $a 等于 $b,并且它们的类型也相同。 |
| $a != $b | 不等 | **TRUE**,如果类型转换后 $a 不等于 $b。 |
| $a <> $b | 不等 | **TRUE**,如果类型转换后 $a 不等于 $b。 |
| $a !== $b | 不全等 | **TRUE**,如果 $a 不等于 $b,或者它们的类型不同。 |
| $a < $b | 小与 | **TRUE**,如果 $a 严格小于 $b。 |
| $a > $b | 大于 | **TRUE**,如果 $a 严格大于 $b。 |
| $a <= $b | 小于等于 | **TRUE**,如果 $a 小于或者等于 $b。 |
| $a >= $b | 大于等于 | **TRUE**,如果 $a 大于或者等于 $b。 |
| $a <=> $b | 太空船运算符(组合比较符) | 当$a小于、等于、大于$b时 分别返回一个小于、等于、大于0的[integer](http://php.net/manual/zh/language.types.integer.php) 值。 PHP7开始提供. |
| $a ?? $b ?? \$c | NULL 合并操作符 | 从左往右第一个存在且不为 **NULL** 的操作数。如果都没有定义且不为 **NULL**,则返回 **NULL**。PHP7开始提供。 |
如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被[转换为**数值**]并且比较按照数值来进行.
由于浮点数 **float**的内部表达方式,不应比较两个浮点数**float**是否相等。
```php
$a = 'abc';
$a == 1;//false
$a = 0;
$b = 'abc';
$a == $b;//true;
```
### 执行运算符
PHP 支持一个执行运算符:反引号(``)。注意这不是单引号!PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回
```php
`ls /home/`
```
### 逻辑运算符
| \$a and $b | And(逻辑与) | **TRUE**,如果 $a 和 $b 都为 **TRUE**。 |
| ------------ | --------- | --------------------------------------- |
| \$a or \$b | Or(逻辑或) | **TRUE**,如果 $a 或 $b 任一为 **TRUE**。 |
| \$a xor \$b | Xor(逻辑异或) | **TRUE**,如果 $a 或 $b 任一为 **TRUE**,但不同时是。 |
| ! $a | Not(逻辑非) | **TRUE**,如果 $a 不为 **TRUE**。 |
| \$a && $b | And(逻辑与) | **TRUE**,如果 $a 和 $b 都为 **TRUE**。 |
| \$a \|\| \$b | Or(逻辑或) | **TRUE**,如果 $a 或 $b 任一为 **TRUE**。 |
```php
$a = (true || false);
```
### 字符串连接符
字符串连接符号 点(.)
```php
$a = 1;
$b = 222
echo $a . $b; //1222
```
### 类型运算符
*instanceof* 用于确定一个 PHP 变量是否属于某一类
```php
$c = new C();
$c instanceof C;
```
### if else
```php
if($a) {
}
if($a == 1) {
} else{
}
if($a == 1) {
echo '1';
}else if($a == 2) {
echo '2';
}else{
echo 'other';
}
#简写 不推荐
if ($a == 1):
echo "1";
else:
echo "else";
endif;
```
### switch
*switch* 语句类似于具有同一个表达式的一系列 *if* 语句。很多场合下需要把同一个变量(或表达式)与很多不同的值比较,并根据它等于哪个值来执行不同的代码.**每个case分支的break不能省去,如果省去,则会往下执行**
```php
if($a == 1) {
echo '1';
}else if($a == 2) {
echo '2';
}else{
echo 'other';
}
# swtich
switch ($a) {
case 1:
echo '1';
break;
case 2:
echo '2';
break;
default:
echo 'othre';
break;
}
```
### while 、do while
*while* 循环是 PHP 中最简单的循环类型.只要表达式是true是一直执行,直到条件为false为止.
*do-while* 循环和 *while* 循环非常相似,区别在于表达式的值是在每次循环结束时检查而不是开始时。和一般的 *while* 循环主要的区别是 *do-while*的循环语句保证会执行一次(表达式的真值在每次循环结束后检查)
```php
$a = 10;
while($a>1) {
echo $a--;//1098765432
}
#do while
$b = 1;
do{
echo $b; //1
}while($b>1)
```
### for、foreach
*for* 循环是 PHP 中最复杂的循环结构。它的行为和 C 语言的相似
```
for (expr1; expr2; expr3)
statement
```
第一个表达式(expr1)在循环开始前无条件求值(并执行)一次。
expr2 在每次循环开始前求值。如果值为 **TRUE**,则继续循环,执行嵌套的循环语句。如果值为 **FALSE**,则终止循环。
expr3 在每次循环之后被求值(并执行)。
```php
$people = Array(
Array('name' => 'Kalle', 'salt' => 856412),
Array('name' => 'Pierre', 'salt' => 215863)
);
for($i = 0; $i < count($people); ++$i)
{
$people[$i]['salt'] = rand(000000, 999999);
}
//每次都计算count 代码执行慢 可以使用中间变量
$count = count($people);
for($i = 0; $i < $count; ++$i)
{
$people[$i]['salt'] = rand(000000, 999999);
}
```
*foreach* 语法结构提供了遍历数组的简单方式。*foreach* 仅能够应用于数组和对象
```php
foreach($array as $key=>$value) {
}
# 简写
foreach($array as $key=>$value):
endforeach;
#引用修改 数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。
foreach (array(1, 2, 3, 4) as &$value) {
$value = $value * 2;
}
unset($value);
```
### break 、continue
*break* 结束当前 *for*,*foreach*,*while*,*do-while* 或者 *switch* 结构的执行。break后面可以跟一个数字。表示跳出几重循环
```php
for($i = 0; $i < 10; $i++) {
if($i==5){
break;
}
echo $i;
}
//01234
for($i=0;$i<10;$i++) {
for($j=0;$j<5;$j++) {
if($j == 2) {
break 2; #跳出两层循环
}
}
}
```
***continue*** 在循环结构用用来跳过本次循环中剩余的代码并在条件求值为真时开始执行下一次循环
***continue*** 接受一个可选的数字参数来决定跳过几重循环到循环结尾。默认值是 *1*,即跳到当前循环末尾
```php
for($i = 0; $i < 10; $i++) {
if($i==5){
continue;
}
echo $i;
}
// 012346789
```
### declare
*declare* 结构用来设定一段代码的执行指令。*declare* 的语法和其它流程控制结构相似
目前只认识两个指令:*ticks* encoding
Tick(时钟周期)是一个在 *declare* 代码段中解释器每执行 N 条可计时的低级语句就会发生的事件。N 的值是在 *declare* 中的 *directive* 部分用`ticks=N` 来指定的
encoding 指令来对每段脚本指定其编码方式。
```php
declare(ticks=1);
// A function called on each tick event
function tick_handler()
{
echo "tick_handler() called\n";
}
register_tick_function('tick_handler');
$a = 1;
if ($a > 0) {
$a += 2;
print($a);
}
declare(encoding='ISO-8859-1');
```
### return
在函数中使用return 将结束函数的执行。
**return** 是语言结构而不是函数,因此其参数没有必要用括号将其括起来。通常都不用括号,实际上也应该不用,这样可以降低 PHP 的负担。
```php
function f(){
return 1;
echo '11';//不会执行
}
#a.php
<?php
include("b.php");
echo "a";
?>
#b.php
<?php
echo "b";
return;
?>
// ba
```
### include 、require
include(path) 会按照给定的参数 进行查找,如果没有找到就到include_path中查找。如果还没有找到,那么就会抛出一个警告。
如果定义了路径——不管是绝对路径(在 Windows 下以盘符或者 *\* 开头,在 Unix/Linux 下以 */* 开头)还是当前目录的相对路径。include_path就会被忽略。
require 和include查找文件基本上一致。只是require会抛出一个error错误终止代码的执行。
require 和include是一个语言构造器而不是一个函数
```php
include 'a.php';
echo "hello";
# 会输出hello
require 'a.php';
echo "hello";
# 抛出一个error hello不会输出。
```
### include_once 、require_once
*include_once* 、require_once 语句在脚本执行期间包含并运行指定文件.如果该文件中已经被包含过,则不会再次包含
include_once 会抛出warning 。require_once 会抛出error
### goto
goto操作符并不常用。用来跳转程序的一个位置。目标位置只能位于同一个文件和作用域
无法跳出一个函数或类方法,也无法跳入到另一个函数。也无法跳入到任何循环或者 switch 结构中
```php
<?php
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
if($j==17) goto end;
}
}
echo "i = $i";
end:
echo 'j hit 17';
?>
```
## 函数
函数是将特定的代码放到一个区间里,方便下次的调用。
函数名和 PHP 中的其它标识符命名规则相同。有效的函数名以字母或下划线打头,后面跟字母,数字或下划线。
PHP 中的所有函数和类都具有全局作用域。PHP 不支持函数重载,也不可能取消定义或者重定义已声明的函数。
函数名是大小写无关的
要避免递归函数/方法调用超过 100-200 层,因为可能会使堆栈崩溃从而使当前脚本终止
```php
function 函数名字(参数){
//函数体
}
```
### 函数参数
可以通过参数传递外部的信息到函数内部。
支持引用传递参数、默认参数
```php
$a = 100;
function fn($arg) {
echo $arg;
}
fn($a);//100
#引用传递
function fn(&$arg){
$arg = 10;
}
fn($a);
echo $a;//10;
# 默认值
$a = 100;
function fn($arg = 10){
echo $arg;
}
fn($a);//100
fn();//10
```
#### **类型声明**
类型声明允许函数在调用时要求参数为特定类型。 如果给出的值类型不对,那么将会产生一个错误
目前支持的类型有类名、接口名、self、array、callable、bool、int、float、string
```php
function fn(int $a){
echo $a;
}
$c = "hello";
fn($c);//error
```
#### **严格类型**
默认情况下,如果能做到的话,PHP将会强迫错误类型的值转为函数期望的标量类型
但是在严格模式下,php不会转换。
```php
declare(strict_types=1);
function fn(int $a){
echo $a;
}
$c = '1';//string
fn($c);//
```
#### **可变参数**
PHP 在用户自定义函数中支持可变数量的参数列表。在 PHP 5.6 及以上的版本中,由 *...* 语法实现
```php
function fn(...$arg){
foreach($arg as $v){
echo $v;
}
}
fn(1,2,3,4);
```
### 返回值
函数的返回值可以通过return 返回。
```php
function fn(){
return "hello";
}
```
#### 返回值类型
可以限制返回值的类型
```php
declare(strict_types=1);
function($a):float {
return 1.1;
}
```
### 可变函数
PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数
```php
function f(){
echo "1";
}
$a = 'f';
$a();//1
```
### 匿名函数
匿名函数(Anonymous functions),也叫闭包函数(*closures*),允许 临时创建一个没有指定名称的函数。最经常用作回调函数 参数的值。当然,也有其它应用的情况。
闭包可以从父作用域中继承变量。 任何此类变量都应该用 *use* 语言结构传递进去
```php
(function (){
echo '匿名函数';
})();
#传递参数
$a = function ($arg) {
echo $arg;
}
$arg = 'hello';
$a($arg);//hello;
# 传递外部作用域变量
$arg = 'arg';
$f = function() use($arg){
echo $arg;
}
$f();
```
- PC
- IO模型
- Inode介绍
- Linux
- Linux基本操作命令
- Linux网络相关命令
- Crontab计划任务
- Shell
- Sed命令
- Awk命令
- LAMP/LNMP
- PHP
- 基本语法
- 面向对象
- 错误和异常处理
- 命名空间
- PHP7
- 正则表达式
- Hashtable
- 变量的内部实现
- PHP-FPM
- PHP运行原理
- swoole
- mysql
- SQL标准
- mysql三范式
- 存储引擎
- Mysql事务
- Mysql索引
- Mysql优化
- Explain
- MySQL索引原理及慢查询优化
- MongoDb
- 计算机网络
- IP协议
- TCP(传输控制协议)
- UDP(用户数据报协议)
- HTTP 协议
- HTTPS
- HTTP的基本优化
- Websocket协议
- 版本控制器
- Git
- Svn
- 数据结构
- 数组
- 链表
- 算法