有时候,我们已经厌倦了类似这样的话:
“PHP 很糟糕,很烂,它快死了。” —— 是啊,它快死了,还有一些遗产需要解决。
“PHP是最好的语言” —— PHP有太多缺点了,还是有一些地方值得用。
“PHP在排行榜上又下降了”。—— 某些排行榜蹭热点与项目常用语言需要权衡。
还有很多类似的话。
这些批评者在说PHP的时候,忘了最开始的时候,还有Web2.0的红火时代,它曾经帮助多少人走进软件开发,帮助多少互联网公司从0开始,然后成功上市,如今也仍有一些互联网公司在使用PHP,还有不少开源软件在给不少创业公司提供动力,不论是电商,还是内容管理系统。
而且,估计绝大多数人 2012 年以来就没有关注过 PHP,从那以后它已经发生了很多的改变。
让我们看一下自 PHP 5.4 发布以来发生的一系列语言变化。
traits (PHP 5.4)
从PHP 5.4 引入了traits(特征),允许组合而不再是继承。我们可以拥有特质并将它们包含在每个类中。
trait ezcReflectionReturnInfo {
function getReturnType() { /*1*/ }
function getReturnDescription() { /*2*/ }
}
class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */
}
class ezcReflectionFunction extends ReflectionFunction {
use ezcReflectionReturnInfo;
/* ... */
}
短数组语法
这个array(),就像穴居人一样写法的日子已经一去不复返了。你现在可以使用方括号[]的短数组语法来表示。
$array = [2, 3, 4];
数组解构
将数组分配给临时变量已成为过去。你现在可以使用数组解构,直接从数组中分配变量。
$source_array = ['foo', 'bar', 'baz'];
[$foo, $bar, $baz] = $source_array;
可变参数函数
你可以使用新语法"..."将任意数量的参数传递给函数。
function foo(string $string, int ...$numbers): void
{
echo sprintf('%s [%s]', $string, implode(', ', $numbers));
}
匿名类
需要一个新类但又懒得创建一个新文件?匿名类是解决方案。他们可以像任何其他类一样实现接口。
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,但它们是对该语言的一个很好的补充。
$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)
分配值之前不再检查是否 null 。空合并运算符已经满足了要求。
$username = $_GET['username'] ?? 'not passed';
空值合并赋值运算符 (PHP 7.4)
如果需要简写空合并运算符,也可以使用赋值运算符。
$_GET['user'] ??= 'nobody';
空链接运算符 (PHP 8)
在调用方法之前不再检查 null 。空链运算符可以拯救世界。
$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)
不再需要有一英里长的 switch 语句。match 语句是一种更紧凑、更易读的 switch 语句编写方式。
$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);
弱映射 (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
枚举 (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 已成为一种更高效、更易读和更可维护的语言。
再加上错误处理方面的改进、属性的引入以及期待已久的枚举的到来,很明显 PHP 已经发展成为 Web 开发强大而可靠的选择。
因此,下次有人告诉您 PHP 很糟糕时,你可以自信地告诉他们,他们只是停留在过去的时代。
还有哪些新的PHP特性值得说,哪些还需要吐槽?欢迎文底留言~
作者:万能的大雄
本文为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。