这似乎是一个相当简单的反思问题,但我无法理解它。我在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());
}
有没有人知道在哪里寻找以及如何调试它?
答案 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);