3 回答

TA贡献1906条经验 获得超10个赞
在PHP中声明类常量或属性时,只能为默认值指定原始值。因此,例如,该类声明将不起作用:
class TEST {
const ABC = 2 * 4;
const DEF = some_function();
static $GHI = array(
'key'=> 5 * 3,
);
}
但是该类声明将:
class TEST {
const ABC = 8;
static $GHI = 15;
}
这些规则适用于类常量/属性的默认值 -您始终可以使用表达式的结果初始化其他变量:
$a= array(
'a'=> 1 * 2,
'b'=> 2 * 2,
'c'=> 3 * 2,
);
此类声明行为的原因如下:表达式就像动词。他们做某事。类就像名词:它们声明某些东西。声明性声明绝不应该产生动作声明的副作用。需要原始默认值将强制执行此规则。
考虑到这一点,我们可以按以下方式重构原始类:
class SDK
{
static protected $_types= null;
static public function getType($type_name) {
self::_init_types();
if (array_key_exists($type_name, self::$_types)) {
return self::$_types[$type_name];
} else {
throw new Exception("unknown type $type_name");
}
}
static protected function _init_types() {
if (!is_array(self::$_types)) {
self::$_types= array(
'STRING_NONE'=> 1 << 0,
// ... rest of the "constants" here
'STRING_HOSTS'=> 1 << 6
);
}
}
function __construct($fString = null) {
if (is_null($fString)) {
$fString= self::getType('STRING_NONE') & self::getType('STRING_HOSTS');
}
var_dump($fString);
}
}
$SDK &= new SDK(SDK::getType('STRING_HOSTS'));

TA贡献1891条经验 获得超3个赞
PHP类属性能不能在它的声明中表达。
[...]该声明可以包括一个初始化,但是此初始化必须是一个常量值-也就是说,它必须能够在编译时进行评估,并且必须不依赖于运行时信息才能进行评估。[...]
资料来源:PHP手册:属性
以下代码可以正常工作,因为它的信息可以在编译时确定,并且不需要编译器在其他任何地方查找,执行任何数学或字符串函数来获取信息。
class goodExample
{
// These are OK.
var $Var = 1;
const consts = 'I\'m a Constant Property of the class goodExample.';
static $static = array(FALSE, TRUE);
}
另一方面,以下内容无效,因为必须解析其值才能获得其真实值。这一点在PHP中根本无效。在var $Var需要数学运算。该const consts要求concations和varable仰望得到它的价值,这样的两个原因一个是行不通的。最后,该static属性还$static需要进行两次数学运算才能获得其真实值。
class badExample
{
// These are NOT OK.
var $Var = 1 + 1;
const consts = "I'm a constant property of the class " . __CLASS__ . '.';
static $static = array((1 << 0), (1 << 2));
}
Consts和Static关键字
声明这些属性后,它们的值将无法更改。
const
[...]常量与普通变量的不同之处在于,您不使用$符号来声明或使用它们。
该值必须是一个常量表达式,而不是(例如)变量,属性,数学运算结果或函数调用。
接口也可以具有常量。
资料来源:PHP手册:类常量
static
[...]将类属性或方法声明为静态可以使它们无需类的实例化即可访问。实例化的类对象无法访问声明为static的属性(尽管可以使用static方法)。
资料来源:PHP手册:静态关键字
Static 可以在类外部使用,只要您引用类名称即可。

TA贡献1825条经验 获得超4个赞
PHP之所以能够做到(1 << 0)
这一点,仅仅是因为您在使用var
时应该使用const
。另外,这样做self::VARIABLE
是针对静态变量的,我相信应该这样做self::$variable
(除非您将它们定义为const
没有找到匹配的内容?试试慕课网站内搜索吧
- 3 回答
- 0 关注
- 586 浏览
添加回答
举报