2013-03-16 2 views
2

나는 꽤 오랫동안 액티브 레코드를 사용 해왔다. 풍경을 약간 변경하고 싶었다. 일부 개발자는 ORM을 살펴 보라고 제안했다. 내가 본 ORM 프로젝트는 모두 ORM을 확장하는 별도의 클래스가 필요하다. 수업.클래스를 동적으로 생성하기

제 질문은 : 없이eval없이 PHP를 사용하여 클래스를 동적으로 생성하는 방법이 있습니까? 내 클라이언트는 eval 인해 그를 공유 호스팅에있는 자신의 환경에서 차단되는 것을 나에게 알려,

<?php 
    class Constructor 
    { 
      function new_class($class) 
      { 
        $myself = get_called_class(); 
        eval("class {$class} extends {$myself} { }"); 
      } 
      function say_hi() 
      { 
        $class = get_called_class(); 
        echo "Hi, {$class}!"; 
      } 
    } 

    $constructor = new Constructor; 
    $constructor->new_class("Greeter"); 

    $greeter = new Greeter; 

    $greeter->say_hi(); // Hi, Greeter! 

그러나 :

이 내가 가진 것입니다.

+0

하지만 왜? 클래스를 생성하고, 배열에 매개 변수를 넣고,'__set'과'__get' 메소드를 추가합니다. 배열에 매개 변수를 설정하면'$ name' 매개 변수를 추가 할 수 있습니다.이 매개 변수는'setName ($ name)'을 설정하고 getName()을 해보려고 클래스의 이름이 될 것이다. 클래스의 후계자. – mkjasinski

+0

PHP에서 이렇게하는 "아름다운"방법은 없습니다. eval()을 사용하거나 런타임에 클래스 정의로 파일을 만든 다음 include()합니다 ... 그러나 프로그램 디자인을 변경하는 것을 고려하십시오. http://stackoverflow.com/questions/3490474/how-to-create-or-define-class-in-php-at-runtime을 참조하십시오. –

답변

2

아마도 그렇게하고 싶지는 않을 것입니다. 그러나 해결 방법으로는 eval()을 통해 동일한 접근법을 사용할 수 있지만 일단 eval로 피드하는 문자열을 구성한 후에는 파일로 쓰고 다시 포함 시키십시오. 이 같은

뭔가 : 나는 메모리에서이 서면이 아닌 한

function my_eval($str) 
{ 
    $filename = uniqid().'.tmp'; 
    file_put_contents ($filename, $str); 
    include $filename; 
    unlink ($filename); 
} 

는 그것을 테스트,하지만 난 그게 트릭을한다고 생각합니다. 지금 당장보아야 할 경고는 여러분이 여전히 본질적으로 eval()과 똑같이하고 있다는 것입니다.이 변형은 호출하는 컨텍스트와 동일한 범위에서 변수를 만들 수 없도록합니다 ($ GLOBALS []를 사용할 수는 있지만). 전역 범위 변수에 대해이를 해결하기 위해).

관련 문제