我知道你可以使用字符串连接相互创建全局常量:
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之类的简单集合中创建类常量?
答案 0 :(得分:34)
唯一的方法是定义()一个表达式,然后在类
中使用该常量define('foobar', 'foo' . 'bar');
class Foo
{
const blah = foobar;
}
echo Foo::blah;
另一个选择是去bugs.php.net并请他们解决这个问题。
答案 1 :(得分:21)
从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_exprs和http://php.net/manual/en/language.oop5.constants.php
答案 2 :(得分:14)
答案 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)
没有
(我认为没有)