我厌倦了总是读到同样的信息:”PHP烂透了”。
但这些批评者大多自 2012 年以来就没再关注过 PHP,而且从那时起已经发生了很多变化。
让我们看看自 PHP 5.4 发布以来发生的语言变化。
Traits(PHP 5.4)
PHP 5.4 引入了traits,它允许在继承的基础上进行组合。您可以在每个类中包含 traits。
trait ezcReflectionReturnInfo {
function getReturnType() { /*1*/ }
function getReturnDescription() { /*2*/ }
}
class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */
}
class ezcReflectionFunction extends ReflectionFunction {
use ezcReflectionReturnInfo;
/* ... */
}
简短的数组语法
像穴居人一样编写array() 的日子一去不复返了。现在,您可以使用方括号[]来编写简短的数组语法。
$array = [1, 2, 3];
数组重构
将数组赋值给临时变量已经成为过去。现在,你可以使用数组重构来直接为数组中的变量赋值。
$source_array = ['foo', 'bar', 'baz']; [$foo, $bar, $baz] = $source_array;
First-Class变量函数
您可以使用...语法向函数传递任意多个参数。
Generators
需要以节省内存的方式执行内存密集型任务?Generators 就是你的最佳选择。
匿名类
需要一个新类,但又懒得创建一个新文件?匿名类就是解决方案。它们可以像其他类一样实现接口。
class SomeClass {}
interface SomeInterface {}
trait SomeTrait {}
var_dump(new class(10) extends SomeClass implements SomeInterface {
private $num;
public function __construct($num)
{
$this->num = $num;
}
use SomeTrait;
});
参数尾逗号(PHP 7)
再也不用担心在函数调用或方法调用中添加尾逗号了。
function foo(string $foo, string $bar,) {}
function() use ($foo, $bar,) {
}
箭头函数
PHP 也有箭头函数!它们与 JavaScript 的并不完全相同,但却是对 PHP 语言的一大补充。
$y = 1;
$fn1 = fn($x) => $x + $y;
// equivalent to using $y by value:
$fn2 = function ($x) use ($y) {
return $x + $y;
};
var_export($fn1(3));
空值操作符??(PHP 7)
赋值前无需再检查是否为空。空值运算符??可以帮你解决这个问题。
$username = $_GET['username'] ?? 'not passed';
空值赋值操作符(PHP 7.4)
如果需要对空值操作符进行速记,也可以使用赋值操作符。
$_GET['user'] ??= 'nobody';
空链操作符(PHP 8)
调用方法前无需再检查是否为空。空链操作符将拯救一切。
$foo?->bar?->baz;
命名参数(PHP 8)
厌倦了使用 null 来跳过可选参数?有了命名参数,问题就迎刃而解了。
// Using positional arguments: array_fill(0, 100, 50); // Using named arguments: array_fill(start_index: 0, count: 100, value: 50);
属性(注释)
PHP 现在有了属性,可以用来为类、方法、参数或属性添加注解。
#[Attribute]
class SetUp {}
改进的错误处理
不用再为异常返回 false 变量了。PHP 现在改进了错误处理。
// set to the user defined error handler
$old_error_handler = set_error_handler("myErrorHandler");
匹配语句(PHP 8)
不再需要一英里长的开关语句了。匹配语句是编写开关语句的一种更简洁、更易读的方法。
$food = 'cake';
$return_value = match ($food) {
'apple' => 'This food is an apple',
'bar' => 'This food is a bar',
'cake' => 'This food is a cake',
};
var_dump($return_value);
Weak Map(PHP 7.4)
弱映射来了,它比数组更适合内存。此外,你还可以使用对象作为键。
$obj1 = new stdClass();
$obj->name = 'Foo'; $obj->age = 28;
$map = new WeakMap();
$map[$obj1] = 'Additional data for stdClass #1';
unset($obj1); // Removes $obj and the key and value from $map as well.
count($map); // 0
枚举 Enums (PHP 8.1)
枚举终于来了!您可以创建带有值和方法的枚举类,甚至可以将它们用作类型提示。
enum Status { case DRAFT; case PUBLISHED; case ARCHIVED; }
类型安全
PHP 现在有了类型化参数、返回类型、联合类型、交集类型等。您甚至可以为枚举使用类型提示!
/ fails as string is not
function setName(string $name) { ... }
构造函数属性提升(PHP 8.0)
冗长的构造函数时代一去不复返了。构造函数属性提升可以减少模板代码。
class User {
public function __construct(private string $name) {}
}
只读属性(PHP 8.1)
需要将属性标记为只读?有一个关键字可以解决这个问题。
public readonly int $uid;
性能
PHP 的性能在 5.6 和 7 之间提高了 400%,在 7 和 8 之间又提高了 20%。对于大多数用例来说,它已经足够快了,如果需要特殊用例,可以使用专门的语言。
结论
总之,PHP 没有死,也不再糟糕。自 2012 年以来,PHP 已经发生了重大变化,是时候修正我们对它的看法了。
随着 traits、短数组语法、数组重构等一系列功能的引入,PHP 已成为一门更高效、更易读、更易维护的语言。
再加上错误处理的改进、属性的引入以及期待已久的枚举的到来,很明显,PHP 已经发展成为 Web 开发中一个强大而可靠的选择。
因此,下次再有人说 PHP 很烂时,你可以自信地告诉他们,他们只是停留在过去。
你也许感兴趣的: