PHP语言参考类型/变量/常量/表达式/运算符/控制结构/函数

PHP官方文档下载:点击 推荐下载英文版。中文版翻译Just so so.

PHP (Hypertext Preprocessor)是一种 HTML 嵌入式的脚本语言。它的很多语法来自 C,Java 和 Perl,并具有几个 PHP 独有的特点。该语言的主要目标是让 Web 开发人员快速地书写动态生成的网页。


PHP/FI 2.0 是最早的 PHP 版本,已经不再支持。PHP 3 是 PHP/FI 2.0 的后继者。PHP 5 是目前一代的 PHP,内部使用了Zend 引擎 2 代,除了很多新功能之外还提供了许多附加的 面向对象编程(OOP)特性。


PHP5可以向下兼容PHP4的程序,但PHP中有很多改进的地方。如下:
■一个 新的面向对象模型,基于 Zend Engine 2.0
■一个改进过的 MySQL 扩展
■内置支持 SQLite
■新的错误报告常量, E_STRICT, 用于生成执行期的错误信息。
■很多新的 函数来简化开发。

一、类型
1.布尔类型
将一个值转换成boolean,用(bool)或者 (boolean) 来强制转换。以下值被认为是 FALSE:

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

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

2.整形

* 进制

十进制

八进制 必须在数字前加数字0。如果向八进制数传递了一个非法数字(即 8 或 9),则后面其余数字会被忽略
十六进制 必须在数字前加0x

* 相关函数
PHP_INT_SIZE Integer字长
PHP_INT_MAX 最大值

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

* 转换
值转换为 integer,用 (int) 或 (integer) 强制转
布尔值FALSE产生0,TRUE产生1
浮点转换整数,超出范围,结果不确定


3.浮点型
不能用有限位数精确表达某些十进制分数,如十进制的 1/3 变成了 0.3
不要相信浮点数结果精确到了最后一位
不要比较两个浮点数是否相等
更高精度使用 任意精度数学函数 或者 gmp 函数

4.字符串型
* 字符串声明
用单引号/双引号
heredoc结构:<<<+标识名称+新行+字符串内容+新行+标识名称.结束标识名称必须在一行的开始位置,标识名称命名只能包含字母、数字和下划线,并且不能用数字和下划线作为开头。
(引号不用被替换,转义字符\n也可使用,变量将被替换,字符串表达复杂变量时应小心.)

const BAR = <<<FOOBAR
Constant example
FOOBAR;

Nowdoc结构: <<<+标识名称+新行+字符串内容+新行+标识名称,跟在<<<后的标识符要用''括起来,如<<<'EOT'.与heredoc相比,nowdoc不进行解析操作

echo <<<'EOT'
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': \x41
EOT;

* 变量解析-简单句法解析
PHP解析器遇到一个美元符号($)会尽量形成一个合法的变量名。可以用花括号{}来明确变量名的界线
数组[]及对象的属性 classA->width也可以被解析


* 变量解析-复杂句法解析
复杂句法可以使用函数之类的表达式,表达式以 {$ 开头, } 结尾.
如:

{${getName()}} ; {${$object->getName()}};

当函数,对象行为,类常量,静态变量返回值 与 变量名称一样时,单一{}无法处理该返回值,返回值会替换成变量的值。

* 字符串可以使用方括号来查找和修改字符串的一个字符。如$name[2],索引超出范围产生空白,多个字符可以用substr()函数

* 字符串连接用'.'

* 转义字符
\n 换行 (LF or 0x0A (10) in ASCII)
\r 回车 (CR or 0x0D (13) in ASCII)
\t 水平方向的 tab(HT or 0x09 (9) in ASCII)
\v 竖直方向的 tab (VT or 0x0B (11) in ASCII) (since PHP 5.2.5)
\f 换页 (FF or 0x0C (12) in ASCII) (since PHP 5.2.5)
\\ 反斜线
\$ 美金dollar标记
\" 双引号
\[0-7]{1,3} 符合该表达式顺序的字符串是一个八进制的字符
\x[0-9A-Fa-f]{1,2} 符合该表达式顺序的字符串是一个十六进制的字符

* 字符串转换
强制转换:(string)value或者strval(value)
自动转换:echo(),print(),字符串比较

boolean的TRUE转换成"1",FALSE转换成"0"
数组转换成"Array"
对象转换成"Object",对象类名称用get_class()或者toString()
资源转换成"Resource id #1"类型结构字符串.资源类型名称用get_resource_type()
null转换成空字符串

