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類中定義的魔術方法。我認爲它不會像我所期望的那樣工作。這可能只是我對神奇方法和重載以及繼承的理解不夠。有人可以讓我知道究竟是哪裏出了問題嗎?或者甚至可能是更好的方式來做我想要的東西?
您可以通過強制對子進程調用testCall()來非法訪問他正在查找的行爲; '父:: TESTCALL()'。 –
非常感謝你們兩位。這將解釋它。 – steve