PHP 已不再“糟糕”

2024年 5月 19日 62.9k 0

有时候,我们已经厌倦了类似这样的话:

  • “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 。空链运算符可以拯救世界PHP 已不再“糟糕”-1

$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特性值得说,哪些还需要吐槽?欢迎文底留言~

相关文章

塑造我成为 CTO 之路的“秘诀”
“人工智能教母”的公司估值达 10 亿美金
教授吐槽:985 高校成高级蓝翔!研究生基本废了,只为房子、票子……
Windows 蓝屏中断提醒开发者:Rust 比 C/C++ 更好
Claude 3.5 Sonnet 在伽利略幻觉指数中名列前茅
上海新增 11 款已完成登记生成式 AI 服务

发布评论