Как получить доступ к константе, определенной в дочернем классе, из функций родительского класса?

Я видел этот пример с php.net:

<?php class MyClass { const MY_CONST = "yonder"; public function __construct() { $c = get_class( $this ); echo $c::MY_CONST; } } class ChildClass extends MyClass { const MY_CONST = "bar"; } $x = new ChildClass(); // prints 'bar' $y = new MyClass(); // prints 'yonder' ?> 

Но $ c :: MY_CONST распознается только в версии 5.3.0 или новее. Класс, который я пишу, может распространяться очень много.

В принципе, я определил константу в ChildClass, и одна из функций MyClass (класс отца) должна использовать константу. Есть идеи?

Как насчет использования static::MY_CONST ?

Вместо

 $c = get_class( $this ); echo $c::MY_CONST; 

Сделай это

 $c = get_class( $this ); echo constant($c . '::MY_CONST'); 

Я не мог заставить его работать с const, поскольку он печатает «yonderyonder» (это то, что касается констант, они не меняются), но он отлично работает с var:

 <?php class MyClass { var $MY_CONST = "yonder"; public function __construct() { echo $this->MY_CONST; } } class ChildClass extends MyClass { var $MY_CONST = "bar"; } $x = new ChildClass(); // prints 'bar' $y = new MyClass(); // prints 'yonder' ?> 

Если вам нужно получить доступ к константам, свойствам, методам классов или объектам, которые вы можете использовать для отражения , он предоставляет гораздо больше информации о структуре объекта.
пример:

 class MainClass { const name = 'Primary'; public $foo = 'Foo Variable'; } class ExtendedClass extends MainClass { const name = 'Extended'; } /** * From Class Name */ //get reflection of main class $mainReflection = new ReflectionClass('MainClass'); if($mainReflection->hasConstant('name')) var_dump($mainReflection->getConstant('name'));//Primary //get reflection of extended class $extendedReflection = new ReflectionClass('ExtendedClass'); if($extendedReflection->hasConstant('name')) var_dump($extendedReflection->getConstant('name'));//Extended /** * From Objects */ $main = new MainClass(); $extended = new ExtendedClass(); //get reflection of main class $mainReflection = new ReflectionObject($main); if($mainReflection->hasConstant('name')) var_dump($mainReflection->getConstant('name'));//Primary //get reflection of extended class $extendedReflection = new ReflectionObject($extended); if($extendedReflection->hasConstant('name')) var_dump($extendedReflection->getConstant('name'));//Extended 

Поскольку php 5.3:

Использовать static::MY_CONST


Подробнее о static

В этом случае ключевое слово static является ссылкой на фактически называемый класс.

Это иллюстрирует разницу между static $var , static::$var и self::$var :

 class Base { const VALUE = 'base'; static function testSelf() { // Output is always 'base', because `self::` is always class Base return self::VALUE; } static function testStatic() { // Output is variable: `static::` is a reference to the called class. return static::VALUE; } } class Child extends Base { const VALUE = 'child'; } echo Base::testStatic(); // output: base echo Base::testSelf(); // output: base echo Child::testStatic(); // output: child echo Child::testSelf(); // output: base 

Также обратите внимание, что ключевое слово static имеет 2 совершенно разных значения:

 class StaticDemo { static function demo() { static $Var = 'bar'; // Type 1: `static` defines a static variable. return static::VALUE; // Type 2: `static::` is a reference to the called class. } }