2012-04-30 4 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()'からparentへの呼び出しを強制することで、彼が求めている動作を不正にすることができます。 'parent :: testCall()'です。 –

+0

ありがとうございます。それはそれを説明するだろう。 – steve

関連する問題