php Laravel 4中奇怪的反射行为

时间:2015-03-11 15:01:11

标签: php reflection laravel-4

这似乎是一个相当简单的反思问题,但我无法理解它。我在Debian上使用Laravel 4.2和PHP 5.6.6-1。

基本上发生的事情是我想从Laravel QueueHandler中的类生成一个新对象,如下所示:

$className = 'MyClass';
$myobject = new $className ();

这并不起作用。我尝试了所有我能想到的东西,并且不知道在哪里看。这段代码不应该起作用:

<?php
use Pronamic\Twinfield\Secure\Config;
use Pronamic\Twinfield\Customer\CustomerFactory;

class TwinfieldQueueHandler {
  private $twinfieldConfig = null;

...

try {
  $twinfieldFactoryClass = 'CustomerFactory';

  //returns 0
  echo strcmp('CustomerFactory', $twinfieldFactoryClass);

  //works
  $test0 = new CustomerFactory ($this->twinfieldConfig);

  //throws an exeption with message:  "Class CustomerFactory does not exist"
  $r = new ReflectionClass($twinfieldFactoryClass);
  $test1 = $r->newInstanceArgs($this->twinfieldConfig);

  //gives error PHP Fatal error:  Class 'CustomerFactory' not found in {file} on line {line}
  $test2 = new $twinfieldFactoryClass ($this->twinfieldConfig);

} catch (Exception $e) {
  Log::error($e->getMessage());
}

有没有人知道在哪里寻找以及如何调试它?

1 个答案:

答案 0 :(得分:1)

ReflectionClass将完全忽略您当前的命名空间和use语句。您必须指定类的完全限定名称:

$r = new ReflectionClass('Pronamic\Twinfield\Customer\CustomerFactory');

用户指出php.net

  

要反映PHP 5.3中的命名空间类,必须始终指定类的完全限定名称 - 即使您使用“use”语句为包含命名空间设置别名。


请注意,您可以通过传递对象来解决此问题:

$test0 = new CustomerFactory ($this->twinfieldConfig);

$r = new ReflectionClass($test0);