字符串转数字时,没有包括'.','e','E'且属整数范围时,可被认定为integer,否则为float。字符串合法为其相应数字,不合法为0

PHP类型值可以序列化serialize()成字符串长期存储。引擎支持WDDX后,可存储为xml格式

5.数组类型

* 键值对数组

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

如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖

* 声明修改数组

$arr[key] = value;
$arr[] = value;
//key 可以是 integer 或 string
//value 可以是任意类型的值

* unset()函数允许删除数组中的某个键,但要注意数组将不会重建索

* PHP 自动将裸字符串(没有引号的字符串且不对应于任何已知符号)转换成一个其值为该裸字符串的正常字符串

* 数据转换
对于任意类型: integer, float, string, boolean and resource,如果将一个值转换为数组,将得到一个仅有一个元素的数组(其下标为 0),该元素即为此标量的值

* 比较
使用 array_diff() 和数组运算符来比较数组

6.对象
new语句实例化新对象:

class foo
{
function do_foo()
{
echo "Doing foo."; 
}
}
$bar = new foo;
$bar->do_foo();


7.资源类型
资源是一种特殊变量,保存了到外部资源(文件、数据库连接、图形画布区域)的一个引用

* 资源释放
PHP4 Zend 引擎引进了引用计数系统,可以自动检测到一个资源不再被引用,并被垃圾回收系统释放


8.Null类型
■被赋值为 NULL
■尚未被赋值
■被 unset()

9.Callbacks
Some functions call_user_func() or usort() accept user-defined callback functions as a parameter

10.Passing
Static class methods can also be passed by format 'ClassName::methodName'

11.伪类型
* mixed
说明一个参数可以接受多种不同的类型

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

* callback
call_user_function() 或 usort() 的函数接受用户自定义的函数作为一个参数,可以是对象的方法,静态类的方法

* void
表示无返回值。void作为参数列表意味着函数不接受任何参数 

二、变量
声明变量用美元符号+变量名来表示。变量名是区分大小写,由字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线

* 引用赋值
变量的引用指向了原始变量的地址,将&符号添加到源变量前 

* 默认值
变量不需要初始化,其有默认值:
布尔类型的变量默认值是 FALSE
整形和浮点型变量默认值是0
字符串型变量默认值是空字符串
数组变量的默认值是空数组

* 预定义变量
来自web服务器,运行环境,用户输入预定数组作用于全局范围


* 变量范围
变量的作用域包括局部函数,include 和 require 引入的文件


* 全局变量
如果要使变量在全局上下文中生效,使用global声明变量或者$GLOBALS数组

$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo $b;
?>

<?php
$a = 1;
$b = 2;

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

Sum();
echo $b;

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

function test()
{
static $a = 0;
echo $a;
$a++;
}

* 可变变量

$a = 'hello';
$$a = 'world'; //变量名变成$hello

echo "$a ${$a}"; //等同于下面
echo "$a $hello";

* 外部变量

// 自 PHP 4.1.0 起可用
echo $_POST['username'];
echo $_REQUEST['username'];

import_request_variables('p', 'p_');
echo $p_username;
// PHP 6以后将无效。自 PHP 5.0.0 起,这些较长的预定义变量
// 可用 register_long_arrays 指令关闭。
echo $_GET['id'] //QUERY_STRING中id
echo $HTTP_POST_VARS['username'];

// 如果 PHP 指令 register_globals = on 时可用。不过自
// PHP 4.2.0 起默认值为 register_globals = off。
// 不提倡使用/依赖此种方法。

echo $username;

setcookie("MyCookie[foo]", 'Testing 1', time()+3600);
setcookie("MyCookie[bar]", 'Testing 2', time()+3600);


* 变量中的.为自动替换成_

* 确定变量类型
gettype()
is_array()
is_float()
is_int()
is_object()
is_string() 

三、常量

* 声明常量:用 define() 函数或者const关键字来定义常量,不应该在常量前面加上 $ 符号。常量类型可以标量数据(boolean,integer,float 和 string)。
可以定义 resource 常量,但应尽量避免,因为会造成不可预料的结果


常量名是动态的,也可以用函数 constant() 来获取常量的值
用 get_defined_constants() 可以获得所有已定义的常量列表


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

define("CONSTANT", "Hello world.");
echo CONSTANT; // outputs "Hello world."
echo Constant; // 输出 "Constant" 并发出一个提示性信息

