我可以使用字符串连接在PHP中定义类CONST吗?

sel*_*lar 48 php const class constants

我知道你可以使用字符串连接以彼此的方式创建全局常量:

define('FOO', 'foo');
define('BAR', FOO.'bar');  
echo BAR;
Run Code Online (Sandbox Code Playgroud)

将打印'foobar'.

但是,我在使用类常量尝试执行相同操作时遇到错误.

class foobar {
  const foo = 'foo';
  const foo2 = self::foo;
  const bar = self::foo.'bar';
}
Run Code Online (Sandbox Code Playgroud)

foo2的定义没有问题,但声明const bar会出错

解析错误:语法错误,意外'.',期待','或';'

我也尝试过使用像sprintf()这样的函数,但它不像左边的paren那样比字符串连接符'.'.

那么有没有什么方法可以创建类常量,而不是像foo2那样简单的设置案例?

use*_*291 34

唯一的方法是定义()一个表达式,然后在类中使用该常量

define('foobar', 'foo' . 'bar');

class Foo
{
    const blah = foobar;
}

echo Foo::blah;
Run Code Online (Sandbox Code Playgroud)

另一个选择是去bugs.php.net并请他们解决这个问题.

  • 功能已添加到php 5.6 https://wiki.php.net/rfc/const_scalar_exprs. (10认同)
  • bug.php.net基本上告诉我他们不会修复它."这是实现中的一个限制.对于类常量,我们在编译时需要一个常量值,不能计算表达式.define()是一个常规函数,在运行时计算,因此可以包含任何形式的任何值.改变这意味着在编译器中添加一个执行阶段......"这实际上是BS,如下面的代码所示:define('BAR',ThisWorks :: foo.'bar'); class ThisWorks {const foo ='foo'; const bar = BAR; } echo ThisWorks :: bar; 这将输出'foobar'而没有错误. (8认同)
  • 对于其他寻找它的人来说,错误是[#42355](https://bugs.php.net/bug.php?id=42355). (2认同)
  • 为[PHP:糟糕设计的分形]推出另一个(http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/) (2认同)

Tre*_*her 22

Imho,这个问题值得回答PHP 5.6+,感谢@jammin 评论

从PHP 5.6开始,您可以为常量定义静态标量表达式:

class Foo { 
  const BAR = "baz";
  const HAZ = self::BAR . " boo\n"; 
}
Run Code Online (Sandbox Code Playgroud)

虽然它不是问题的一部分,但应该意识到实施的局限性.以下内容不起作用,虽然它是静态内容(但可能在运行时被操作):

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 ';'
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请查看:https://wiki.php.net/rfc/const_scalar_exprshttp://php.net/manual/en/language.oop5.constants.php


Pet*_*ley 14

对于像这样的东西,总是回到可靠的手册.

关于常数:

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

所以......"不"就是答案:D