2012-08-13 2 views
1

나는 기존 클래스를 가지고 있으며,이를 위해 "플러그인"을로드 할 시스템을 만들고 싶습니다. 이러한 "플러그인"은 파일로 생성 된 다음 주 클래스가있는 파일에 포함됩니다.PHP로 "on-the-fly"클래스로드하기

이제는 메인 클래스가 그들 만의 클래스로 작은 "플러그인"을 확장해야한다고 생각합니다. 문제는 다른 사용자가 어떤 플러그인을 포함할지 알 수 없다는 것입니다. 따라서 클래스의 확장은 동적입니다.

eval을 사용하지 않고도 클래스를 즉시 확장 할 수 있습니까?

+1

시도 할 것인가? 당신의 플러그인이 상속 한 클래스? 이것은 꽤 심각한 디자인 결함을 말해줍니다. 실제로 이렇게해야 할 이유가 없으며 쉽게 할 수있는 방법이 없습니다. – meagar

+1

당신은 틀린 무엇인가 틀리게한다. 플러그인 디자인이 깨졌습니다. 기술적으로는 동적 문자열 데이터를 평가하거나 포함 할 수 있으므로 원하는대로 만들 수 있습니다. 잘못된 디자인을 현명하게 수행하는 것입니다. – hakre

+0

이전 자바 스크립트 프로토 타입 상속 경험을 통해 PHP 상속을 받고 있다고 생각하십니까? 당신은 고전적인 상속을 읽을 필요가 있습니다. –

답변

0

__autoload에 대해 이야기하고 있습니까?

function __autoload($class) { 
    require_once($class.'.php'); 
} 
$object = new Something(); 

require_once(Something.php); 당신은 동적으로 부모 클래스를 변경하려면

0

PHP의 마법 기능을 사용하여 정렬 할 수 있습니다. A 클래스가 있다고 가정하면 A의 "인스턴스"를 사용할 수있는 몇 가지 추가 메서드가 있습니다.

class A { 
    public $publicA; 

    public function doA() { 
     $this->publicA = "Apple"; 
    } 
} 

class B { 
    public $publicB; 

    public function doB() { 
     $this->publicB = "Bingo"; 
    } 

    private $object; 

    public function __construct($object) { 
     $this->object = $object; 
    } 

    public function __call($name, $arguments) { 
     return call_user_func_array(array($this->object, $name), $arguments); 
    } 

    public function __get($name) { 
     return $this->object->$name; 
    } 

    public function __set($name, $value) { 
     $this->object->$name = $value; 
    } 
} 

$b = new B(new A); 

$b->doA(); 
$b->doB(); 
echo "$b->publicA, $b->publicB"; 

인스턴스 $ b에는 A와 B의 메소드와 특성이 있습니다.이 기술을 확장하여 여러 클래스의 기능을 집계 할 수 있습니다.