получить родительский расширяет класс в PHP - PullRequest
13 голосов
/ 26 ноября 2011

У меня есть код 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 из моего класса б?

спасибо

Ответы [ 5 ]

17 голосов
/ 26 ноября 2011

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

Документация гласит:

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

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

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

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

16 голосов
/ 26 ноября 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).

11 голосов
/ 26 ноября 2011
class a {
  // with propertie and functions
}

class b extends a {

   public function test() {
      echo get_parent_class($this);
   }
}


$b = new b();
$b->test();
10 голосов
/ 26 ноября 2011

Вы можете использовать отражение, чтобы сделать это:

Вместо

parent::__CLASS__;

использование

$ref = new ReflectionClass($this);
echo $ref->getParentClass()->getName();
6 голосов
/ 26 ноября 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...