Get parent расширяет класс в php
У меня есть код oop php:
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?
спасибо
Ответы
Ответ 1
В вашем коде вы использовали parent, что на самом деле является тем, что вам нужно. Проблема заключается в волшебной переменной __CLASS__
.
В документации указано:
Начиная с PHP 5 эта константа возвращает имя класса, как было объявлено.
Это то, что нам нужно, но как отмечено в этом комментарии на php.net:
claude отметил, что __CLASS__
всегда содержит класс, в который он вызван, если вы предпочитаете, чтобы класс, который вызвал метод, использовал get_class ($ this). Однако это работает только с экземплярами, а не при вызове статически.
Если вам нужен только родительский класс, то это также функция для этого. Это называется get_parent_class
Ответ 2
Вы можете использовать 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)
.
Ответ 3
class a {
// with propertie and functions
}
class b extends a {
public function test() {
echo get_parent_class($this);
}
}
$b = new b();
$b->test();
Ответ 4
Вы можете использовать отражение, чтобы сделать это:
Вместо
parent::__CLASS__;
использование
$ref = new ReflectionClass($this);
echo $ref->getParentClass()->getName();
Ответ 5
Используйте 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