我可以使用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"); . . . 

似乎很好的工作!

没有。

(我不认为有)