문자열로 PHP 클래스 인스턴스 만들기


223

나는 두 개의 클래스를 가지고 class ClassOne { }class ClassTwo {}. "One"또는 일 수있는 문자열이 나타납니다 "Two".

다음 switch과 같은 긴 문장 을 사용하는 대신 :

switch ($str) {
    case "One":
        return new ClassOne();
    case "Two":
        return new ClassTwo();
}

문자열을 사용하여 인스턴스를 만들 수있는 방법이 new Class("Class" . $str);있습니까?

답변:


484

그래 넌 할수있어!

$str = 'One';
$class = 'Class'.$str;
$object = new $class();

네임 스페이스를 사용할 때 정규화 된 이름을 제공하십시오 .

$class = '\Foo\Bar\MyClass'; 
$instance = new $class();

PHP에서 할 수있는 다른 멋진 것들은 다음과 같습니다.
변수 변수 :

$personCount = 123;
$varname = 'personCount';
echo $$varname; // echo's 123

그리고 가변 함수 및 방법.

$func = 'my_function';
$func('param1'); // calls my_function('param1');

$method = 'doStuff';
$object = new MyClass();
$object->$method(); // calls the MyClass->doStuff() method. 

1
예제 주셔서 감사합니다!
Joel

28
참고로, 부분적으로 변수를 사용할 수 없습니다. 예. $my_obj = Package\$class_name();. 대신$class_name = "Package\\" . $class_name; $my_obj = new $class_name();
Birla

14
네임 스페이스를 사용할 때는 다음과 같은 전체 경로를 제공해야합니다.$className = '\Foo\Bar\MyClass'; $instance = new $className();
Giel Berkers

5
숟가락은 없습니다 ... PHP 만 있습니다.
Captain Hypertext

4
한가지 질문이 있습니다. 위에서 설명한 방법을 사용하여 새 클래스 인스턴스를 만들 수 있습니다. 기존 클래스의 메서드를 정적으로 호출하려면 어떻게해야합니까? 나는 다음과 같이 시도했다 : 호출되는 클래스의 문자열을 포함하는 변수는 $model = $user_model::find()->All(); 어디에 $user_model
있습니까

22

다음 구문을 사용하여 새 클래스를 만들 수 있습니다 ( 팩토리를 만드는 경우 유용합니다 ).

$className = $whatever;
$object = new $className;

(예외적으로 조잡한) 예제 공장 방법으로 :

public function &factory($className) {

    require_once($className . '.php');
    if(class_exists($className)) return new $className;

    die('Cannot create new "' . $className . '" class - includes not found or class unavailable.');
}

1
수업 명과 확장명 사이에 점이 누락되지 않습니까? require_once($className.'php'); ->require_once($className.'.php');
J Quest


4

ClassOne다음과 같이 정의 하자 :

public class ClassOne
{
    protected $arg1;
    protected $arg2;

    //Contructor
    public function __construct($arg1, $arg2)
    {
        $this->arg1 = $arg1;
        $this->arg2 = $arg2;
    }

    public function echoArgOne
    {
        echo $this->arg1;
    }

}

PHP 리플렉션 사용;

$str = "One";
$className = "Class".$str;
$class = new \ReflectionClass($className);

새 인스턴스를 만듭니다.

$instance = $class->newInstanceArgs(["Banana", "Apple")]);

메소드를 호출하십시오.

$instance->echoArgOne();
//prints "Banana"

변수를 메소드로 사용하십시오.

$method = "echoArgOne";
$instance->$method();

//prints "Banana"

원시 문자열을 사용하는 대신 리플렉션을 사용하여 객체를 만들면 객체를보다 잘 제어하고 테스트 할 수 있습니다 (PHPUnit은 리플렉션에 크게 의존 함)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.