PHP文档的一些笔记

1.php短标记

PHP 也允许使用短标记 ,但不鼓励使用。只有通过激活 php.ini 中的 short_open_tag 配置指令或者在编译 PHP 时使用了配置选项 –enable-short-tags 时才能使用短标记。
短标记方式 开始<? 和 结束?> (不推荐使用) 需要在php.ini文件中开启
SCRIPT风格 开始<script language="php"> 结束 </script> (不推荐使用) 不需要开启 可直接使用

2.php末尾可以不加结束标记

1
如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记。这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,而脚本中此时并无输出的意图。

??wtf什么玩意
查了一下原因

1
PHP 解释器碰到 ?> 结束标记时就简单地将其后内容原样输出,直到碰到下一个开始标记。PHP 会在输出时自动删除其结束符 ?> 后的一个换行。该功能主要是针对在一个页面中嵌入多段 PHP 代码或者包含了无实质性输出的 PHP 文件而设计,与此同时也造成了一些疑惑。如果需要在 PHP 结束符 ?> 之后输出换行的话,可以在其后加一个空格,或者在最后的一个 echo/print 语句中加入一个换行。这些影响最多的时候应该是在使用 include 和 require的时候

3.指令分隔符是否需要

1
同 C 或 Perl 一样,PHP 需要在每个语句后用分号结束指令。一段 PHP 代码中的结束标记隐含表示了一个分号;在一个 PHP 代码段中的最后一行可以不用分号结束。如果后面还有新行,则代码段的结束标记包含了行结束。 

4.注释

1
2
3
4
5
6
7
<?php
echo "This is a test"; // This is a one-line c++ style comment
/* This is a multi line comment
yet another line of comment */
echo "This is yet another test";
echo 'One Final Test'; # This is a one-line shell-style comment
?>

5.类型

PHP 支持 9 种原始数据类型。
四种标量类型:
◦ boolean(布尔型)
◦ integer(整型)
◦ float(浮点型,也称作 double)
◦ string(字符串)

三种复合类型:
◦ array(数组)
◦ object(对象)
◦ callable(可调用)

最后是两种特殊类型:
◦ resource(资源)
◦ NULL(无类型)

还有一些伪类型:
◦ mixed(混合类型)
◦ number(数字类型)
◦ callback(回调类型,又称为 callable)
◦ array|object(数组 | 对象类型)
◦ void (无类型)

6.一大堆布尔值

布尔值
要明确地将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转换。但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制结构需要一个 boolean 参数时,该值会被自动转换。

当转换为 boolean 时,以下值被认为是 FALSE:
◦ 布尔值 FALSE 本身
◦ 整型值 0(零)
◦ 浮点型值 0.0(零)
◦ 空字符串,以及字符串 “0”
◦ 不包括任何元素的数组
◦ 特殊类型 NULL(包括尚未赋值的变量)
◦ 从空标记生成的 SimpleXML 对象

所有其它值都被认为是 TRUE(包括任何资源 和 NAN)。

1
2
3
4
5
6
7
8
9
10
<?php
var_dump((bool) ""); // bool(false)
var_dump((bool) 1); // bool(true)
var_dump((bool) -2); // bool(true)
var_dump((bool) "foo"); // bool(true)
var_dump((bool) 2.3e5); // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array()); // bool(false)
var_dump((bool) "false"); // bool(true)
?>

7.数值进制

Warning
PHP 7 以前的版本里,如果向八进制数传递了一个非法数字(即 8 或 9),则后面其余数字会被忽略。PHP 7 以后,会产生 Parse Error。

8.NaN

某些数学运算会产生一个由常量 NAN 所代表的结果。此结果代表着一个在浮点数运算中未定义或不可表述的值。任何拿此值与其它任何值(除了 TRUE)进行的松散或严格比较的结果都是 FALSE。

由于 NAN 代表着任何不同值,不应拿 NAN 去和其它值进行比较,包括其自身,应该用 is_nan() 来检查。

9.数组

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
);

// 自 PHP 5.4 起
$array = [
"foo" => "bar",
"bar" => "foo",
];
?>

没有键名的索引数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$array = array("foo", "bar", "hallo", "world");
var_dump($array);
?>
array(4) {
[0]=>
string(3) "foo"
[1]=>
string(3) "bar"
[2]=>
string(5) "hallo"
[3]=>
string(5) "world"
}

10.Object 对象

1
2
3
4
5
6
7
8
9
10
11
12
<?php
class foo
{
function do_foo()
{
echo "Doing foo.";
}
}

$bar = new foo;
$bar->do_foo();
?>

11.引用赋值

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$foo = 25;
$bar = &$foo; // 合法的赋值
$bar = &(24 * 7); // 非法; 引用没有名字的表达式

