получить родительский класс расширяет в php

У меня есть код PHP oop:

class a {
    // with properties and functions
}

class b extends a {
    public function test() {
        echo __CLASS__; // this is b
        // parent::__CLASS__ // error
    }
}

$b = new b();
$b->test();

У меня есть несколько родительских классов (обычных и абстрактных) и много дочерних классов. Дочерние классы расширяют родительские классы. Поэтому, когда я в какой-то момент создаю экземпляр ребенка, мне нужно узнать, какого родителя я назвал.

например, функция b::test() вернет a

Как я могу получить (из моего кода) класс a из моего класса b?

Благодарность


person ana    schedule 26.11.2011    source источник
comment
прочтите это: stackoverflow.com/questions/506705/   -  person Book Of Zeus    schedule 26.11.2011


Ответы (4)


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

В документации говорится:

Начиная с PHP 5, эта константа возвращает имя класса в том виде, в котором оно было объявлено.

Это то, что нам нужно, но как указано в этом комментарии на php.net :

Клод отметил, что __CLASS__ всегда содержит класс, в котором он вызывается, если вы предпочитаете, чтобы класс, который вызвал метод, использовал вместо этого get_class ($ this). Однако это работает только с экземплярами, а не при статическом вызове.

Если вам нужен только родительский класс, для этого есть функция. Этот называется get_parent_class.

person Jan Dragsbaek    schedule 26.11.2011

Вы можете использовать get_parent_class:

class A {}
class B extends A {
  public function test() {
    echo get_parent_class();
  }
}

$b = new B;
$b->test(); // A

Это также будет работать, если B::test статичен.

ПРИМЕЧАНИЕ. Существует небольшая разница между использованием get_parent_class без аргументов и передачей $this в качестве аргумента. Если мы расширим приведенный выше пример с помощью:

class C extends B {}

$c = new C;
$c->test(); // A

Мы получаем A в качестве родительского класса (родительский класс B, в котором вызывается метод). Если вам всегда нужен ближайший родитель для объекта, который вы тестируете, вы должны вместо этого использовать get_parent_class($this).

person connec    schedule 26.11.2011

Для этого вы можете использовать отражение:

Вместо

parent::__CLASS__;

использовать

$ref = new ReflectionClass($this);
echo $ref->getParentClass()->getName();
person Robik    schedule 26.11.2011

Вместо этого используйте class_parents. Это даст множество родителей.

<?php
class A {}
class B extends A {
}
class C extends B {
    public function test() {
        echo implode(class_parents(__CLASS__),' -> ');
    }
}

$c = new C;
$c->test(); // B -> A
person Rifat    schedule 26.11.2011