我可以使用string连接在PHP中定义类CONST吗?
我知道你可以使用string连接来相互创build全局常量:
define('FOO', 'foo'); define('BAR', FOO.'bar'); echo BAR;
将打印“foobar”。
但是,我得到一个错误,试图使用类常量来做同样的事情。
class foobar { const foo = 'foo'; const foo2 = self::foo; const bar = self::foo.'bar'; }
foo2的定义没有问题,但是声明const bar会出错
parsing错误:语法错误,意外的'。',期待','或';'
我也尝试过使用像sprintf()这样的函数,但是它不像string连接符'''那样喜欢左边的文字。
那么有没有什么办法可以创build类常量,而不是像foo2这样的小事例呢?
Imho,这个问题值得PHP 5.6+的答案,感谢@jammin 评论
从PHP 5.6开始,您可以为一个常量定义一个静态标量expression式:
class Foo { const BAR = "baz"; const HAZ = self::BAR . " boo\n"; }
虽然这不是问题的一部分,但应该意识到实施的局限性。 以下内容不起作用,尽pipe它是静态内容(但可能会在运行时操作):
class Foo { public static $bar = "baz"; const HAZ = self::$bar . " boo\n"; } // PHP Parse error: syntax error, unexpected '$bar' (T_VARIABLE), expecting identifier (T_STRING) or class (T_CLASS) class Foo { public static function bar () { return "baz";} const HAZ = self::bar() . " boo\n"; } // PHP Parse error: syntax error, unexpected '(', expecting ',' or ';'
有关更多信息,请参阅: https : //wiki.php.net/rfc/const_scalar_exprs和http://php.net/manual/en/language.oop5.constants.php
唯一的方法是定义()一个expression式,然后在类中使用该常量
define('foobar', 'foo' . 'bar'); class Foo { const blah = foobar; } echo Foo::blah;
另一个select是去bugs.php.net,请问他们解决这个问题。
总是回到这样的东西的可靠手册。
关于常量 :
该值必须是常量expression式,而不能是(例如)variables,属性,math运算的结果或函数调用。
所以…“否”将是答案:D
对于类常量,除了常量expression式之外,您不能分配任何东西。 引用PHP手册 :
“该值必须是一个常量expression式,而不是(例如)一个variables,一个属性,一个math运算的结果或一个函数调用。”
这可能不是直接find你想要的,但我碰到这个线程,所以这里是我用于解决我遇到的一个问题的解决scheme(基于@ user187291的答案):
define('app_path', __DIR__ . '/../../'); const APPLICATION_PATH = app_path; . . . require_once(APPLICATION_PATH . "some_directory/some_file.php"); . . .
似乎很好的工作!
没有。
(我不认为有)