在子类中重载魔术方法


overloading magic methods in child classes

相当确定这不是重复的...来了。

我的目标是在调试类中重载多个魔术方法,并让我的主类扩展该类。我的想法是,这将允许我通过应用程序堆栈进行调试步骤,而不必逐个重载每个类中的神奇方法。

到目前为止,代码看起来像这样

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类中定义的魔术方法。我认为它没有像我预期的那样工作。这可能只是我对魔法方法和重载以及继承的缺乏了解。有人可以告诉我到底出了什么问题吗?或者甚至可能是做我想要的更好方法?

_call 仅对类中未定义的方法执行。这就像未定义方法的捕获全部。