Подтвердить что ты не робот

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?

спасибо

4b9b3361

Ответ 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