Я видел этот пример с 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. } }