惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
爱范儿
爱范儿
H
Help Net Security
V
Visual Studio Blog
J
Java Code Geeks
Stack Overflow Blog
Stack Overflow Blog
Microsoft Security Blog
Microsoft Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
MyScale Blog
MyScale Blog
The Cloudflare Blog
Martin Fowler
Martin Fowler
D
Docker
腾讯CDC
F
Fortinet All Blogs
雷峰网
雷峰网
GbyAI
GbyAI
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Blog — PlanetScale
Blog — PlanetScale
Engineering at Meta
Engineering at Meta
博客园 - 聂微东
博客园 - 叶小钗

博客园 - Mark Jiao

调试Java程序持续占cpu问题 Freemarker notes | Freemarker学习笔记 Spring Struts Hibernate trouble shooting | 一些问题的记载 MySQL 性能调优之查询优化 Tomcat性能调优 | Tomcat Performance Tuning Tomcat配置、管理和问题解决 | Tomcat Configuration, Manangement and Trouble Shooting SWT Browser & XULRunner Windows应用安装制作工具调查报告 CentOS Configuration | CentOS配置 命令行加载IE ActiveX插件 Java那些事儿 互联网技术要考虑的事情 Parameterized Testing | 参数化测试 Git usage | Git 使用 Introduce products I worked on | 介绍一下我做过的产品 PHPUnit manual note | PHPUnit手册笔记 Globalization, Localization, Internationalization and Translation HTTP 超文本传输协议 Design Patter
PHP manual notes | PHP手册笔记
Mark Jiao · 2013-12-03 · via 博客园 - Mark Jiao

PHP

http://www.php.net/manual/zh/index.php

基本语法

PHP

可以在 PHP 中使用四对不同的开始和结束标记。其中两种,<?php ?> 和 <script language="php"> </script> 总是可用的。另两种是短标记和 ASP 风格标记,可以在 php.ini配置文件中打开或关闭。尽管有些人觉得短标记和 ASP 风格标记很方便,但移植性较差,通常不推荐使用。

此外注意如果将 PHP 嵌入到 XML 或 XHTML 中则需要使用 <?php ?> 标记以保持符合标准。

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

从 HTML 中分

要输出大段文本时,跳出 PHP 解析模式通常比将文本通过 echoprint 输出更有效率。

指令分隔

同 C 或 Perl 一样,PHP 需要在每个语句后用分号结束指令。在一个 PHP 代码段中的最后一行可以不用分号结束。

PHP 支持 C,C++ 和 Unix Shell 风格(Perl 风格)的注释。

//#

/*…*/

类型

PHP 支持 8 种原始数据类型。

四种标量类型:

两种复合类型:

最后是两种特殊类型:

为了确保代码的易读性,本手册还介绍了一些伪类型

以及伪变量 $...

变量的类型通常不是由程序员设定的,确切地说,是由 PHP 根据该变量使用的上下文在运行时决定的。

Note: 如果想查看某个表达式的值和类型,用 var_dump() 函数。

array(4) {

  ["username"]=>

  string(23) "test:Chicago Unit Tests"

  ["password"]=>

  string(32) "bf289be8c8015b91db4b3e3e021e88ad"

  ["wsdl"]=>

  string(33) "config/OmnitureAdminServices.wsdl"

  ["rsid"]=>

  string(17) "chicago-unit-test"

}

类型函数:

Boolean 布尔类型

TRUEFALSE。两个都不区分大小写。

当转换为 boolean 时,以下值被认为是 FALSE

  • 布尔FALSE 本身
  • 整型值 0(零)
  • 浮点型值 0.0(零)
  • 字符串,以及字符串 "0"
  • 不包括任何元素的数组
  • 不包括任何成员变量的对象(仅 PHP 4.0 适用)
  • 特殊类型 NULL(包括尚未赋值的变量)
  • 从没有任何标记(tags)的 XML 文档生成的 SimpleXML 对象

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

Integer 整型

八进制表达,数字前必须加上 0(零)。要使用十六进制表达,数字前必须加上 0x。要使用二进制表达,数字前必须加上 0b

整数溢出: 如果给定的一个数超出了 integer 的范围,将会被解释为 float。同样如果执行的运算结果超出了 integer 范围,也会返回 float

PHP 中没有整除的运算符。1/2 产生出 float0.5。值可以舍弃小数部分强制转换为 integer,或者使用 round() 函数可以更好地进行四舍五入。

