PHP 如何使用字符串实例化类别名


PHP How to instantiate a class alias using a string

我知道我可以在没有别名的情况下做到这一点,但在这种情况下,尝试使用别名实例化对象会尝试通过别名查找类。 这不能在 PHP 中完成吗?

// Import of manager, admin, etc login PageObjects
use Page'Acceptance'Users'Login as ManagerLoginPage;
use Page'Acceptance'Admins'Login as AdminLoginPage;
...
// Login user type snippet
$alias= $userType . 'LoginPage'; // produces ManagerLoginPage
$User = new $alias($this); // tries to instantiate a class named 'ManagerLoginPage', which doesn't exist
$User->{'loginAs' . $userType}($user);

正如文档所解释的那样:

能够使用别名引用外部完全限定名称或导入是命名空间的一项重要功能。这类似于基于 unix 的文件系统创建指向文件或目录的符号链接的能力。

以及下面的几段:

导入在编译时执行,因此不会影响动态类、函数或常量名称。

这意味着当您编写:

use Page'Acceptance'Users'Login as ManagerLoginPage;
$page = new ManagerLoginPage();

PHP 在编译过程中将别名扩展为:

$page = new 'Page'Acceptance'Users'Login();

您必须将完整的类名(包括所有包含的命名空间)放入变量$alias中才能使其工作:

$alias = 'Page'Acceptance'Users'Login';
$User = new $alias($this);

您可以使用:

$alias = $userType . 'LoginPage';
class_alias('Page'Acceptance'Users'Login', $alias);
$User = new $alias();