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变量函数

您可以使用...语法向函数传递任意多个参数。

function foo(string $string, int ...$numbers): void
{
    echo sprintf('%s [%s]', $string, implode(', ', $numbers));
}

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 很烂时,你可以自信地告诉他们,他们只是停留在过去。

 

余下全文(1/3)
分享这篇文章:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注