2011-01-10 7 views
1

여기 거래가 있습니다. 개체를 반환하는 함수를 만들려고합니다. 이런 식으로 뭔가 :래퍼 함수에서 클래스 생성자에 매개 변수 전달

function getObject($objectName, $arr = array()) { 
    return new $objectName($arr) ; 
} 

을하지만 난 클래스를 필요

function getObject($objectName) { 
    return new $objectName() ; 
} 

하지만 난 여전히 클래스 생성자에 PARAMS 전달할 필요가, 가장 쉬운 해결책은 다음과 같이 배열 함수에 전달 될 것이다 생성자는 단지 하나의 인수와 정확히 배열을 가지고 있는데, 이는 바람직하지 않습니다. 모든 클래스에서이 함수를 사용할 수 있기를 원합니다. 다음은 내가에 온 솔루션입니다 :

/** 
* Test class 
*/ 
class Class1 { 
    /** 
    * Class constructor just to check if the function below works 
    */ 
    public function __construct($foo, $bar) { 
     echo $foo . ' _ ' . $bar ; 
    } 
} 

/** 
* This function retrns a class $className object, all that goes after first argument passes to the object class constructor as params 
* @param String $className - class name 
* @return Object - desired object 
*/ 
function loadClass($className) { 
    $vars = func_get_args() ; // get arguments 
    unset($vars[ 0 ]) ; // unset first arg, which is $className 
    // << Anonymous function code start >> 
    $code = 'return new ' . $className . '(' ; 
    $auxCode = array() ; 
    foreach($vars as $val) 
     $auxCode[] = 'unserialize(stripslashes(\'' 
     .    addslashes((serialize($val))) . '\'))' ; 
    $code .= implode(',', $auxCode) . ');' ; 
    // << Anonymous function code end >> 
    $returnClass = create_function('', $code) ; // create the anonymous func 
    return $returnClass($vars) ; // return object 
} 

$obj = loadClass('Class1', 'l\'ol', 'fun') ; // test 

글쎄, 그것은 내가 원하는대로 작동하지만, 나에게 서투른 조금 보인다. 어쩌면 나는 바퀴를 재발 명하고있다. 그리고 이런 종류의 문제에 또 다른 표준 해결책이 있을까?

답변

5

쉽게이를 달성하기 위해 ReflectionClass를 사용할 수 있습니다

function getObject($objectName, $arr = array()) { 
    if (empty($arr)) { 
     // Assumes you correctly pass nothing or array() in the second argument 
     // and that the constructor does accept no arguments 
     return new $objectName(); 
    } else { 
     // Similar to call_user_func_array() but on an object's constructor 
     // May throw an exception if you don't pass the correct argument set 
     // or there's no known constructor other than the default (arg-less) 
     $rc = new ReflectionClass($objectName); 
     return $rc->newInstanceArgs($arr); 
    } 
} 
+1

달콤한! 반사 ... 아무것도 할 수 없어?! :) – kander

+0

고맙습니다. ReflectionClass를 사용할 수있는 방법이 있다고 확신했지만 깊이 파고 들지 않았습니다. 저주받은 문서는 엉망입니다. – kos

+0

@ k0stix : 예, 슬프게도 :(대답을 수락하려면 체크 표시를 클릭하십시오. (두 번째 질문 일 뿐이므로 알려 드리겠습니다.) – BoltClock