2012-04-30 3 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) 
{ 

} 
} 

와 클래스 같은 것을 보이는 것이

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; 
} 
} 

를 호출 magicdbg 방법을 포함

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"; 
} 
} 

마지막 수업 코드는 다음과 같이 인스턴스화됩니다.

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

그리고 마지막으로 ... 내 문제는 magicdbg 클래스에 정의 된 마법 메서드가 맞지 않는 것 같습니다. 나는 내가 기대했던 것처럼 그것이 작동하지 않는다고 생각한다. 이것은 단지 마법 방법과 과부하에 대한 이해가 부족할뿐만 아니라 상속 일 수도 있습니다. 누군가가 정확히 무엇이 잘못 될지에 대해 나를 채울 수 있습니까? 또는 어쩌면 더 나은 방법은 무엇을 의도합니까?

답변

2

_call은 클래스에 정의되지 않은 메소드에서만 실행됩니다. 정의되지 않은 메소드를 모두 포착하는 것과 같습니다.

+0

'testCall()'자식으로부터 부모 호출을 강제로 시도하는 행위를 불법으로 처리 할 수 ​​있습니다. 'parent :: testCall()'. –

+0

많은 분들께 감사드립니다. 그것을 설명 할 것입니다. – steve