由于你不能在一个define或一个类常量中有一个数组,我想我会为我的项目创建一个抽象类,它需要比简单值更多的结构。
起初我以为我会尝试以下内容,但这会导致第6行出现语法错误:
<?php
abstract class Config
{
static private
$paths = array (
'classes' . _DS . 'cmsItems',
'classes' . _DS . 'dbdrivers',
'classes' . _DS . 'core'
);
static public function getPaths ()
{
return self::$paths;
}
}
?>
然后我尝试在getter中定义静态数组而不是私有属性。
<?php
abstract class Config
{
static public function getPaths ()
{
static $paths = array (
'classes' . _DS . 'cmsItems',
'classes' . _DS . 'dbdrivers',
'classes' . _DS . 'core'
);
return $paths;
}
}
?>
这只会导致第7行的语法错误
但是如果我删除了静态关键字......
<?php
abstract class Config
{
static public function getPaths ()
{
$paths = array (
'classes' . _DS . 'cmsItems',
'classes' . _DS . 'dbdrivers',
'classes' . _DS . 'core'
);
return $paths;
}
}
?>
这似乎工作正常(除了现在每次运行函数时都会创建数组,这对我来说似乎有点浪费)。
有人可以解释这里发生了什么吗?
(仅供参考,_DS在其他地方定义,只是DIRECTORY_SEPARATOR的别名)
答案 0 :(得分:2)
引用页面Static Keyword:
与任何其他PHP静态变量一样, 静态属性可能只是 使用文字或文字初始化 不变; 表达式不是 允许强>
是的,就在那之后,据说:
因此,在时,您可以初始化静态 属性为整数或数组 (例如),您可能无法初始化 它是另一个变量,一个函数 返回值,或对象。
但是,仍然禁止表达。
使用时:
static private
$paths = array (
'classes' . _DS . 'cmsItems',
'classes' . _DS . 'dbdrivers',
'classes' . _DS . 'core'
);
你在那里有表达式 - 我正在考虑字符串连接:你的数组内容不是常数,在编译时不知道(人们不知道它只是看着这部分代码)
如果您删除这些表达式,并且您的代码看起来像(例如;我只是用字符串中的_
替换了连接):
static private
$paths = array (
'classes_cmsItems',
'classes_dbdrivers',
'classes_core'
);
没有表达 - 因此,没有错误。
答案 1 :(得分:0)
来自:http://php.net/manual/en/language.oop5.static.php
“与任何其他PHP静态变量一样,静态属性只能使用文字或常量初始化;不允许使用表达式。因此,虽然您可以将静态属性初始化为整数或数组(例如),但您可能无法初始化它到另一个变量,函数返回值或对象。“
你的行:'classes' . _DS . 'cmsItems'
是一个表达式,因而是错误。