数据类型
默认和严格模式
declare(strict_types=1);
开启后如果函数参数或者返回指定了数据类型,则开启校验,如果类型不匹配,则报FATAL ERROR.
类型说明
类型 | 描述 | Minimum PHP version |
---|---|---|
Class | 自定义类 | PHP 5.0.0 |
interface | 自定义接口 | PHP 5.0.0 |
self | 当前类 | PHP 5.0.0 |
array | 数组 | PHP 5.0.0 |
object | 对象类型(含自定义类) | PHP 7.2.0 |
bool | 布尔 | PHP 7.0.0 |
float | 浮点 | PHP 7.0.0 |
int | 整数 | PHP 7.0.0 |
string | 字符串 | PHP 7.0.0 |
callable | 函数类型 | PHP 5.4.0 |
iterable | 数组或者实现了Traversable接口的对象 | PHP 7.1.0 |
?(以上类型) | 可为空(Nullable)类型 | PHP 7.1.0 |
void | 空返回值类型 | PHP 7.1.0 |
类型示例
function testReturn(): ?string
{
return 'elePHPant';
}
var_dump(testReturn());
function testReturn(): ?string
{
return null;
}
var_dump(testReturn());
function test(?string $name)
{
var_dump($name);
}
类相关
允许重写抽象方法(7.2)
当一个抽象类继承于另外一个抽象类的时候,继承后的抽象类可以重写被继承的抽象类的抽象方法。
<?php
abstract class A
{
abstract function test(string $s);
}
abstract class B extends A
{
// overridden
abstract function test($s) : int;
}
重写参数类型可省略(7.2)
<?php
interface A
{
public function Test(array $input);
}
class B implements A
{
public function Test($input){}
}
允许分组use命名空间
<?php
use Foo\Bar\{
Foo,
Bar,
Baz,//最后一个可以逗号7.2才支持
};
类常量可见性(7.1)
支持设置类常量的可见性
<?php
class ConstDemo
{
const PUBLIC_CONST_A = 1;
public const PUBLIC_CONST_B = 2;
protected const PROTECTED_CONST = 3;
private const PRIVATE_CONST = 4;
}
匿名类(7.0)
<?php
interface Logger {
public function log(string $msg);
}
$app = new Application;
$app->setLogger(new class implements Logger {
public function log(string $msg) {
echo $msg;
}
});
更便捷的语法
null合并运算符(7.0)
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
太空船操作符(7.0)
<?php
// 整数
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// 浮点数
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
// 字符串
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
…变长参数(PHP5.6)
function dosum(...$arr){
$sum = 0;
foreach($arr as $v){
$sum += $v;
}
return $sum;
}
$arr = [1, 2, 3, 4, 5];
echo dosum(...$arr); // 输出15
echo dosum(1,2,3,4,5,6); //输出21
[]定义数组
$arr = ['one', 'two', 'three'];
整数除法函数(7.0)
<?php
var_dump(intdiv(10, 3));
支持为负的字符串偏移量
现在所有支持偏移量的字符串操作函数 都支持接受负数作为偏移量,包括通过[]或{}操作字符串下标。在这种情况下,一个负数的偏移量会被理解为一个从字符串结尾开始的偏移量。
<?php
var_dump("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));
list
可以重点瞧一瞧
不向前兼容
Too few arguments exception(7.1)
function sayHello($name) {
echo "Hello " . $name;
}
sayHello();
// Fatal error: Uncaught ArgumentCountError: Too few arguments to function sayHello(), 0 passed in...
foreach不再改变内部数组指针
<?php
$array = [0, 1, 2];
foreach ($array as &$val) {
var_dump(current($array));
}
?>
Output of the above example in PHP 5:
int(1)
int(2)
bool(false)
Output of the above example in PHP 7:
int(0)
int(0)
int(0)
变量处理的变化
对变量、属性和方法的间接调用现在将严格遵循从左到右的顺序来解析
表达式 | PHP 5 的解析方式 | PHP 7 的解析方式 |
---|---|---|
\$\$foo[’bar’][‘baz’] | \${\$foo[’bar’][‘baz’]} | (\$\$foo)[’bar’][‘baz’] |
\$foo->\$bar[‘baz’] | \$foo->{\$bar[‘baz’]} | (\$foo->\$bar)[‘baz’] |
\$foo->\$bar[’baz’]() | \$foo->{\$bar[‘baz’]}() | (\$foo->\$bar)[’baz’]() |
Foo::\$bar[’baz’]() | Foo::{\$bar[‘baz’]}() | (Foo::\$bar)[’baz’]() |
Be First to Comment