在PHP中定义类常量

时间:2010-02-24 22:50:16

标签: php constants

我想使用现有常量和字符串的串联来定义类常量。我无法预定义它,因为只允许使用标量来预定义常量,所以我现在将它作为构造函数的一部分,并使用defined()函数检查它是否已经定义。这个解决方案有效,但我的常数现在已经不必要了。

有没有办法在运行时在php中定义类常量?

谢谢。

3 个答案:

答案 0 :(得分:9)

请参阅PHP manual on Class constants

  

值必须是常量表达式,而不是(例如)变量,属性,数学运算的结果或函数调用。

换句话说,这是不可能的。你可以用runkit_constant_add来做,但强烈建议不要使用这种猴子补丁。

答案 1 :(得分:3)

另一种选择是使用魔术方法__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");
    }
}

答案 2 :(得分:3)

根据Gordon's answer,您无法完全按照自己的意愿行事。但是,你可以做这样的事情。您只能设置一次:

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;
    }
}