PHP는 클래스 이름에서 객체를 문자열로 인스턴스화 할 수 있습니까?


83

클래스 이름이 문자열에 저장된 경우 PHP에서 클래스 이름에서 개체를 인스턴스화 할 수 있습니까?

답변:


138

네, 확실히.

$className = 'MyClass';
$object = new $className; 

7
멋져요, 헤헤에게 물어보기 전에 테스트 했어야 했어요. 감사!
user135295

2
@user-너무 맞습니다. 최소한의 작업을 수행하는 대신 왜 직접 그렇게 왔는지 궁금합니다. lol
Ben

2
사실 그다지 분명하지 않습니다. Java에서는 리플렉션이라는 것을 알고 있지만 이것에 비해 매우 간단합니다.
Bartis Áron 2014 년

4
clsss가 네임 스페이스에 있으면이 $ class = 'PrintData \\'를 사용하십시오. $ class; return new $ class ();
Dariux 2015 년

2
또한 PHP 문서에 나와 있듯이 인스턴스화하려는 클래스가 네임 스페이스 내에 있으면 FQN (Fully Qualified Name)을 지정해야합니다. 예를 들어, 저는 "App \ Http \ Controllers"의 네임 스페이스 내에 있었고 문자열 $ string = 'App \ Models \ Task'; 문자열을 인스턴스화하려고하면 끊어 질 것이라고 생각했지만 실제로는 시작 부분에 \를 추가 할 필요가 없습니다.
Matt Kieran


5

클래스에 인수 가 필요한 경우 다음을 수행해야합니다.

class Foo 
{
   public function __construct($bar)
   {
      echo $bar; 
   }
}

$name = 'Foo';
$args = 'bar';
$ref = new ReflectionClass($name);
$obj = $ref->newInstanceArgs(array($args));

3

정적도 :

$class = 'foo';
return $class::getId();

이것은 질문에 대한 답을 제공하지 않습니다. 작성자에게 비판이나 설명을 요청하려면 게시물 아래에 댓글을 남겨주세요. - 검토에서
Blackbam

@Blackbam 관련 보충 답변. 유용한 경우에만 의견을 말하십시오.
Andrew Atkinson

사실 그것은 기본적으로 어쨌든 귀하의 답변에 대한 약간의 설명이 좋을 것입니다. 질문은 "PHP가 객체를 인스턴스화 할 수 있는가"였지만 정적 멤버 함수에 대한 액세스는 객체 액세스가 아닙니다.
Blackbam

0

데이터베이스와 같은 저장소에 클래스 이름 / 메서드를 저장하여 동적 호출을 수행 할 수 있습니다. 클래스가 오류에 대해 탄력적이라고 ​​가정합니다.

sample table my_table
    classNameCol |  methodNameCol | dynamic_sql
    class1 | method1 |  'select * tablex where .... '
    class1 | method2  |  'select * complex_query where .... '
    class2 | method1  |  empty use default implementation

등. 그런 다음 클래스 및 메서드 이름에 대해 데이터베이스에서 반환 한 문자열을 사용하여 코드에서. 상상할 수있는 한 자동화 수준 인 클래스에 대한 SQL 쿼리를 저장할 수도 있습니다.

$myRecordSet  = $wpdb->get_results('select * from my my_table')

if ($myRecordSet) {
 foreach ($myRecordSet   as $currentRecord) {
   $obj =  new $currentRecord->classNameCol;
   $obj->sql_txt = $currentRecord->dynamic_sql;
   $obj->{currentRecord->methodNameCol}();
}
}

이 방법을 사용하여 REST 웹 서비스를 만듭니다.


1
그리고 내가 당신의 데이터베이스에 클래스와 메소드를 삽입 할 수 있다면 나머지 API 전체를 소유 한 것입니다 .... 좋아요! 이 코드를 사용하지 마십시오. 매우 위험합니다!
James Kipling
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.