반응형
PHP 변수에서 클래스를 인스턴스화하시겠습니까?
이 질문이 다소 모호하게 들리는 것을 알고 있기 때문에 예를 들어 좀 더 명확하게 설명하겠습니다.
$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() 없이 할 수 있는 방법이 있나요?
classname을 먼저 변수에 입력합니다.
$classname=$var.'Class';
$bar=new $classname("xyz");
이것은 공장 패턴으로 포장되어 있는 것을 자주 볼 수 있습니다.
자세한 내용은 네임스페이스 및 동적 언어 기능을 참조하십시오.
네임스페이스를 사용하는 경우
제 조사결과에 따르면 클래스의 완전한 네임스페이스 경로를 선언해야 한다는 것을 언급하는 것이 좋다고 생각합니다.
MyClass.php
namespace com\company\lib;
class MyClass {
}
index.displaces를 표시합니다.
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);
그걸 지적해 준 언짢은 고양이에게 감사한다.
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"));
언급URL : https://stackoverflow.com/questions/534159/instantiate-a-class-from-a-variable-in-php
반응형
'sourcecode' 카테고리의 다른 글
mysql 함수 GROUPINT이 존재하지 않습니다. (0) | 2022.09.24 |
---|---|
1개의 쿼리로 여러 개의 문을 노드 검출 (0) | 2022.09.24 |
JavaScript 개체의 속성을 열거하려면 어떻게 해야 합니까? (0) | 2022.09.24 |
MySQL에서 foreignKey 값에 대한 관련 데이터가 있는 모든 테이블을 가져오는 방법 (0) | 2022.09.23 |
Mac OS X에서 PHP를 업그레이드하는 방법은 무엇입니까? (0) | 2022.09.23 |