나는이 질문이 다소 모호하다는 것을 알고 있으므로 예제를 통해 더 명확하게 만들 것입니다.
$var = 'bar';
$bar = new {$var}Class('var for __construct()'); //$bar = new barClass('var for __construct()');
이것이 내가하고 싶은 일입니다. 어떻게 하시겠습니까? 물론 eval ()을 사용할 수 있습니다.
$var = 'bar';
eval('$bar = new '.$var.'Class(\'var for __construct()\');');
그러나 나는 오히려 eval ()에서 멀리 떨어져 있습니다. eval () 없이이 작업을 수행 할 수있는 방법이 있습니까?
답변
클래스 이름을 변수에 먼저 넣으십시오.
$classname=$var.'Class';
$bar=new $classname("xyz");
이것은 종종 팩토리 패턴으로 싸인 종류의 것입니다.
자세한 내용은 네임 스페이스 및 동적 언어 기능 을 참조하십시오.
답변
네임 스페이스를 사용하는 경우
내 연구 결과에서, 내가 말할 수있는 한 클래스의 전체 네임 스페이스 경로를 선언해야한다고 언급하는 것이 좋습니다.
MyClass.php
namespace com\company\lib;
class MyClass {
}
index.php
namespace com\company\lib;
//Works fine
$i = new MyClass();
$cname = 'MyClass';
//Errors
//$i = new $cname;
//Works fine
$cname = "com\\company\\lib\\".$cname;
$i = new $cname;
답변
동적 생성자 매개 변수도 전달하는 방법
동적 생성자 매개 변수를 클래스에 전달하려면 다음 코드를 사용할 수 있습니다.
$reflectionClass = new ReflectionClass($className);
$module = $reflectionClass->newInstanceArgs($arrayOfConstructorParameters);
PHP> = 5.6
PHP 5.6부터 Argument Unpacking 을 사용하여 이것을 더욱 단순화 할 수 있습니다 .
// The "..." is part of the language and indicates an argument array to unpack.
$module = new $className(...$arrayOfConstructorParameters);
지적 해 주신 DisgruntledGoat에게 감사드립니다.
답변
class Test {
public function yo() {
return 'yoes';
}
}
$var = 'Test';
$obj = new $var();
echo $obj->yo(); //yoes
답변
call_user_func()
또는 call_user_func_array
PHP 방법을 권장합니다 . 여기서 확인할 수 있습니다 ( call_user_func_array , call_user_func ).
예
class Foo {
static public function test() {
print "Hello world!\n";
}
}
call_user_func('Foo::test');//FOO is the class, test is the method both separated by ::
//or
call_user_func(array('Foo', 'test'));//alternatively you can pass the class and method as an array
메소드에 전달할 인수가 있으면 call_user_func_array()
함수 를 사용하십시오 .
예.
class foo {
function bar($arg, $arg2) {
echo __METHOD__, " got $arg and $arg2\n";
}
}
// Call the $foo->bar() method with 2 arguments
call_user_func_array(array("foo", "bar"), array("three", "four"));
//or
//FOO is the class, bar is the method both separated by ::
call_user_func_array("foo::bar"), array("three", "four"));