2015-02-08 1 views
1

Комментарии в следующем коде показывают, что я пытаюсь выполнить, что-то очень просто: я хочу чтобы иметь возможность ссылаться на имя родительского класса с использованием встроенной константы PHP (или другой конструкции), такой как __CLASS__, но которая относится к родительскому классу, а не к текущему классу (например, parent::__CLASS__) (также, в то время как код не показывает его, если у меня есть subsubclass, то внутри такого класса я хочу иметь возможность ссылаться на родительский класс через что-то вроде parent::parent::__CLASS__, если это вообще возможно).Ссылаясь на имя суперкласса PHP через магическую константу/ключевое слово или аналогичную конструкцию (избегая присвоения имени суперкласса в производном классе)

class ParentClass { 

    protected $foo; 

    function __construct() { 

    $this->foo = "hello"; 

    } 

} 

class DerivedClass extends ParentClass { 

    public $bar; 

    public $baz; 

    function __construct($bar) { 

    // I want to be able to write 
    // something like parent:__CLASS__ 
    // here in place of 'ParentClass' 
    // so that no matter what I rename 
    // the parent class, this line will 
    // always work. Is this possible? 

//  if (is_a($bar, parent::__CLASS__)) { 

    if (is_a($bar, 'ParentClass')) { 

     $this->bar = $bar; 

    } else { 

     die("Unexpected."); 

    } 

    $this->baz = "world"; 

    } 

    public function greet() { 

    return $this->bar->foo . " " . $this->baz; 

    } 

} 

$d = new DerivedClass(new ParentClass()); 
echo $d->greet(); 

ВЫВОД:

hello world 
+1

Если я понял, что право я не понимаю, почему вы когда-нибудь понадобится такой грязный конструкт. Попытайтесь описать, какую реальную проблему вы пытаетесь решить с этим. – burzum

+2

Вы попробовали http://php.net/manual/en/function.get-parent-class.php? – MikeWu

+0

@burzum, подклассам часто приходится ссылаться на экземпляры родительских классов по нескольким причинам. Код, который я представил, предназначен только для иллюстративных целей. –

ответ

1

Вы должны get_parent_class функции, чтобы сделать это.

function __construct($bar) { 

    $parent = get_parent_class($this); 


    if (is_a($bar, $parent)) { 

     $this->bar = $bar; 

    } else { 

     die("Unexpected."); 

    } 

    $this->baz = "world"; 

    } 

если вам нужен дополнительный уровень вниз, вы можете использовать:

class subDerivedClass extents DerivedClass{ 
    $superParent = get_parent_class(get_parent_class($this)); 
} 
+1

Отлично, это отвечает на оба вопроса красиво (и параметр '$ this' не является обязательным). –

1

В PHP 5.5, вы можете использовать ключевое слово ::class получить имя класса родителя, но он будет работать только) из класса и б) только один уровень вверх, что является непосредственным родителем предок:

function __construct($bar) { 
    if ($bar instanceof parent::class) { 
     ... 
    } 
} 

Лучшим решением я бы пойти на это сцепление get_parent_class:

if ($bar instanceof get_parent_class(get_parent_class())) { 
    ... 
} 

или метод сцепления с помощью отражения:

$parent_class = (new Reflection($this))->getParentClass()->getParentClass()->getName(); 

if ($bar instanceof $parent_class) { 
    ... 
} 
+0

Это три способа сделать это. Приятно знать все подробности. Я думаю, что 'get_parent_class' является самым простым решением. Благодарю. –