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 需要注意的一些内容

  1. MySQL 扩展自 PHP 5.5.0 起已废弃,并自 PHP 7.0.0 开始被移除。应使用 MySQLiPDO_MySQL 扩展来替换。
  2. eregiereg,自 PHP 5.3.0 起已废弃, 并自 PHP 7.0.0 开始被移除。
  3. 关于 preg_replacePHP 5.5.0 起, 传入 \e 修饰符的时候,会产生一个 E_DEPRECATED 错误; PHP 7.0.0 起,会产生 E_WARNING 错误,同时 \e 也无法生效,请用 preg_replace_callback() 代替
  4. 定义类的时候,如果有方法名和类名相同,则会报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变量值的有效性。

添加新评论