2012-04-30 55 views
1

相當確定這不是重複的...在這裏它就是這樣。重載子類中的魔法方法

我的目標是在調試類中重載多個魔術方法,並讓我的主類擴展所述類。我的想法是,這將允許我通過應用程序堆棧進行調試步驟,而不必在每個類中逐個重載魔術方法。

到目前爲止的代碼看起來是這樣的

class magicdbg 
{ 
//data container object 
private $data; 

public function __construct() 
{ 
    require_once("data.php"); 
    $this->data = data::defInstance(); 
} 

public function __call($name,$arguments) 
{ 
    echo "overloading call <br />"; 
    $this->data->dbgmsg("Calling method: " . __METHOD__ . " -- with arguments: (" .implode(',',$arguments) . ")"); 
} 

public function __get($var) 
{ 

} 
} 

和類擴展它

require_once("magicdbg.php"); 
class salesCtrl extends magicdbg 
{ 
private $data; 
public function __construct() 
{ 
    require_once('data.php'); 
    $this->data = data::defInstance(); 
    $this->testcall(); 

} 

private function testcall() 
{ 
    echo "test"; 
} 
} 

終於類包含magicdbg呼籲

class data 
{ 
//application settings 
CONST DEBUG = true; 

//application messages 
//debug messages 
private $dbgmsgs; 
private $errormsgs = array(); 
//application objects 

//singleton object instance 
private static $instance; 

public function __construct() 
{ 
    //if debug is enabled instantiate the debug message array 
    if(self::DEBUG) 
     $this->dbgmsgs = array(); 
} 

public static function defInstance() 
{ 
    echo "defining instance"; 
    if(!self::$instance) 
     self::$instance = new data(); 

    echo "<br />instance defined<br />"; 
    return self::$instance; 
} 

public function dbgmsg($msg) 
{ 
    echo "calling dbgmsg <br />"; 
    if(self::DEBUG) 
     $this->dbgmsgs[] = $msg; 
} 

public function outputDbg() 
{ 
    if(!self::DEBUG) 
     return false; 
    echo "testing dbg output <br />"; 
    $return = '<div id="debug"><ul>'; 
    foreach($this->dbgmsgs as $msg) 
     $return .= "<li>" . $msg . "</li>"; 

    $return .= "</ul></div>"; 
    return $return; 
} 
} 

方法代碼實例化如此

require_once('sales.ctrl.php'); 
$ctrl = new salesCtrl(); 

最後......我的問題似乎是它甚至沒有擊中magicdbg類中定義的魔術方法。我認爲它不會像我所期望的那樣工作。這可能只是我對神奇方法和重載以及繼承的理解不夠。有人可以讓我知道究竟是哪裏出了問題嗎?或者甚至可能是更好的方式來做我想要的東西?

回答

2

_call僅對您的班級中未定義的方法執行。這就像所有未定義的方法一樣。

+0

您可以通過強制對子進程調用testCall()來非法訪問他正在查找的行爲; '父:: TESTCALL()'。 –

+0

非常感謝你們兩位。這將解釋它。 – steve