function test()
{
return 25;
}

$bar = &test(); // 非法
?>

使用引用赋值,简单地将一个 & 符号加到将要赋值的变量前(源变量)。
只有有名字的变量才可以引用赋值。

12.global 关键字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$a = 1;
$b = 2;

function Sum()
{
global $a, $b;

$b = $a + $b;
}

Sum();
echo $b;
?>
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$a = 1;
$b = 2;

function Sum()
{
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}

Sum();
echo $b;
?>

13.可变变量

有时候使用可变变量名是很方便的。就是说,一个变量的变量名可以动态的设置和使用。一个普通的变量通过声明来设置,例如:

1
2
3
<?php
$a = 'hello';
?>

一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。在上面的例子中 hello 使用了两个美元符号($)以后,就可以作为一个可变变量的变量了。例如:

1
2
3
<?php
$$a = 'world';
?>

这时,两个变量都被定义了:$a 的内容是”hello”并且 $hello 的内容是”world”。因此,以下语句:

1
2
3
<?php
echo "$a ${$a}";
?>

与以下语句输出完全相同的结果:

1
2
3
<?php
echo "$a $hello";
?>

它们都会输出:hello world。
Warning
注意,在 PHP 的函数和类的方法中,超全局变量不能用作可变变量。$this 变量也是一个特殊变量,不能被动态引用。
精彩的代码

1
2
3
4
5
6
7
8
9
10
11
$a         = "We";     // $a will echo "We" .. and "We" will take $We;
$We = "are"; // $$a will echo "are" .. and "are" will take $are;
$are = "love"; // $$$a will echo "love" .. and "love" will take $love;
$love = "php"; // $$$$a will echo "php" .. and "php" will take $php;
$php = "lang"; // $$$$$a will echo "lang" .. and "lang" will not take any variables;

echo $a; //Returns We [1]
echo $$a; //Returns are [2]
echo $$$a; //Returns love [3]
echo $$$$a; //Returns php [4]
echo $$$$$a; //Returns lang [5]

14.魔术常量

几个 PHP 的”魔术常量”名称 说明
__LINE__ 文件中的当前行号。
__FILE__ 文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP 4.0.2 起,FILE 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。
__DIR__ 文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(FILE)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增) =
__FUNCTION__ 函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
__CLASS__ 类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起 CLASS 对 trait 也起作用。当用在 trait 方法中时,CLASS 是调用 trait 方法的类的名字。
__TRAIT__ Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如 Foo\Bar)。
__METHOD__ 类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
__NAMESPACE__ 当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。

15.错误控制运算符

PHP 支持一个错误控制运算符:@。当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。

16.执行运算符

PHP 支持一个执行运算符:反引号(``)。注意这不是单引号!PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符”"的效果与函数 shell_exec() 相同。
$output"; ?>
`
反引号运算符在激活了安全模式或者关闭了 shell_exec() 时是无效的。

17.字符串运算符

有两个字符串(string)运算符。第一个是连接运算符(”.”),它返回其左右参数连接后的字符串。第二个是连接赋值运算符(”.=”),它将右边参数附加到左边的参数之后。更多信息见赋值运算符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$a = "Hello ";
$b = $a . "World!"; // now $b contains "Hello World!"

$a = "Hello ";
$a .= "World!"; // now $a contains "Hello World!"
?>
If you attempt to add numbers with a concatenation operator, your result will be the result of those numbers as strings.

<?php

echo "thr"."ee"; //prints the string "three"
echo "twe" . "lve"; //prints the string "twelve"
echo 1 . 2; //prints the string "12"
echo 1.2; //prints the number 1.2
echo 1+2; //prints the number 3

?>

18.类型运算符

instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例:

Example #1 对类使用 instanceof

1
2
3
4
5
6
7
8
9
10
11
12
13
14

<?php
class MyClass
{
}

class NotMyClass
{
}
$a = new MyClass;

var_dump($a instanceof MyClass);
var_dump($a instanceof NotMyClass);
?>

以上例程会输出:

1
2
bool(true)
bool(false)

instanceof 也可用来确定一个变量是不是继承自某一父类的子类的实例

19.foreach

foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。有两种语法:

1
2
3
4
foreach (array_expression as $value)
statement
foreach (array_expression as $key => $value)
statement

20.可变函数

可变函数

PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途。

1
2
3
4
5
6
7
8
9
10
11
12
<?php

// 使用 echo 的包装函数
function echoit($string)
{
echo $string;
}


$func = 'echoit';
$func('test'); // This calls echoit()
?>

21. 匿名函数

1
2
3
4
5
6
7
8
9
<?php
$greet = function($name)
{
printf("Hello %s\r\n", $name);
};

$greet('World');
$greet('PHP');
?>