读《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()来将一个值转换成整型。

成功时返回varinteger值,失败时返回0。 空的array返回0,非空的array返回1

最大的值取决于操作系统。 32位系统最大带符号的integer范围是-21474836482147483647。举例,在这样的系统上,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

字符串转换为数值:

如果该字符串没有包含.eE并且其数字值在整型的范围之内(由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-Typeapplication/x-www-form-urlencodedmultipart/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) URLs
  • php:// — 访问各个输入/输出流(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 2
  • rar:// — RAR
  • ogg:// — 音频流
  • expect:// — 处理交互式的流
posted @ 2020-08-17 20:51  MustaphaMond  阅读(347)  评论(0编辑  收藏  举报