PHP 不再糟糕
我厌倦了总是读到同样的信息:”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 很烂时,你可以自信地告诉他们,他们只是停留在过去。
adm