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

2022-08-30 10:37:29

我知道您可以使用字符串串联创建彼此相关的全局常量:

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 柱线会出错

解析错误:语法错误、意外的“.”、预期的“、”或“;”

我也尝试过使用像sprintf()这样的函数,但它不喜欢左边的paren,就像字符串连接器'.'一样。

那么,有没有办法在像foo2这样的琐碎集合情况下创建彼此相关的类常量呢?


答案 1

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

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

class Foo
{
    const blah = foobar;
}

echo Foo::blah;

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


答案 2

恕我直言,这个问题值得PHP 5.6 +的答案,感谢@jammin评论

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

class Foo { 
  const BAR = "baz";
  const HAZ = self::BAR . " boo\n"; 
}

虽然这不是问题的一部分,但人们应该意识到执行的局限性。尽管它是静态内容(但可能在运行时操作),但以下内容将不起作用:

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_exprshttp://php.net/manual/en/language.oop5.constants.php


推荐