2011-05-12 92 views
3

看我的AN EMPTY ARRAY代碼。誰能告訴我,爲什麼執行以下代碼時變量不是在父類被覆蓋

$accountModel->setEmail('[email protected]');

class AccountModel extends Model { 
protected $table = 'account', 
      $key = 'id', 
      $data = array(
       'id' => null, 
       'email' => null, 
       'first_name' => null, 
       'created' => null, 
       'last_login' => null, 
       'hash' => null 
      ); 
} 


class Model extends CI_Model { 
    protected $table = null; 
    protected $key = null; 
    protected $connection = null; 
    protected $data = array(); 

public function __call ($function, $arguments) { 
    $original = $function; 
    $function = strtolower(preg_replace('/(?<=[a-z])([A-Z])/', '_$1', $function)); 

    $prefix = substr($function, 0, 4); //returns get_ or set_ 

    if ($prefix == 'get_' || $prefix == 'set_') { 
     $key = substr($function, 4); //returns "email" 
     var_dump($this->data); //AN EMPTY ARRAY 
     exit($key); 
    } 

    throw new Exception('Call to undefined method '.get_class($this).'::'.$original.'()'); 
} 
} 

根據example 2 on PHP.net它應該只是罰款數組是空的,並沒有得到來自AccountModel填充。

我試圖運行$ accountModel-> setEmail('[email protected]');

更新:我已經意識到我的代碼中另一個bug,失敗對我而言。感謝您的幫助球員

回答

0

你回頭看的繼承。您的Model類沒有$ data數組。它不能從AccountModel'看到'$ data數組,因爲繼承只是一種方式。父母不能看到他們的孩子定義的成員。

+0

@ kevinmajor1,沒有。繼承的所有優點是,我可以在一個基類中定義我的方法,然後擴展其他類,只需更改其默認道具。 – gaRex 2011-05-12 07:01:51

+0

@亞歷山大:整個觀點是,不,你不能。 – 2011-05-12 09:23:45

+0

@Tomalak,怎麼樣?你能提供一些例子,當它不可能的時候? 我已經提供了示例代碼,它可能並且工作正常。我們在這裏談論繼承,當B類可以擴展A類嗎? – gaRex 2011-05-12 09:38:41

2

它看來,你的$ accountModel是不是類AccountModel的:你可以試試var_dump(get_class($this))


<?php 
class Animal { 
    public $data = 'i`m animal'; 
    protected $_data = 'i`m animal'; 

    public function go() { 
     var_dump($this->data); 
     var_dump($this->_data); 
    } 

    public function __call ($function, $arguments) { 
     echo 'I was called as ' . $function . PHP_EOL; 
     var_dump($this->data); 
     var_dump($this->_data); 
    } 
} 

class Cat extends Animal { 
    public $data = 'i`m cat'; 
    protected $_data = 'i`m cat'; 
} 

$pussy = new Cat(); 
$pussy->go(); 
$pussy->iamMagicMethod(); 
+0

它總是給我們貓,貓 – gaRex 2011-05-12 07:03:35

+0

+1畢竟:) – 2011-05-12 09:52:04

+0

@Tomalak,是啊! :) – gaRex 2011-05-12 09:54:30

0

的$您重新definiton在AccountModel數據隱藏了一個在模型。只是不要再定義它,因爲它已經存在於基類中。在構造函數初始化:

class AccountModel extends Model { 
    public function __construct() 
    { 
     $this->table = 'account'; 
     $this->key = 'id'; 
     $this->data = array(
      'id' => null, 
      'email' => null, 
      'first_name' => null, 
      'created' => null, 
      'last_login' => null, 
      'hash' => null 
      ); 
    } 

}

+0

它不隱藏任何東西。最可能的錯誤是在另一個地方。它絕對類似於這個屬性只是在類定義中重寫或者在構造函數中設置它們。在其他地方出錯。 – gaRex 2011-05-12 09:55:24

+0

糟糕,你是對的......我已經嘗試過,並且redefinimg似乎沒有錯。雖然看起來很奇怪。 – 2011-05-12 10:13:45

0

你的問題被打破:this approach does work

我懷疑你$accountModel其實AccountModel類型的對象。

另一條證據指向這是試圖創建一個AccountModel是在你的代碼中的錯誤,因爲你之前定義它Model它所依賴的類定義。所以你不可能畢竟已經這樣做了。

如果您仍然有問題,請張貼在ideone.com的測試用例是明顯重現問題。