2016-06-30 14 views
1

所以就像標題所說的那樣,我很難讓我的一個類的數組屬性將它的值聲明爲屬性&方法。PHP,OOP:爲什麼我的類的數組屬性不能使用屬性和方法作爲像類之外的數組那樣的值?

如果數組不是一個類的屬性,但只要數組放入類中,腳本不會喜歡這些值,並引發此錯誤。

致命錯誤:常量表達式包含在Ç無效操作:\ XAMPP \ htdocs_webdev \回購\ MCF \靜態\ INC \類\上線class.catalogue.php

我的兩個課程都包含在不同的.php中,名爲inc.classes.php。該文件隨即包含在每個頁面中。下面是一些代碼,以便更好地說明我的問題,

Master Class File:inc.classes.php

// config 
require_once('config/config.php'); // config file 

// other tools 
require_once(ROOT_DIR . 'inc/parsedown/Parsedown.php'); // tool that I am using for parsing .md files 

// my classes 
require_once(ROOT_DIR . 'inc/classes/class.vendor.php'); 
require_once(ROOT_DIR . 'inc/classes/class.catalogue.php'); 

Class A:class.vendor.php

class Vendor 
{ 
    public $vendor = array(
    'foo' => array(
     'name' => 'Foo Inc.', 
     'image' => (VENDOR_IMG . 'foo/foo-logo.png'), 
    ), 
    'bar' => array(
     'name' => 'Bar Co.', 
     'image' => (VENDOR_IMG . 'bar/bar-logo.png'), 
    ), 
); 

    public function get($data) { 
    if (array_key_exists($data, $this->vendors)) { 
     return $this->vendors[$data]; 
    } else { 
     // throw error 
    } 
    } 

    // Class methods... 
} 

Class B:class.catalogue.php

class Catalogue 
{ 
    public $catalogue = array(
    '1' => array(
     $section = $markdown->text(file_get_contents(ROOT_DIR . catalogue/markdown/section1.md')), 
     $link = 'catalogue/pdf/section1.pdf, 
     $pdf = (ROOT_DIR . $link), 
     'title' => 'Section One', 
     'content' => mdReplace($section, $pdf, $link), 
     'theme' => 'purple', 
     'vendors' => array(
     1 => $vendor->get('foo'), 
     2 => $vendor->get('bar'), 
    ), 
    ), 
    // '2' ... 
); 

    // Class methods... 
} 

mdReplace()是位於被稱爲inc.functions.php一個單獨的PHP文件的一個小功能。它的目的是要取代包含部分內容.md文件裏面的幾個關鍵詞。)提前

道歉,如果我只是盲目的蝙蝠,現在和我失去了一些東西明顯。

+0

如果(array_key_exists($數據,$這個 - >供應商)){我相信你有一個在此輸入。更正:如果(array_key_exists($ data,$ this-> vendor)){ – GoatHater

+0

@GoatHater看來我確實感謝您的注意!有趣的是如何錯別字更明顯的其他....該死的隧道視野.... :) – jordanbrauer

回答

3

如果你讀了PHP的OOP manual細心,在這裏你會看到什麼:

類成員變量被稱爲「屬性」 ...它們通過使用關鍵字公共,受保護的專用之後的一個常規變量聲明來定義。這個聲明可能包括一個初始化,但是這個初始化必須是一個常量值 - 也就是說,它必須能夠在編譯時進行評估,並且不能依賴運行時信息來進行評估。

看到這樣的語句

不能依賴於運行時信息

和當前的public $catalogue定義取決於一些數據,稍後將進行評估的。這就是爲什麼你有致命錯誤

所以,如上所述,解決方法是通過調用某個函數來填充$catalogue數據 - 例如明確地或在__construct中。

+0

謝謝!男人,我知道我在掩蓋某些明顯的東西。 – jordanbrauer

4

您不能像這樣在類屬性上運行方法。你需要設置你的構造內:

class Catalogue 
{ 
    public $catalogue = array(); 

    public function __construct() 
    { 
    $this->catalogue = array(
    '1' => array(
     $section = $markdown->text(file_get_contents(ROOT_DIR . catalogue/markdown/section1.md')), 
     $link = 'catalogue/pdf/section1.pdf, 
     $pdf = (ROOT_DIR . $link), 
     'title' => 'Section One', 
     'content' => mdReplace($section, $pdf, $link), 
     'theme' => 'purple', 
     'vendors' => array(
     1 => $vendor->get('foo'), 
     2 => $vendor->get('bar'), 
    ), 
    ), 
    // '2' ... 
); 
} 
    // Class methods... 
} 
+0

輝煌!謝謝您的意見! – jordanbrauer

0

正如Farkie所說,你不能像你所做的那樣在類屬性上運行方法調用。

原因是,您嘗試使用的那些對象未被初始化,並且爲了使它們工作,它們必須首先被初始化。

防爆變量,不能直接在正常使用,因爲它們無法使用

  • $markdown
  • $pdf
  • $section

因此對於B類,您需要將代碼寫入構造函數中。

然而,無論你爲A類所做的事情是完全可以接受的,它應該可以工作。我可以看到你的變量名有拼寫錯誤。它應該是$vendors與您試圖引用它裏面的function get()$this->vendors[$data];

下面的工作

class Vendor 
{ 
    public $vendors = array(
    'foo' => array(
     'name' => 'Foo Inc.', 
     'image' => (VENDOR_IMG . 'foo/foo-logo.png'), 
    ), 
    'bar' => array(
     'name' => 'Bar Co.', 
     'image' => (VENDOR_IMG . 'bar/bar-logo.png'), 
    ), 
); 

    public function get($data) { 
    if (array_key_exists($data, $this->vendors)) { 
     return $this->vendors[$data]; 
    } else { 
     // throw error 
    } 
    } 

    // Class methods... 
} 
+0

感謝您的解釋。 :) 對於我的兩個類,我結束了在'__construct()'之外聲明屬性,然後在'__construct()'中分配類型數組和其內容。只是爲了安全,大聲笑......我很高興知道我最初的A班課程雖然很好。 – jordanbrauer

相關問題