Определение константы класса в PHP - PullRequest
7 голосов
/ 25 февраля 2010

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

Есть ли способ определить константу класса во время выполнения в php?

Спасибо.

Ответы [ 3 ]

9 голосов
/ 25 февраля 2010

См. Руководство по PHP для констант класса

Значение должно быть константным выражением, а не (например) переменной, свойством, результатом математической операции или вызова функции.

Другими словами, это невозможно. Вы можете сделать это с помощью runkit_constant_add , но такого рода исправления обезьян настоятельно не рекомендуется.

3 голосов
/ 25 февраля 2010

Вы не можете делать в точности то, что хотите, за ответ Гордона . Тем не менее, вы можете сделать что-то вроде этого. Вы можете установить его только один раз:

class MyClass
{
    private static $myFakeConst;

    public getMyFakeConst()
    {
        return self::$myFakeConst;
    }

    public setMyFakeConst($val)
    {
        if (!is_null(self::$myFakeConst))
            throw new Exception('Cannot change the value of myFakeConst.');

        self::$myFakeConst = $val;
    }
}
3 голосов
/ 25 февраля 2010

Другой вариант - использовать магические методы __get () и __set (), чтобы отклонить изменения определенных переменных. Это не столько константа, сколько переменная только для чтения (с точки зрения других классов). Примерно так:

// Completely untested, just an idea
// inspired in part from the Zend_Config class in Zend Framework
class Foobar {

    private $myconstant;

    public function __construct($val) {
        $this->myconstant = $val;
    }

    public function __get($name) {
        // this will expose any private variables
        // you may want to only allow certain ones to be exposed
        return $this->$name;
    }

    public function __set($name) {
        throw new Excpetion("Can't set read-only property");
    }
}
...