Получение имени класса верхнего уровня при использовании наследования и псевдонима класса

#php #oop #class

#php #ооп #класс

Вопрос:

У меня есть несколько классов, расширенных таким образом:

 class Baseresidence extends CActiveRecord {
    public static function model($className=__CLASS__) {
        return parent::model($className); // framework needs, can't modify
    }    
}

class Site1Residence extends Baseresidence {

}
  

и, наконец

 class_alias('Site1Residence', 'Residence'); // this is part of an autoloader
  

Итак, в итоге у меня получается вот так Residence extends Site1Residence extends Baseresidence extends CActiveRecord

В базовом идентификаторе у меня есть статический метод model() , который извлекает экземпляр.

Теперь я могу вызвать::

 $r=Residence::model();
  

Проблема в том, что __CLASS__ в качестве значения по умолчанию используется константа, и на этом уровне это базовое значение, и мне нужно там имя класса верхнего уровня (созданное с помощью псевдонима), и оно должно быть ‘Residence’

если я сделаю:

 echo get_class($r); // the Baseresidence is printed
  

Цель состоит в том, чтобы напечатать residence

Я не хочу ничего передавать при вызове $r=Residence::model(); Я хотел бы разрешить это в корнях.

Как получить имя класса верхнего уровня на этом уровне?

Комментарии:

1. Константа __CLASS__ , используемая в классе, Baseresidence всегда будет содержать Baseresidence . Вы не можете это изменить.

Ответ №1:

Попробуйте

 get_called_class();
  

Смотрите http://php.net/manual/en/function.get-called-class.php

Из документации:

 class foo {
    static public function test() {
        var_dump(get_called_class());
    }
}

class bar extends foo {
}

foo::test();
bar::test();
  

Приведенный выше пример выведет:

 string(3) "foo"
string(3) "bar"
  

Комментарии:

1. Правильный ответ, но я заметил один комментарий: // framework needs, can't modify — если он не может изменить эту строку… Я не уверен, что он сможет использовать это решение.

2. Я могу изменить $className переменную раньше. Это хорошее решение, и get_called_class для PHP 5.2.4 тоже есть решение. php.net/manual/en/function.get-called-class.php

3. @OZ_, то, как я прочитал эту строку, заключается в том, что фреймворку требуется имя класса. Передача имени класса верхнего уровня не должна иметь негативного эффекта.

4. @Pentium10, посмотри в комментариях к этой странице документа, есть альтернативы этой функции для PHP 5.2

5. Также вы можете использовать static::class вместо