2016-05-16 6 views
1

У меня есть 2 класса

class A { 

    // Do some stuff here! 

} 

и

class B { 

    public $class = 'A'; 

    public function getClass(){ 

     //Case 1 
     $class = $this->class; 
     return new $class(); //work 

     //Case 2 
     return new $this->class(); //NOT work 
     //or to be precise something like this 
     return new {$this->class}(); 

    } 

    // Do some other stuff here! 

} 

Почему пропусканием свойство класса в вар работы и доступа непосредственно NOT, как вы видите на класс выше, Случай 1 против Случай 2?

+1

Beacuse 'вернуть новый $ this-> класс();' неоднозначен .... вы имеете в виду 'вернуть новый ($ this-> class()); 'или вы имеете в виду' return new ($ this) -> class(); '? (скобки добавлены, чтобы показать потенциальную двусмысленность) –

+0

Just FYI: Точный код выше работал на моем Linux-сервере с PHP 5.6.21 отлично. – smozgur

+0

он работает для меня, как вы ожидали, с php 5.6 и 7 –

ответ

5

Причина в том,

$class = $this->class; 
return new $class(); 

Здесь $class будет содержать значение "A". Так он получит класс «А», когда вы звоните новый $class()

Но в

return new $this->class(); 

Он будет искать функции class() внутри класса «B». Так что это не сработает.

$this предназначен для представления экземпляра текущего класса. $this -> something() всегда будет проверять функции something() в том же классе

0

Да причина ваш делать это неправильно,

Это, как вы будете это делать,

class A { 

    public $class = 'A'; 

    function __construct() { 
    # code... 
    } 

    public function getClass(){ 
    return $this; 
    } 

    public function instance() { 
    return $this->class; 
    } 
} 

Чтобы получить объект/

$obj = new A(); 
$new_obj = $obj->getClass(); 

Чтобы получить значение экземпляра/$ класса,

$inst = $obj->instance(); 

$this относятся к самому классу,

0

Кажется, работает для меня, если я удалю '()' :).

return new $this->class; //Work just fine without parentheses 

Примечание: Я использую PHP 5.4.16

Смежные вопросы