Неожиданное поведение с массивами PHP - PullRequest
1 голос
/ 07 апреля 2011

Поскольку у вас не может быть массива в определении или константе класса, я подумал, что создам абстрактный класс для данных конфигурации для моего проекта, который должен иметь больше структур, чем простых значений.

Сначала я думал, что попробую что-то вроде следующего, но это привело к синтаксической ошибке в строке 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;
    }
}
?>

Затем я попытался определить статический массив внутри геттера вместо частного свойства.

<?php
abstract class Config
{
    static public function getPaths ()
    {
        static $paths   = array (
            'classes' . _DS . 'cmsItems',
            'classes' . _DS . 'dbdrivers',
            'classes' . _DS . 'core'
        );
        return $paths;
    }
}
?>

Это только что привело к синтаксической ошибке в строке 7

Но если я уберу ключевое слово static ...

<?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 ]

2 голосов
/ 07 апреля 2011

Цитирование страницы Статическое ключевое слово :

Как и любая другая статическая переменная PHP, статические свойства могут быть только инициализируется с использованием литерала или постоянная; выражения не являются разрешено .

Да, сразу после этого сказано:

Так что пока вы можете инициализировать статический свойство целое число или массив (например), вы не можете инициализировать это к другой переменной, к функции возвращаемое значение или объекту.

Но, тем не менее, выражения запрещены .


При использовании этого:

static private
    $paths  = array (
        'classes' . _DS . 'cmsItems',
        'classes' . _DS . 'dbdrivers',
        'classes' . _DS . 'core'
    );

У вас там есть выражения - я думаю о конкатенации строк: содержимое вашего массива не является константой, оно не известно во время компиляции (невозможно узнать это, просто глядя на эту часть код) .


Если вы удалите эти выражения , и ваш код будет выглядеть следующим образом (например, я только что заменил конкатенации на _ в строках) :

static private
    $paths  = array (
        'classes_cmsItems',
        'classes_dbdrivers',
        'classes_core'
    );

Там не будет никакого выражения - и, следовательно, без ошибок.

0 голосов
/ 07 апреля 2011

От: http://php.net/manual/en/language.oop5.static.php

"Как и любая другая статическая переменная PHP, статические свойства могут быть инициализированы только с использованием литерала или константы; выражения недопустимы. Поэтому, хотя вы можете инициализировать статическое свойство целым числом или массивом (например), вы не можете инициализировать это к другой переменной, к возвращаемому значению функции или к объекту. "

Ваша строка: 'classes' . _DS . 'cmsItems' является выражением и, следовательно, ошибкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...