2015-03-11 2 views
1

Это кажется довольно простой проблемой отражения, но я не могу понять это. Я использую Laravel 4.2 на Debian с PHP 5.6.6-1.Странное поведение отражения в php Laravel 4

Основном происходит то, что я хочу, чтобы породить новый объект из класса в 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()); 
} 

Кто-нибудь есть какие-либо указатели о том, где искать и как отладить это?

+2

Это натяжкой, но единственное, что я был в состоянии думать что-то делать с отражением/переменный метод не правильно подбирает пространства имен. Возможно, попробуйте определить класс, используя полное явное пространство имен? т. е. '$ twinfieldFactoryClass = '\ Pronamic \ Twinfield \ Customer \ CustomerFactory';'. Длинный выстрел, хотя .. –

ответ

1

ReflectionClass будет игнорировать ваше текущее пространство имен и use утверждений полностью. Вы должны указать полное имя класса:

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

Как пользователь указывает на php.net:

Для отражения на Namespaced класса в PHP 5.3, вы всегда должны указать полное имя класса - даже если вы сгенерировали существующее пространство имен с помощью оператора «use».


Обратите внимание, что вы могли бы работать вокруг этого путем передачи объекта:

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

$r = new ReflectionClass($test0);