首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP数组的意外行为

PHP数组的意外行为
EN

Stack Overflow用户
提问于 2011-04-07 05:59:00
回答 2查看 102关注 0票数 1

因为在定义或类常量中不能有数组,所以我想我应该为我的项目创建一个配置数据的抽象类,它需要更多的结构而不是简单的值。

起初,我认为我应该尝试类似以下的操作,但这导致了第6行出现语法错误:

代码语言:javascript
运行
复制
<?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中定义一个静态数组,而不是私有属性。

代码语言:javascript
运行
复制
<?php
abstract class Config
{
    static public function getPaths ()
    {
        static $paths   = array (
            'classes' . _DS . 'cmsItems',
            'classes' . _DS . 'dbdrivers',
            'classes' . _DS . 'core'
        );
        return $paths;
    }
}
?>

这只会导致第7行出现语法错误

但是如果我删除static关键字..。

代码语言:javascript
运行
复制
<?php
abstract class Config
{
    static public function getPaths ()
    {
        $paths  = array (
            'classes' . _DS . 'cmsItems',
            'classes' . _DS . 'dbdrivers',
            'classes' . _DS . 'core'
        );
        return $paths;
    }
}
?>

这似乎工作得很好(除了现在每次运行函数时都会创建数组,这在我看来有点浪费)。

有人能解释一下这是怎么回事吗?

(仅供参考,_DS在其他地方定义,只是DIRECTORY_SEPARATOR的别名)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-07 06:04:01

引用页面:

与任何其他

静态变量一样,静态属性只能使用文字或常量进行初始化;表达式不允许使用

是的,就在那之后,有人说:

因此,虽然您可以将静态属性初始化为整数或数组(例如),但您不能将其初始化为另一个变量、函数返回值或对象。

但是,仍然禁止使用表达式。

使用此命令时:

代码语言:javascript
运行
复制
static private
    $paths  = array (
        'classes' . _DS . 'cmsItems',
        'classes' . _DS . 'dbdrivers',
        'classes' . _DS . 'core'
    );

您在其中有表达式--我在考虑字符串连接:数组的内容不是常量,它在编译时是未知的(只看这部分代码是无法知道的)。

如果您删除了这些表达式,您的代码将如下所示(例如,我只是将字符串中的连接替换为``_ ):

代码语言:javascript
运行
复制
static private
    $paths  = array (
        'classes_cmsItems',
        'classes_dbdrivers',
        'classes_core'
    );

将不会有任何表达式--因此,没有错误。

票数 2
EN

Stack Overflow用户

发布于 2011-04-07 06:05:59

来自:http://php.net/manual/en/language.oop5.static.php

与任何其它PHP静态变量一样,静态属性只能使用文字或常量进行初始化;不允许使用表达式。因此,虽然可以将静态属性初始化为整数或数组(例如),但不能将其初始化为另一个变量、函数返回值或对象。

您的代码行:'classes' . _DS . 'cmsItems'是一个表达式,因此是错误的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5573481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档