1

これが重複していないことはかなり確かです...ここに行きます。

ここでの私の目標は、デバッグ クラスで複数のマジック メソッドをオーバーロードし、メイン クラスでそのクラスを拡張することです。私の考えでは、これにより、すべてのクラスの魔法のメソッドを 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クラスで定義された魔法のメソッドにさえ当たらないようです。期待通りには動かないと思います。これは、魔法のメソッドとオーバーロード、および継承についての私の理解不足かもしれません。誰かが正確に何がうまくいかないのかについて私に記入できますか? それとも、私が意図していることを行うためのより良い方法でしょうか?

4

1 に答える 1

2

_callクラスで定義されていないメソッドに対してのみ実行されます。これは、未定義のメソッドをすべてキャッチするようなものです。

于 2012-04-30T22:23:32.113 に答える