读《PHP 手册》有感
语言参考
基本语法
PHP标记
PHP 开始和结束标记有四种
当解析一个文件时,PHP 会寻找起始和结束标记,也就是<?php
和?>
<script language="php">
echo 'some editors (like FrontPage) don\'t
like processing instructions';
</script>
PHP 7.0.0
以后失效
PHP也允许使用短标记<?
和?>
,但不鼓励使用。只有通过激活php.ini
中的short_open_tag
配置指令或者在编译PHP
时使用了配置选项--enable-short-tags
时才能使用短标记,可以使用<?=$_?>
输出变量
自 PHP 5.4 起,短格式的 echo 标记 <?= 总会被识别并且合法,而不管 short_open_tag 的设置是什么。
<% echo 'You may optionally use ASP-style tags'; %>
ASP
风格标记仅在通过php.ini
配置文件中的指令asp_tags
打开后才可用。
指令分隔符
一段 PHP 代码中的结束标记隐含表示了一个分号;
在一个 PHP 代码段中的最后一行可以不用分号结束。如果后面还有新行,则代码段的结束标记包含了行结束。
注释
单行注释//
或#
块注释/* */
,不可嵌套
类型
Boolean
当转换为 boolean 时,以下值被认为是 FALSE:
- 布尔值 FALSE 本身
- 整型值 0(零)
- 浮点型值 0.0(零)
- 空字符串,以及字符串 "0"
- 不包括任何元素的数组
- 特殊类型 NULL(包括尚未赋值的变量)
- 从空标记生成的 SimpleXML 对象
评论区:
<?php
$x=TRUE;
$y=FALSE;
$z=$y OR $x;
//$z==FALSE,因为OR的优先级低于=
?>
Integer
decimal : [1-9][0-9]*
| 0
hexadecimal : 0[xX][0-9a-fA-F]+
octal : 0[0-7]+
binary : 0b[01]+
integer : [+-]?decimal
| [+-]?hexadecimal
| [+-]?octal
| [+-]?binary
Warning 绝不要将未知的分数强制转换为 integer,这样有时会导致不可预料的结果。
<?php
echo (int) ( (0.1+0.7) * 10 ); // 显示 7!
?>
要明确地将一个值转换为integer
,用(int)
或(integer)
强制转换。不过大多数情况下都不需要强制转换,因为当运算符,函数或流程控制需要一个 integer 参数时,值会自动转换。还可以通过函数intval()
来将一个值转换成整型。
成功时返回var
的integer
值,失败时返回0
。 空的array
返回0
,非空的array
返回1
。
最大的值取决于操作系统。 32位系统最大带符号的integer
范围是-2147483648
到2147483647
。举例,在这样的系统上,intval('1000000000000')
会返回2147483647
。64位系统上,最大带符号的integer
值是9223372036854775807
。
字符串有可能返回0
,虽然取决于字符串最左侧的字符。使用整型转换的共同规则。
Float
LNUM [0-9]+
DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM})
String
Note: string 也可用花括号访问,比如 $str
字符串转换为数值:
如果该字符串没有包含.
,e
或E
并且其数字值在整型的范围之内(由PHP_INT_MAX
所定义),该字符串将被当成integer
来取值。其它所有情况下都被作为float
来取值。
该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0(零)。合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 'e' 或 'E' 后面跟着一个或多个数字构成。
PS: 当精度在0.100000000000001时,将该数字转成String时会得到"0.1"
Array
array( key => value
, ...
)
// 键(key)可是是一个整数 integer 或字符串 string
// 值(value)可以是任意类型的值
此外 key 会有如下的强制转换:
- 包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。
- 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
- 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
- Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。
- 数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。
如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。
<?php
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
?>
// array(1) {
// [1]=>
// string(1) "d"
// }
如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。
如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值加上 1(但是最小为 0)。如果当前还没有整数索引,则键名将为 0。
注意这里所使用的最大整数键名不一定当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行了
<?php
// 创建一个简单的数组
$array = array(1, 2, 3, 4, 5);
print_r($array);
// 现在删除其中的所有元素,但保持数组本身不变:
foreach ($array as $i => $value) {
unset($array[$i]);
}
print_r($array);
// 添加一个单元(注意新的键名是 5,而不是你可能以为的 0)
$array[] = 6;
print_r($array);
函数
PHP 不支持函数重载,也不可能取消定义或者重定义已声明的函数。
从 A 到 Z 的 ASCII 函数名是大小写无关
PS: PHP 7.4支持箭头函数了
预定义变量
$_GET
GET
是通过urldecode()
传递的。
$_POST
当HTTP POST
请求的Content-Type
是application/x-www-form-urlencoded
或multipart/form-data
时,会将变量以关联数组形式传入当前脚本。
$_REQUEST
默认情况下包含了$_GET
,$_POST
和$_COOKIE
的数组。
Note: 由于 $_REQUEST 中的变量通过 GET,POST 和 COOKIE 输入机制传递给脚本文件,因此可以被远程用户篡改而并不可信。这个数组的项目及其顺序依赖于 PHP 的 variables_order 指令的配置。
默认是EGPCS
,可以被request_order
覆写,基本都是GP
,这意味着如果$_POST
和$_GET
有相同键的话,$_REQUEST
中$_POST
会覆盖$_GET
。
$_REQUEST
中的数据是复制过去的,并不是引用
PS: GET或POST传递的键值中存在某些字符时,后台获取到的键名中会将这些字符替换为_
The full list of field-name characters that PHP converts to _ (underscore) is the following (not just dot):
chr(32) ( ) (space)
chr(46) (.) (dot)
chr(91) ([) (open square bracket)
chr(128) - chr(159) (various)
cookie中
和.
也是如此
支持的协议和封装协议
Note: 用于描述一个封装协议的 URL 语法仅支持 scheme://... 的语法。 scheme:/ 和 scheme: 语法是不支持的。
file://
— 访问本地文件系统http://
— 访问 HTTP(s) 网址ftp://
— 访问 FTP(s) URLsphp://
— 访问各个输入/输出流(I/O streams)php://input
是个可以访问请求的原始数据的只读流php://filter
是一种元封装器,设计用于数据流打开时的筛选过滤应用
zlib://
— 压缩流zip://archive.zip#dir/file.txt
data://
— 数据(RFC 2397)data://text/plain;base64,SSBsb3ZlIFBIUAo=
glob://
— 查找匹配的文件路径模式phar://
— PHP 归档phar://my.phar/somefile.php
ssh2://
— Secure Shell 2rar://
— RARogg://
— 音频流expect://
— 处理交互式的流