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

时间:2010-05-07 04:50:01

标签: php class const constants

我知道你可以使用字符串连接相互创建全局常量:

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

  

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

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

那么有什么方法可以在foo2之类的简单集合中创建类常量?

6 个答案:

答案 0 :(得分:34)

唯一的方法是定义()一个表达式,然后在类

中使用该常量
define('foobar', 'foo' . 'bar');

class Foo
{
    const blah = foobar;
}

echo Foo::blah;

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

答案 1 :(得分:21)

Imho,这个问题应该得到 PHP 5.6 + 的答案,感谢@jammin comment

从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

答案 2 :(得分:14)

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

关于constants

  

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

所以......“不”就是答案:D

答案 3 :(得分:2)

对于 class 常量,除了常量表达式之外,不能指定任何其他内容。引用PHP manual

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

答案 4 :(得分:1)

这可能不是您正在寻找的,但我遇到了这个帖子,所以这里有一个解决方案,我用于我遇到的问题(根据@ user187291的答案):

define('app_path', __DIR__ . '/../../');
const APPLICATION_PATH = app_path;
.
.
.
require_once(APPLICATION_PATH . "some_directory/some_file.php");
.
.
.

似乎工作得很棒!

答案 5 :(得分:0)

没有

(我认为没有)