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

PHP如何使用字符串实例化类别名,php,Php,我知道我可以在没有别名的情况下执行此操作,但在本例中,尝试使用别名实例化对象会尝试通过别名查找类。这不能在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

我知道我可以在没有别名的情况下执行此操作,但在本例中,尝试使用别名实例化对象会尝试通过别名查找类。这不能在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();

谢谢,这很有道理。我读过这些文件,但我无法把它们组合起来。所以我很高兴你对他们的意思做了一个快速的解释。