我想使用现有常量和字符串的串联来定义类常量。我无法预定义它,因为只允许使用标量来预定义常量,所以我现在将它作为构造函数的一部分,并使用defined()函数检查它是否已经定义。这个解决方案有效,但我的常数现在已经不必要了。
有没有办法在运行时在php中定义类常量?
谢谢。
答案 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;
}
}