PHP
关于PHP一些容易忘记的东西
构造函数
自 PHP 5.3.3
起,在命名空间中,与类名同名的方法不再作为构造函数。这一改变不影响不在命名空间中的类。
在PHP 7中废除了与类名相同的构造方法,统一使用__construct()
调用类的静态方法不会触发构造函数执行,只有实例化(new)时才会默认执行
<?php
// 标准的构造函数
class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}
关于数组
可以用array()
语言结构来构建一个数组。
自 PHP 5.4
起可以使用短数组定义语法,用[]
替代array()
。
自 PHP 5.4
起可以用直接对函数或方法调用的结果进行数组解引用,在此之前只能通过一个临时变量。
自 PHP 5.5
起可以直接对一个数组原型进行数组解引用。
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
);
$array = array(); // 空数组
// 自 PHP 5.4 起
$array = [
"foo" => "bar",
"bar" => "foo",
];
$array = []; // 空数组
// 关于解引用
function getArray() {
return array(1, 2, 3);
}
// on PHP 5.4
$secondElement = getArray()[1];
// previously
$tmp = getArray();
$secondElement = $tmp[1];
// or
list(, $secondElement) = getArray();
get_magic_quotes_gpc
如果 magic_quotes_gpc
为关闭时返回 0,否则返回 1。在 PHP 5.4.O
起将始终返回 FALSE
,因为magic_quotes_gpc
特性已自 PHP 5.3.0
起废弃并将自 PHP 5.4.0
起移除。。
三元运算符?:
自 PHP 5.3 起,可以省略三元运算符中间那部分。表达式 expr1 ?: expr3 在 expr1 求值为 TRUE 时返回 expr1,否则返回 expr3。
注意三元运算符是个语句,因此其求值不是变量,而是语句的结果。如果想通过引用返回一个变量这点就很重要。在一个通过引用返回的函数中语句 return $var == 42 ? $a : $b; 将不起作用,以后的 PHP 版本会为此发出一条警告。
逻辑运算符优先级
按优先级从高到低排列:!
、&&
、||
。&&
或and
(逻辑与),左右两边同时为真时,结果为真||
或or
(逻辑或),左右两边有一个为真时或者同时为真时,结果为真xor
(逻辑导或),左右两边一真一假时,结果为真(优先级高于||
或or
)!
(逻辑非)
elseif
vs else if
使用花括号的情况下,两者的行为是一致的;如果用冒号来定义if/elseif
,那么就不能用两个单词的else if
,否则会产生解析错误。
PHP5 升级到 PHP 7 需要注意的一些内容
MySQL
扩展自PHP 5.5.0
起已废弃,并自PHP 7.0.0
开始被移除。应使用MySQLi
或PDO_MySQL
扩展来替换。eregi
、ereg
,自PHP 5.3.0
起已废弃, 并自PHP 7.0.0
开始被移除。- 关于
preg_replace
,PHP 5.5.0
起, 传入\e
修饰符的时候,会产生一个E_DEPRECATED
错误;PHP 7.0.0
起,会产生E_WARNING
错误,同时\e
也无法生效,请用preg_replace_callback()
代替 - 定义类的时候,如果有方法名和类名相同,则会报deprecated提示信息,而且暂时无法消除,所以建议把同名方法改成
__construct()
方法,说不定之后的某个版本这种同名的写法就会是严重错误了。
类的自动加载
建议使用spl_autoload_register
(从PHP 5.1.0
开始可以使用),不建议使用__autoload
,该方法从PHP 7.2.0
开始已经变成DEPRECATED
,不排除未来有被移除的可能性。
函数类型
在PHP 5中,类型声明也被称为类型提示。
类型声明允许函数在调用时要求参数为特定类型。 如果给出的值类型不对,那么将会产生一个错误: 在PHP 5中,这将是一个可恢复的致命错误,而在PHP 7中将会抛出一个TypeError异常。
use 批量导入同命名空间下的类、函数或常量
// PHP 7 之前
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;
use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;
use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;
// PHP 7+
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};
多个变量连等
在PHP中,多个变量使用连等时:
除了值为对象,是“传引用”,多个变量指向同一个对象,改变其中一个,其他的指向该对象的变量内部的值也会改变。而其类型的赋值都是“传值”,多个变量只是值相同,彼此间并无其他关联。
设置cookie
通过setcookie
函数设置值,在当前执行脚本中无法立即生效,需要立即生效,可以采用如下方式:
$_COOKIE['name'] = "这是一个测试cookie";
setcookie函数中的path
参数,会影响$_COOKIE
变量值的有效性。