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

Я видел этот пример с 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 (класс отца) должна использовать константу. Есть идеи?

Ответы [ 5 ]

80 голосов
/ 13 декабря 2012

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

11 голосов
/ 27 апреля 2017

С 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 имеет два совершенно разных значения:

class StaticDemo {
    static function demo() {
        // Type 1: `static` defines a static variable.
        static $Var = 'bar';

        // Type 2: `static::` is a reference to the called class.
        return static::VALUE;
    }
}
4 голосов
/ 13 марта 2010

вместо

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

Сделай это

$c = get_class( $this );
echo constant($c . '::MY_CONST');
0 голосов
/ 11 сентября 2012

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

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
0 голосов
/ 12 марта 2010

Я не смог заставить его работать с 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'

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...