Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从别名命名空间中的字符串名称创建新类实例_Php_Namespaces - Fatal编程技术网

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为了您的清晰/简洁,“(尝试)”正是该方法更为。。。次优:)使用类的完整(限定)名称句点显式命名该类。