//const CONSTANT = 'Hello World';
//echo CONSTANT;

* 魔术常量
很多常量都由扩展库定义,只有在加载了这些扩展库时才会出现,魔术常量它们的值随着它们在代码中的位置改变而改变

__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 中该值总是小写字母的。
__METHOD__ 类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
__NAMESPACE__ 当前命名空间的名称(大小写敏感)。这个常量是在编译时定义的(PHP 5.3.0 新增)

四、表达式
* 声明变量 $var = 1 (从右往左赋值 $b = ($a = 5)” 等效于 “$a =5; $b=5”)
* ++$var,$var++
* 三目运算符 $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 And(按位与) 将把 $a 和 $b 中都为 1 的位设为 1。
$a | $b Or(按位或) 将把 $a 或者 $b 中为 1 的位设为 1。 $a % $b 取模 $a 除以 $b 的余数
$a ^ $b Xor(按位异或) 将把 $a 和 $b 中不同的位设为 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,并且它们的类型也相同。(PHP 4 引进)
$a != $b 不等 TRUE,如果 $a 不等于 $b。
$a <> $b 不等 TRUE,如果 $a 不等于 $b。
$a !== $b 非全等 TRUE,如果 $a 不等于 $b,或者它们的类型不同。(PHP 4 引进)
$a < $b 小与 TRUE,如果 $a 严格小于 $b。
$a > $b 大于 TRUE,如果 $a 严格 $b。
$a <= $b 小于等于 TRUE,如果 $a 小于或者等于 $b。
$a >= $b 大于等于 TRUE,如果 $a 大于或者等于 $b。

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

如果激活了 track_errors 特性,表达式所产生的任何错误信息都被存放在变量 $php_errormsg中。此变量在每次出错时都会被覆盖

* 执行运算符
反引号(``)尝试将反引号中的内容作为外壳命令来执行,并将其输出信息返回。与函数shell_exec()同
反引号运算符在激活了安全模式或者关闭了 shell_exec() 时是无效的

$output = `ls -al`;
echo "<pre>$output</pre>";

* 递增/递减运算符
例子 名称 效果
--------------------------------------
++$a 前加 $a 的值加一,然后返回 $a。
$a++ 后加 返回 $a,然后将 $a 的值加一。
--$a 前减 $a 的值减一, 然后返回 $a。
$a-- 后减 返回 $a,然后将 $a 的值减一


* 逻辑运算符

例子 名称 结果
--------------------------------------
$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。


* 字符串运算符
连接运算符"." 它返回其左右参数连接后的字符串
连接赋值运算符".=" 它将右边参数附加到左边的参数后

* 数组运算符
例子 名称 结果
----------------------------------------------------------------------------
$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 变量是否属于类、某父类的子类、接口的实例


六、控制结构

* 流程控制判断

if...elseif...else if...else...endif

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

* 循环

while(...)
{

}

do
{
...
}
while(...)

for (expr1; expr2; expr3):
statement
endfor

foreach (array_expression as $value)
statement
foreach (array_expression as $key => $value)
statement

* break和continue

* 选择(支持整数和字符串)

switch ($i) {
case 0:
echo "i equals 0";
break;
case 1:
echo "i equals 1";
break;
case 2:
echo "i equals 2";
break;
}


* 声明declare
用来设定一段代码的执行指令,目前只支持tick与encoding

declare(ticks=1) {
// entire script here
}
declare(encoding='ISO-8859-1');

* require()与include比较

require() 包含并运行指定文件,错误时产生一个Fatal Error,错误时产生停止处理页面

include() 包含并运行指定文件,错误时产生一个Warning ,错误时产生继续处理页面

require_once() 文件中的代码已经被包含就不会再包含

include_once() 文件中的代码已经被包含就不会再包含


查找文件路径优先级
当前工作目录的相对包含路径include_path->当前脚本所在目录->


* goto操作符
用来跳转到程序中的某一指定位置。该目标位置可以用目标名称加上冒号来标示。
只能在同一个文件和作用域中跳转,无法跳出一个函数或类方法,也无法跳入到另一个函数

* 打印输出

echo 输出一个或多个字符串。
die 输出一条消息,并退出当前脚本。
print_r 输出易于理解的信息,可以输出各种数据类型
print 和echo()用法一样
printf 函数输出格式化的字符串。
sprintf 把格式化的字符串写写入一个变量中
var_dump 输出变量的内容、类型或字符串的内容、类型、长度。常用来调试。
var_exprot 输出或返回一个变量的字符串表示,它和 var_dump() 类似,不同的是其返回的表示是合法的 PHP 代码

