PHP 8.3 新特性 - class_alias 类别名

作者: 温新

图书: 【PHP 8.3 新特性】

阅读: 528

时间: 2024-11-21 09:11:41

hi,我是温新,一名 PHPer

在 PHP 8.3 中,class_alias() 函数支持为内置的 PHP 类创建别名。这意味着可以使用自定义的别名来引用这些类,而不是使用它们的原始名称。这在某些情况下可能会使代码更易于阅读和维护。

为内置类起别名

<?php

// 使用 class_alias() 为内置的 PHP 类创建别名
class_alias('DateTime', 'MyDateTime');

// 现在可以使用 MyDateTime 作为 DateTime 类的别名
$dateTime = new MyDateTime();
echo $dateTime->format('Y-m-d H:i:s');

在这个例子中,我们使用 class_alias() 函数将内置的 DateTime 类重命名为 MyDateTime。然后我们可以像使用普通类一样使用 MyDateTime 类。

为自定义类起别名

<?php

class Person {
    public string $name = '王美丽';

    public function dance()
    {
        echo $this->name . ' 会跳舞';
    }
}

class_alias('Person', 'Ren');

$ren = new Ren;
echo $ren->dance();

$mei = new Person;
echo $mei->dance();

var_dump($ren == $mei); // true
var_dump($mei == $ren); // true
var_dump($ren instanceof  $mei); // true
var_dump($ren instanceof Person); // true
var_dump($ren instanceof Mei); // false
var_dump($mei instanceof Person); // true
var_dump($mei instanceof Mei); // false

class_alias

class_alias(string $class, string $alias, bool $autoload = true): bool

参数解释

  • $class:要创建别名的类名;
  • $alias:要创建的别名;
  • $autoload:(可选)如果为 true,则在使用别名时会自动加载原始类。如果为 false,则不会自动加载。

class_alias 函数,为类起一个别名,这个别名的行为与原始类完全相同 。

为类起别的好处是,可以在不修改代码的情况下,更改类的名称,在者在多个地方使用相同的类,但使用的名称不同。

需要注意的是,如果原始类没有被加载,并且 $autoload 参数为 true,则在使用别名时会自动加载原始类。如果原始类已经被加载,则不会再次加载。

版本小于 PHP 8.3

在 PHP 8.3 之前,是不支持为内置类起别名的,否则会导致 ValueError 异常。

自定义类起别名

<?php

// 测试版本:PHP 8.2.3
// 为自定义类起别名不会报错
class Dog {
    public string $name = '花花';
}

class_alias('Dog', 'Hua');

$hua = new Hua;
echo $hua->name;

为内置类起别名会报异常

<?php
    
// PHP 8.2.3
class_alias('stdClass', 'MyNewClass');

报错如下

PHP Fatal error:  Uncaught ValueError: class_alias(): Argument #1 ($class) must be a user-defined class name, internal class name given in
请登录后再评论