我有一些必须生成脚本的php。部分内容非常静态,但数据是即时生成的。我曾经在另一种语言中遇到过类似的问题并使用不断的替代品来解决它。
我正在尝试做什么:
interface IConstants {
const SUBSTITUTE = '!substitute';
const FULL_STRING = 'var data = "' . self::SUBSTITUTE . '";';
}
class Util {
public static function replace($haystack, $needle, $replace) {
// implementation
}
}
class SampleClass {
public function getScript() {
$someData = $this->getData();
return Util::replace(IConstants::FULL_STRING, IConstants::SUBSTITUTE, $someData);
}
public function getData() {
// generate $someData
return $someData;
}
}
这个设计是否被PHP接受?如果是,我将如何实施它,如果不是,那么什么是合适的替代方案?
答案 0 :(得分:2)
与Java不同,PHP中至少在5.4.4中是不可能的。
docs说:
值必须是常量表达式,而不是(例如)变量, 属性,数学运算或函数调用的结果。
一个简单的尝试就是这样:
$ php -r 'const FOOBAR = "AF" . "A". "R"; '
PHP Parse error: syntax error, unexpected '.', expecting ',' or ';' in Command line code on line 1
使用:
$ php --version
PHP 5.4.4-14+deb7u14 (cli) (built: Aug 21 2014 08:36:44)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
对于全局常量,您可以使用define。
答案 1 :(得分:2)
替换发生在字符串上,因此被接受。但是,您收到的错误是由于PHP缺少常量表达式。 IE浏览器。你不能写使用另一个常量的常量。唯一可接受的语法是第二个常量等于第一个常量。
这已经改变了,但仅限于最新的PHP 5.6,它还不稳定:http://php.net/manual/en/migration56.new-features.php#migration56.new-features.const-scalar-exprs
答案 2 :(得分:1)
在5.6之前的PHP版本中,您无法执行此操作。在那些版本的PHP中,从constituant部分构建常量的唯一方法是使用define()。我必须仔细查看,但我不认为你可以使用define()来定义类/接口常量。
从PHP 5.6开始,您将能够定义这样的常量,但前提是它们是根据其他常量定义的。