2011-04-06 81 views
1

因爲你不能在一個定義或類常量中有一個數組我想我會爲我的項目創建一個配置數據的抽象類,它需要比簡單的值更多的結構。PHP數組意外的行爲

起初,我以爲我會嘗試像以下,而這導致了一個語法錯誤,在第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行

一個語法錯誤,但如果我刪除了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

引用的頁面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' 
    ); 

將不會有表達 - 而且,沒有錯誤。

0

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

「像任何其他PHP靜態變量,靜態屬性可以僅使用文字或恆定初始化;表達式不允許因此,儘管你可以初始化一個靜態屬性爲整數或陣列(。例如),您可能不會將其初始化爲另一個變量,函數返回值或對象。「

您的線路:'classes' . _DS . 'cmsItems'是一個表達式,因此是錯誤。