2014-02-21 12 views
1

我試過在一個類中的私有數組訪問功能,但我有一個錯誤:爲什麼在一個類中沒有的功能私人陣列

解析錯誤:語法錯誤,意外‘(’,在CODE期待 ')' 第17個錯誤解析代碼

,這是我的代碼:

<?php 

function foo_function() { 

    return 'foo_value'; 
} 

class foo { 

    private $good_foo_var = array (

     'foo_key' => 'anything' 
    ); 

    private $bad_foo_var = array (

     'foo_key' => foo_function() 
    ); 

    public function get_the_foo() { 

     return $this -> foo_var['foo_key']; 

    } 

} 

我不知道爲什麼。在課外,這種任務是沒有問題的。

+2

這同一個事實,即它們在類定義中定義的屬性在編譯時被實例化的事情。函數在編譯期間不可用,因此需要在運行時執行此類屬性的實例化。這就是爲什麼你不應該在定義中提供這樣的值,而是在構造函數中。 – Tularis

+0

您的foo_function()在類文件中超出範圍。 –

+0

範圍不是問題;在PHP中,所有函數都在全局範圍內,而不管它們在哪裏定義(除非在名稱空間中定義) – Tularis

回答

1

在你的類中定義的屬性在編譯期間被實例化。這意味着該值不被評估,但必須是一個常數值。函數返回值不是常量值,因此必須在運行時進行評估。爲此,你應該在你的構造函數中實例化它們。

更多信息請參見該PHP documentation

3

這是因爲目前你不能在你的屬性默認值有任何東西,但沒有運行時評估的東西。這意味着 - 如果某些東西將在運行時進行評估,則不能將其用於屬性默認值。

爲了克服這種情況,使用類的構造函數:

class foo 
{ 

    private $good_foo_var = array (

     'foo_key' => 'anything' 
    ); 

    public function get_the_foo() 
    { 

     return $this -> foo_var['foo_key']; 

    } 

    public function __construct() 
    { 
     $this->bad_foo_var = array (
      'foo_key' => foo_function() 
     ); 
    } 

} 

然而,由於PHP 5.6將被釋放,constant expressions將可使用在這種情況下。他們不會允許你在那裏使用只是,但肯定會允許更寬的默認值定義。

要理解此限制,您需要了解屬性的語法有意定義默認屬性值,它不能是動態的。即「默認」本身的意義假定在啓動時必須知道該值。

+0

更多,是的;但仍然不是這樣的功能。 – Tularis

+0

@Tularis是的,因爲這違背了什麼是_default value_ –