要明确地将一个值转换为 integer,用 (int)(integer) 强制转换。不过大多数情况下都不需要强制转换,因为当运算符,函数或流程控制需要一个 integer 参数时,值会自动转换。还可以通过函数 intval() 来将一个值转换成整型。

FALSE 将产生出 0(零),TRUE 将产生出 1(壹)。

当从浮点数转换成整数时,将向下取整。

如果浮点数超出了整数范围(32 位平台下通常为 +/- 2.15e+9 = 2^31,64 位平台下通常为 +/- 9.22e+18 = 2^63),则结果为未定义

Warning: 决不要将未知的分数强制转换为 integer,这样有时会导致不可预料的结果。echo (int) ( (0.1+0.7) * 10 ); // 显示 7!

Float 浮点型

浮点数的形式表示:

LNUM          [0-9]+

DNUM          ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)

EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM})

NaN

某些数学运算会产生一个由常量 NAN所代表的结果。此结果代表着一个在浮点数运算中未定义或不可表述的值。任何拿此值与其它任何值进行的松散或严格比较的结果都是 FALSE。由于 NAN 代表着任何不同值,不应拿 NAN 去和其它值进行比较,包括其自身,应该用 is_nan() 来检查。

String 字符串

一个字符串 string 就是由一系列的字符组成,其中每个字符等同于一个字节。PHP 只能支持 256 的字符集,因此不支持 Unicode 。

Note: string 最大可以达到 2GB。

一个字符串可以用 4 种方式表达:

  • 单引号: 不像双引号和 heredoc语法结构,在单引号字符串中的变量和特殊字符的转义序列将不会被替换。
  • 双引号: PHP 将对一些特殊的字符进行解析
  • heredoc 语法结构: <<<,之后要提供一个标识符,然后换行, 最后要用前面定义的标识符作为结束标志。Heredoc 结构就象是没有使用双引号的双引号字符串.
  • nowdoc 语法结构(自 PHP 5.3.0 起): Nowdoc 结构是类似于单引号字符串的。Nowdoc 结构很象 heredoc 结构,但是 nowdoc 中不进行解析操作。在后面的标识符要用单引号括起来,即 <<<'EOT'

可以把 string当成字符组成的 array。比如 $str[42]or$str{42}

字符串可以用 '.'(点)运算符连接起来,注意 '+'(加号)运算符没有这个功能

字符串会被按照该脚本文件相同的编码方式来编码。

Array 数组

