【问题标题】:Instantiating class by string using PHP 5.3 namespaces使用 PHP 5.3 命名空间按字符串实例化类
【发布时间】:2011-07-01 15:16:43
【问题描述】:

我无法解决使用字符串变量和 PHP 5.3 实例化新类的问题。命名空间。例如,这行得通;

$class = 'Reflection';
$object = new $class();

但事实并非如此;

$class = '\Application\Log\MyClass';
$object = new $class();

抛出一个致命错误,说明无法找到该类。但是,如果使用 FQN,它显然可以实例化,即;

$object = new \Application\Log\MyClass;

我发现这在 PHP 5.3.2-1 上很明显,但在以后的版本中没有。有解决办法吗?

【问题讨论】:

    标签: php namespaces autoload


    【解决方案1】:

    我遇到了同样的问题,我找到了解决这个问题的方法。可能效率不高,但至少有效。

    function getController($controller)
    {
        return new $controller;
    }
    
    $object = getController('Application\Log\MyClass');
    

    【讨论】:

      【解决方案2】:

      实现相同结果但使用动态参数的另一种方法如下。请考虑下面的类作为您要实例化的类。

      <?php
      
      // test.php
      
      namespace Acme\Bundle\MyBundle;
      
      class Test {
          public function __construct($arg1, $arg2) {
              var_dump(
                  $arg1,
                  $arg2
              );
          }
      }
      

      然后:

      <?php
      
      require_once('test.php');
      
      (new ReflectionClass('Acme\Bundle\MyBundle\Test'))->newInstanceArgs(['one', 'two']);
      

      如果您使用的不是最新版本的 PHP,请使用以下代码替换上面示例的最后一行:

      $r = new ReflectionClass('Acme\Bundle\MyBundle\Test');
      $r->newInstanceArgs(array('one', 'two'));
      

      代码将产生以下输出:

      string(3) "one"
      string(3) "two"
      

      【讨论】:

        【解决方案3】:
        $class = 'Application\Log\MyClass';
        $object = new $class();
        

        开头的\ 引入了一个(完全限定的)命名空间标识符,但它不是类名本身的一部分。

        【讨论】:

        • 您也可以将$class = __NAMESPACE__ . '\MyClass'; 用于命名空间
        猜你喜欢
        • 2012-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-12
        • 2016-07-25
        • 1970-01-01
        相关资源
        最近更新 更多