Доступ к константам класса PHP

В руководстве PHP говорится

Как и статические члены, константные значения не могут быть доступны из экземпляра объекта.

который объясняет, почему вы не можете этого сделать

$this->inst = new Classname();
echo $this->inst::someconstant;

но тогда почему это работает?

$this->inst = new Classname();
$inst = $this->inst;
echo $inst::someconstant;

Ответы

Ответ 1

Из интерактивной оболочки PHP:

php > class Foo { const A = 'a!'; }
php > class Bar { public $foo; }
php > $f = new Foo;
php > $b = new Bar;
php > $b->foo = $f;
php > echo $b->foo::A;
PHP Parse error:  syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM, expecting ',' or ';' in php shell code on line 1

Причина, по которой предыдущий синтаксис терпит неудачу, заключается в том, что парсер PHP не знает, как разрешить двойную двоеточие после ссылки на свойство. Независимо от того, намерено это или нет, неизвестно.

Последний синтаксис работает, потому что он не проходит через свойство напрямую, а через локальную переменную, которую парсер принимает как что-то, с чем он может работать:

php > $inst = $b->foo;
php > echo $inst::A;
a!

(Кстати, это одно и то же ограничение для анонимных функций как свойств. Вы не можете их напрямую называть с помощью parens, вы должны сначала назначить их другой переменной, а затем вызвать их оттуда. Это было исправлено в PHP trunk, но я не знаю, исправили ли они также двойной синтаксис двоеточия.)

Ответ 2

Процитировать руководство:

Начиная с PHP 5.3.0, можно ссылаться на класс, используя переменную. Значение переменной не может быть ключевым словом (например, self, parent и static).

Далее этот пример используется:

$class = new MyClass();
echo $class::constant."\n"; // As of PHP 5.3.0

Итак, $inst::someconstant должен работать.

Что касается того, почему $this->inst::someconstant дает ошибку синтаксического анализа, я не знаю. PHP смешно в некоторых вещах.

Ответ 3

Если вы находитесь внутри класса, вы можете получить доступ к константе следующим образом:

self::MY_CONSTANT;

Например:

class MyClass
{
    const MY_CONSTANT = 'constant value';

    function showConstant() {
        echo  self::MY_CONSTANT;
    }
}

http://php.net/manual/en/language.oop5.constants.php

Ответ 4

php поддерживает доступ к константам класса из экземпляра объекта. Ниже приведен код ниже (проверено в phpv5.5.5):

<?php
class superheroes{
    const kal_el = 'Superman';
}

$instance = new superheroes;
echo $instance::kal_el;

Источник: http://dwellupper.io/post/48/defining-class-constants-in-php