Php 从别名命名空间中的字符串名称创建新类实例
我见过像和这样的问题,但这两个问题都没有涉及如何从字符串名称创建类实例,如果您已经有一个名称空间,并且该类位于别名名称空间中:Php 从别名命名空间中的字符串名称创建新类实例,php,namespaces,Php,Namespaces,我见过像和这样的问题,但这两个问题都没有涉及如何从字符串名称创建类实例,如果您已经有一个名称空间,并且该类位于别名名称空间中: <?php namespace my\project; require 'vendor/autoload.php'; //Example aliased classes, more may be defined elsewhere use League\OAuth2\Client\Provider\Google; use Stevenmaguire\OAuth
<?php
namespace my\project;
require 'vendor/autoload.php';
//Example aliased classes, more may be defined elsewhere
use League\OAuth2\Client\Provider\Google;
use Stevenmaguire\OAuth2\Client\Provider\Microsoft;
//This is mapped from a submitted form value
$provider = 'Google';
$g = new $provider;
名称空间的引入允许在不同的上下文中使用相同的名称,因此答案是:不,这是不可能的
您可以有一个类\League\OAuth2\Client\Provider\Google
和另一个类\League\OAuth1\Client\Provider\Google
:在这种情况下,如何确定要实例化的类
假设您知道只有唯一的类名,则可以使用以下代码:
$provider = 'Google';
$found = False;
foreach( get_declared_classes() as $class )
{
if( preg_match( "~(.*\\\)?($provider)$~", $class ) )
{
$found = $class;
break;
}
}
if( $found )
{
$g = new '\\'.$found;
}
else
{
echo "No '$provider' class found";
}
但此例程只是“使用数组存储所有名称空间和类名”想法的简化,因为即使使用上述代码,如果您不知道所有已声明的类,也可能会得到不想要的结果。您只需使用:
$provider = 'League\OAuth2\Client\Provider\Google';
没有其他解决方案,类名变量需要包含完全限定的类名;别名不适用于字符串类名,内省也不能帮助您 试试使用League\OAuth2\Client\Provider\Google作为Google
@Xorifelse,不,这和我的一样谢谢。这还有进一步的曲折-自动加载的类还不会出现在get_declared_classes
列表中,拥有一个use
语句并不一定意味着类存在——这只在你尝试实例化它时才重要。如果你使用autoload,我想你没有机会:php怎么知道你想要什么?它知道我想要什么!如果我明确使用别名类名,$a=newgoogle代码>,工作正常。我认为这可能是一个PHP错误-类名解析的顺序似乎不太正确;需要某物/vendor/autoload.php;ect…
?是的,这很清楚。但是如果类文件被加载,OP可以(尝试)检索他的全名+1为了您的清晰/简洁,“(尝试)”正是该方法更为。。。次优:)使用类的完整(限定)名称句点显式命名该类。