직접 구현할 수도 있습니다. 어쨌든 마법 계책은 명시 적으로 트리거해야하기 때문에 필요하지 않은 것일 수도 있습니다 (__invoke()
). 아래에있는 클래스의 마법 코드를 선언 한 다음 클래스 (여기서는 SomeClassOne
)에서 사용하는 코드를 생각해보십시오. 이것은 내장 된 PHP 함수가 아닐 수도 있지만 OOP의 전부입니다. 맞습니까?
<?php
class MagicHelper{
public static function __onClassCall(){
// LOGIC FOR SOME SPECIAL INITIALIZATION ON THE INSTANTIATION OF A CLASS OBJECT GOES HERE...
// THIS METHOD IS FIRED EACH TIME AN OBJECT IS INSTANTIATED
}
public static function __onMethodCall(){
// LOGIC FOR DEBUGGING GOES HERE...
// THIS METHOD IS FIRED EACH TIME A METHOD IS CALLED
}
}
class SomeClassOne{
private $prop;
public static $CLASS_PREP_ENABLED = true; //<== COULD BE TURNED OFF OR ON
public static $METHOD_DEBUG_ENABLED = true; //<== COULD BE TURNED OFF OR ON
public function __construct($prop = null) {
$this->prop = $prop;
if(self::$CLASS_PREP_ENABLED){
// CALL THE STATIC MAGIC __onClassCall METHOD DECLARED IN THE MagicHelper CLASS
// EACH TIME A NEW OBJECT IS INSTANTIATED
MagicHelper::__onClassCall();
}
}
function __invoke() {
// YOU COULD AS WELL USE THIS BUT I DOUBT THIS FITS YOUR DESCRIPTION.
}
public function getProp() {
return $this->prop;
}
public function setProp($prop) {
$this->prop = $prop;
return $this;
}
public function methodOne($paramOne){
// THE LOGIC FOR THIS METHOD GOES HERE
//...
// CALL THE STATIC MAGIC __onMethodCall METHOD DECLARED IN THE MagicHelper CLASS
// EACH TIME A NEW OBJECT IS INSTANTIATED
if(self::$METHOD_DEBUG_ENABLED) {
MagicHelper::__onMethodCall();
}
}
public function methodTwo($paramTwo){
// THE LOGIC FOR THIS METHOD GOES HERE
//...
// CALL THE STATIC MAGIC __onMethodCall METHOD DECLARED IN THE MagicHelper CLASS
// EACH TIME A NEW OBJECT IS INSTANTIATED
if(self::$METHOD_DEBUG_ENABLED) {
MagicHelper::__onMethodCall();
}
}
}
'반사'를 시도 했습니까? [ReflectionMethod :: invoke] (http://php.net/manual/en/reflectionmethod.invoke.php)를보십시오 – postrel
* debug backtrace *를 찾으십시오 - 당신이 찾고있는 것일 수도 있습니다. 예 : http://stackoverflow.com/a/8497530/2329487 – shudder
Aop 프레임 워크를 사용할 수 있습니다. https://github.com/goaop/framework – sectus