七、函数

* 函数定义

PHP 中的所有函数和类都具有全局作用域,可以在内部定义外部调用. 不支持函数重载,函数名是大小写无关.

//函数名以字母或下划线开头,后跟字母/数字/下划线
function foo($arg_1, $arg_2, ..., $arg_n)
{
    echo "Example function.\n";
    return $retval;
}

* 条件函数

$makefoo = true;
//不能在此处调用foo()函数,因为它还不存在,但可以调用bar()函数
bar();
if ($makefoo) {
  function foo()
  {
    echo "I don't exist until program execution reaches me.\n";
  }
}
//在此处可以调用foo()函数
if ($makefoo) foo();
function bar()
{
  echo "I exist immediately upon program start.\n";
}

* 函数中的函数

function foo()
{
  function bar()
  {
    echo "I don't exist until foo() is called.\n";
  }
}

//现在还不能调用bar()函数,因为它还不存在
foo();
//现在可以调用bar()函数了,foo()函数执行使bar()函数变为已定义的函数 
bar();

* 递归函数

避免递归函数/方法调用超过100-200层,因为可能会破坏堆栈,从而使当前脚本终止.

function recursion($a)
{
    if ($a < 20) {
        echo "$a\n";
        recursion($a + 1);
    }
}

* 函数参数

函数的参数支持值参数,引用传递参数,可变数量参数、默认参数(见func_num_args(),func_get_arg(),func_get_args())

function add_some_extra(&$string) //引用参数
{
    $string .= 'and something extra.';
}
$str = 'This is a string, ';
add_some_extra($str);
echo $str;    // outputs 'This is a string, and something extra.'
function makecoffee($type = "cappuccino") //默认参数,必须是表达式
{
    return "Making a cup of $type.\n";
}
echo makecoffee();
echo makecoffee(null);
echo makecoffee("espresso");
//非标量类型作为默认参数(数组,null)
function makecoffee($types = array("cappuccino"), $coffeeMaker = NULL)
{
    $device = is_null($coffeeMaker) ? "hands" : $coffeeMaker;
    return "Making a cup of ".join(", ", $types)." with $device.\n";
}
echo makecoffee();
echo makecoffee(array("cappuccino", "lavazza"), "teapot");

函数中有默认值参数表达式和参数变量名(无默认值)时,参数变量名应列在默认值参数后面。

* 函数返回值

返回值可以返回一个引用。

function &returns_reference()
{
    return $someref;
}
$newref =& returns_reference();

* 可变函数

变量名后有圆括号(),PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数用来实现回调函数,函数表等。不能用于echo(),print(),unset(),isset(),empty(),include(),require()及类似语句。需要使用包装函数将该变量用作变量函数。

function foo() {
    echo "In foo()<br />\n";
}
function bar($arg = '') {
    echo "In bar(); argument was '$arg'.<br />\n";
}
//使用echo的包装函数
function echoit($string)
{
    echo $string;
}
$func = 'foo';
$func();        // This calls foo()

$func = 'bar';
$func('test');  // This calls bar()

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

* 可变方法

class Foo
{
    function Variable()
    {
        $name = 'Bar';
        $this->$name(); // This calls the Bar() method
    }

    function Bar()
    {
        echo "This is Bar";
    }
}

$foo = new Foo();
$funcname = "Variable";
$foo->$funcname();   // This calls $foo->Variable()

* 内置函数

有些特定函数需要和扩展模块一起编译(需要加载扩展库)。否则会“未定义函数”错误。

* 匿名函数/闭包函数 (Anonymous/closures functions)

允许临时创建没有指定名称的函数,常用作回调函数(callback)的参数。

echo preg_replace_callback('~-([a-z])~', function ($match) {
    return strtoupper($match[1]);
}, 'hello-world');
// 输出 helloWorld

闭包函数可作为变量的值来使用。把closure对象赋值给一个变量,最后加上分号。

$greet = function($name)
{
    printf("Hello %s\r\n", $name);
};
$greet('World');
$greet('PHP');

Closure对象从父作用域中继承类属性/变量,变量在类头部声明。

专注于机器学习、前端相关邻域。关注 全栈深入 公众号查看更多硬核文章。
原文地址:https://www.cnblogs.com/janas/p/2659251.html