可以用 array() 语言结构来新建一个数组。它接受任意数量用逗号分隔的 键(key => 值(value对。自 5.4 起可以使用短数组定义语法,用 [] 替代 array()

array(  key =>  value
     , ...
     )
// 键(key)可是是一个整数 integer 或字符串 string
// 值(value)可以是任意类型的值

key 会有如下的强制转换:

  • 包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08"则不会强制转换,因为其不是一个合法的十进制数值。
  • 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8
  • 布尔值也会被转换成整型。即键名 true 实际会被储存为 1而键名 false 会被储存为 0
  • Null 会被转换为空字符串,即键名 null 实际会被储存为 ""
  • 数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type

多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。

Object 对象

Resource 资源类型

资源 resource是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。

伪类型与变量

mixed 说明一个参数可以接受多种不同的(但不一定是所有的)类型。

number 说明一个参数可以是 integer 或者 float。

在函数原型中,$... 表示等等的意思。当一个函数可以接受任意个参数时使用此变量名。

变量

基础

美元符号后面跟变量名,变量名是区分大小写

Note: $this 是一个特殊的变量,它不能被赋值。

给变量赋值方式

  • 传值赋值。当一个变量的值赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量。
  • 引用赋值: 改动新的变量将影响到原始变量,反之亦然。将一个 & 符号加到将要赋值的变量前(源变量)。只有有名字的变量才可以引用赋值。

预定义变量

变量范围

大部分的 PHP 变量只有一个单独的范围。这个单独的范围跨度同样包含了 include 和 require 引入的文件。

任何用于函数内部的变量按缺省情况将被限制在局部函数范围内。

在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖。PHP 中全局变量在函数中使用时必须声明为 global。在全局范围内访问变量的第二个办法,是用特殊的 PHP 自定义 $GLOBALS 数组。$GLOBALS是一个关联数组.

静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。static $a = 0;

可变变量

一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。两个美元符号($)

$a = 'hello';

$$a = 'world';

echo "$a ${$a}";

两个变量都被定义了:$a 的内容是“hello”并且 $hello 的内容是“world”。

可变变量用于数组: ${$a[1]} vs. ${$a}[1]

类的属性也可以通过可变属性名来访问

注意,在 PHP 的函数和类的方法中,超全局变量不能用作可变变量。$this 变量也是一个特殊变量,不能被动态引用。

来自 PHP 之外的变量

HTML 表单

Name:  <input type="text" name="username"><br />

echo $_POST['username'];

echo $HTTP_POST_VARS['username'];

echo $username;// register_globals = on

Note:

·         超全局数组例如 $_POST 和 $_GET

·        变量名中的点和空格被转换成下划线。例如 <input name="a.b" /> 变成了 $_REQUEST["a_b"]

·        magic_quotes_gpc 配置指令影响到 Get,Post 和 Cookie 的值。如果打开,值 (It's "PHP!") 会自动转换成 (It\'s \"PHP!\")。

PHP 也懂得表单变量上下文中的数组

IMAGE SUBMIT 变量名

HTTP Cookies

PHP 透明地支持 » RFC 6265定义中的 HTTP cookies。

<?php
  setcookie("MyCookie[foo]", 'Testing 1', time()+3600);

注意: PHP 将会自动将变量名中的点替换成下划线。//$varname.ext;  /* 非法变量名 */

常量

常量默认为大小写敏感。传统上常量标识符总是大写的。

常量和变量有如下不同:

  • 常量前面没有美元符号($);
  • 常量只能用 define() 函数定义,而不能通过赋值语句;
  • 常量可以不用理会变量的作用域而在任何地方定义和访问;
  • 常量一旦定义就不能被重新定义或者取消定义;
  • 常量的值只能是标量。

Note: 常量和(全局)变量在不同的名字空间中。这意味着例如 TRUE 和 $TRUE 是不同的。

在 PHP 5.3.0 以后,可以使用 const 关键字在类定义之外定义常量。

Note:和使用 define() 来定义常量相反的是,使用 const 关键字定义常量必须处于最顶端的作用区域,因为用此方法是在编译时定义的。这就意味着不能在函数内,循环内以及 if语句之内用 const 来定义常量。

魔术常量

几个 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 新增)。

表达式

PHP支持四种标量值(标量值不能拆分为更小的单元,例如和数组不同)类型:整型值(integer),浮点数值(float),字符串值(string)和布尔值(boolean)。PHP 也支持两种复合类型:数组和对象。这两种类型具可以赋值给变量或者从函数返回。

前、后递增和递减.

PHP 还支持全等运算符 ===(值和类型均相同)和非全等运算符 !==(值或者类型不同)。

任何二元运算符都可以用运算赋值模式,例如“$a -= 5”(从变量 $a 的值中减去 5),“$b *= 7”(变量 $b 乘以 7),等等。

三元条件运算符:$first ? $second : $third

运算符

运算符优先级

结合方向

运算符

附加信息

clone new

clone 和 new

[

array()

++ -- ~ (int) (float) (string) (array) (object) (bool) @

类型递增/递减

instanceof

类型

!

逻辑运算符

* / %

算术运算符

+ - .

算术运算符字符串运算符

<< >>

位运算符

== != === !== <>

比较运算符

&

位运算符引用

^

位运算符

|

位运算符

&&

逻辑运算符

||

逻辑运算符

? :

三元运算符

= += -= *= /= .= %= &= |= ^= <<= >>= =>

赋值运算符

and

逻辑运算符

xor

逻辑运算符

or

逻辑运算符

,

多处用到

算术运算符

 

例子

名称

结果

 

-$a

取反

$a 的负值。

 

$a + $b

加法

$a 和 $b 的和。

 

$a - $b

减法

$a 和 $b 的差。

 

$a * $b

乘法

$a 和 $b 的积。

 

$a / $b

除法

$a 除以 $b 的商。

 

$a % $b

取模

$a 除以 $b 的余数。

 

除法运算符总是返回浮点数。只有在下列情况例外:两个操作数都是整数(或字符串转换成的整数)并且正好能整除,这时它返回一个整数。

取模运算符的操作数在运算之前都会转换成整数(除去小数部分)。

取模运算符 % 的结果和被除数的符号(正负号)相同。即 $a % $b 的结果和 $a 的符号相同。

赋值运算符

传值赋值

赋值运算表达式的值也就是所赋的值。

对于数组 array,对有名字的键赋值是用“=>”运算符。

引用赋值 

引用赋值意味着两个变量指向了同一个数据,没有拷贝任何东西。$b = &$a; // $b 是 $a 的引用

位运算符

位运算符

例子

名称

结果

$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。

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

执行运算符:反引号(``)。

逻辑运算符

逻辑运算符

例子

名称

结果

$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。

“与”和“或”有两种不同形式运算符的原因是它们运算的优先级不同  !>&&>||>and>xor>or

数组运算符

数组运算符

例子

名称

结果

$a + $b

联合

$a 和 $b 的联合。

$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。

类型运算符

instanceof 用于确定一个 PHP 变量是否属于某一类class的实例: var_dump($a instanceof MyClass); 输出bool(true)

流程控制

Note: 必须要注意的是 elseif 与 else if 只有在类似上例中使用花括号的情况下才认为是完全相同。

流程控制的替代语法

替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成 endif;endwhile;endfor;endforeach; 以及 endswitch;

foreach 仅能够应用于数组和对象

foreach (array_expression as $value)

    statement

foreach (array_expression as $key => $value)

    statement

break 结束当前 forforeachwhiledo-while 或者 switch 结构的执行。

break 可以接受一个可选的数字参数来决定跳出几重循环。

continue 在循环结构用用来跳过本次循环中剩余的代码并在条件求值为真时开始执行下一次循环。

continue 接受一个可选的数字参数来决定跳过几重循环到循环结尾。默认值是 1,即跳到当前循环末尾。省略 continue 后面的分号会导致混淆。

declare 结构用来设定一段代码的执行指令。

declare (directive)

    statement

directive 部分允许设定 declare 代码段的行为。目前只认识两个指令:ticks以及 encoding

require 和 include 几乎完全一样,除了处理失败的方式不同之外。 require 在出错时产生 E_COMPILE_ERROR 级别的错误。换句话说将导致脚本中止而 include 只产生警告(E_WARNING),脚本会继续运行。

被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照 include_path 指定的目录寻找。如果在 include_path 下没找到该文件则 include 最后才在调用脚本文件所在的目录和当前工作目录下寻找。如果最后仍未找到文件则 include 结构会发出一条警告;这一点和 require 不同,后者会发出一个致命错误。

require_once 语句和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。

goto 操作符可以用来跳转到程序中的另一位置。

函数

用户自定义函数

PHP 中的所有函数和类都具有全局作用域,可以定义在一个函数之内而在之外调用,反之亦然。

PHP 不支持函数重载,也不可能取消定义或者重定义已声明的函数。

Note: 函数名是大小写无关的,不过在调用函数的时候,使用其在定义时相同的形式是个好习惯。

PHP 的函数支持可变数量的参数默认参数。参见 func_num_args(), func_get_arg() 和 func_get_args()

在 PHP 中可以调用递归函数。但是要避免递归函数/方法调用超过 100-200 层,因为可能会使堆栈崩溃从而使当前脚本终止。

函数的参数

默认情况下,函数参数通过值传递(因而即使在函数内部改变参数的值,它并不会改变函数外部的值)。如果希望允许函数修改它的参数值,必须通过引用传递参数。

如果想要函数的一个参数总是通过引用传递,可以在函数定义中该参数的前面加上符号 &:function add_some_extra(&$string)

默认参数的值

PHP 还允许使用数组 array 和特殊类型 NULL 作为默认参数

默认值必须是常量表达式,不能是诸如变量,类成员,或者函数调用等。

注意当使用默认参数时,任何默认参数必须放在任何非默认参数的右侧;否则,函数将不会按照预期的情况工作。

可变数量的参数列表 

PHP 在用户自定义函数中支持可变数量的参数列表。其实很简单,只需使用 func_num_args(), func_get_arg(),和 func_get_args() 函数即可。

可变函数

如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。

可变函数不能用于例如 echo, print, unset(), isset(), empty(), include, require 以及类似的语言结构。

当调用静态方法时,函数调用要比静态属性优先.

内部(内置)函数

调用 phpinfo() 或者 get_loaded_extensions() 可以得知 PHP 加载了那些扩展库。同时还应该注意,很多扩展库默认就是有效的。

匿名函数

匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。