PHP数组的意外行为

时间:2011-04-06 21:59:00

标签: php syntax

由于你不能在一个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的别名)

2 个答案:

答案 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'是一个表达式,因而是错误。