gpt4 book ai didi

php - 为什么要使用类别名?

转载 作者:IT王子 更新时间:2023-10-29 00:01:03 24 4
gpt4 key购买 nike

我们为什么要使用 class_alias 函数?例如:

Class Test {
public function __construct(){
echo "Class initialized";
}
}

class_alias("Test", "AnotherName");

$instance = new AnotherName(); # equivalent to $instance = new Test();

根据 the manual , "别名类与原始类完全相同。"

这有什么用?

最佳答案

令人惊讶的是,没有人提到这样做的明显原因:use 关键字只能在最外层范围内使用,并且在编译时处理,所以你不能 根据某些条件使用 Some\Class,也不能是 block 范围的:

namespace Foo;
if (!extension_loaded('gd'))
{
use Images\MagicImage as Image;
}
else
{
use Images\GdImage as Image;
}
class ImageRenderer
{
public function __construct(Image $img)
{}
}

这是行不通的:虽然 use 语句在最外层范围内,但正如我之前所说,这些导入是在编译时执行的,而不是运行时。结果,这段代码的行为就好像它是这样写的:

namespace Foo;
use Images\GdImage as Image;
use Images\MagicImage as Image;

这会产生错误(2 个类具有相同的别名...)
class_alias 然而,作为一个在运行时调用的函数,所以它可以是 block 范围的,并且可以用于条件导入:

namespace Foo;
if (!extension_loaded('gd'))
{
class_alias('Images\\MagicImage', 'Image');
}
else
{
class_alias('Images\\GdImage','Image');
}
class ImageRenderer
{
public function __construct(Image $img)
{}
}

除此之外,我怀疑 class_alias 的主要好处是在 PHP 5.3(它引入了 namespace )之前编写的所有代码都允许您避免编写如下内容:

$foo = new My_Lib_With_Pseudo_Name_Spaces_Class();

不必重构整个代码库和创建命名空间,只需添加几个就容易得多:

class_alias('My_Lib_With_Pseudo_Name_Spaces_Class', 'MyClass');

到脚本的顶部,以及一些 //TODO: switch to Namespaces 注释。

另一个用例可能是在实际将这些类转移到它们的命名空间对应物时:一旦一个类被重构,只需更改 class_alias 调用,其他类可以保持不变。
重构代码时,您可能会想要重新考虑一些事情,因此建议的 aichingm 这样的用例可能不会太牵强。

我能想到的最后一件事,但我还没有看到,当你想用模拟对象测试一些代码时,你可以使用 class_alias 让一切顺利运行。但是,如果您必须这样做,您也可以认为测试失败,因为这表明代码编写不当,IMO。

顺便说一句,就在今天,我遇到了 class_alias 的另一个用例。我正在研究一种实现库的方法,该库是从 CLI 工具中提炼出来的,用于基于 MVC 的 Web 应用程序。一些类依赖于要传递的调用命令的实例,它们从中得到一些其他的位和 bolt 。
我没有经历重构的麻烦,而是决定替换:

use Application\Commands\SomeCommand as Invoker;

声明:

if (\PHP_SAPI === 'cli')
{
class_alias('\\Application\\Commands\\SomeCommand', 'Invoker');
}
else
{
class_alias('\\Web\\Models\\Services\\SomeService', 'Invoker');
}

并且,在 vim 中快速 :%s/SomeCommand/Invoker/g 之后,我很高兴(或多或少)

关于php - 为什么要使用类别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17764841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com