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

时间:2016-02-04 22:02:16

标签: 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
$alias= $userType . 'LoginPage'; // produces ManagerLoginPage
$User = new $alias($this); // tries to instantiate a class named 'ManagerLoginPage', which doesn't exist

$User->{'loginAs' . $userType}($user);

2 个答案:

答案 0 :(得分:3)

正如documentation所解释的那样:

  

使用别名或导入引用外部完全限定名称的能力是命名空间的一个重要特性。这类似于基于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);

答案 1 :(得分:0)

您可以使用:

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