programing

문자열을 기반으로 동적으로 PHP 개체 생성

newsource 2022. 9. 19. 23:44

문자열을 기반으로 동적으로 PHP 개체 생성

MySQL 데이터베이스의 문자열로 정의된 유형을 기반으로 PHP에 개체를 만들고 싶습니다.데이터베이스 테이블에는 다음과 같은 열과 샘플 데이터가 있습니다.

 id | type | propertyVal
----+------+-------------
  1 | foo  | lorum
  2 | bar  | ipsum

...PHP 데이터 유형 사용

class ParentClass {...}
class Foo extends ParentClass {private $id, $propertyVal; ...}
class Bar extends ParentClass {private $id, $propertyVal; ...} 
//...(more classes)...

하나의 쿼리만 사용하여 id별로 행을 SELECT하고 테이블의 유형 열을 정의하는 유형의 개체를 만들고 SELECTed 행의 다른 열을 새로 만든 개체에 할당합니다.

내 생각엔...

  1. mysql_fetch_object()
  2. 유형 특성 읽기
  3. 유형 특성으로 정의된 유형으로 개체 생성

그러나 문자열을 기반으로 동적으로 유형을 생성할 수 있는 방법은 없습니다.어떻게 하는 거야?

그러나 문자열을 기반으로 동적으로 유형을 생성할 수 있는 방법은 없습니다.어떻게 하는 거야?

매우 쉽고 자연스럽게 실행할 수 있습니다.

$type = 'myclass';

$instance = new $type;

쿼리에서 연관 배열이 반환되는 경우 다음과 같은 구문을 사용하여 속성을 할당할 수 있습니다.

// build object
$type = $row['type'];
$instance = new $type;

// remove 'type' so we don't set $instance->type = 'foo' or 'bar'
unset($row['type']);  

// assign properties
foreach ($row as $property => $value) {
   $instance->$property = $value;
}

임시 변수에 의존하지 않고 몇 달 전에 배운 매우 깔끔한 구문을 사용할 수 있습니다.다음으로 POST 변수를 사용하여 특정 클래스를 로드하는 예를 나타냅니다.

$eb = new ${!${''} = $_POST['entity'] . 'Binding'}();

다만, 고객님의 경우는 PDO를 사용하여 해결할 수 있습니다.첫 번째 열의 값을 행이 인스턴스화하는 클래스로 지정할 수 있는 가져오기 모드가 있습니다.

$sth->fetch(PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE);
$instance = new $classname; // i.e. $type in your case

매우 잘 작동...

내가 이 스레드에 왔을 때 찾고 있던 것은 다음과 같다.사용하다{"objectName"}(7) 문자열 형식으로 오브젝트 이름을 선언하거나 참조합니다.

$gameData = new stdClass();
$gameData->location = new stdClass();
$basementstring = "basement";

class tLocation {
    public $description;
}

$gameData->location->{'darkHouse'} = new tLocation;
$gameData->location->{"darkHouse"}->description = "You walkinto a dusty old house";


$gameData->location->{$basementstring} = new tLocation;
$gameData->location->{"basement"}->description = "its really damp down here.";

//var_dump($gameData); 
echo $gameData->location->basement->description;

이 오브젝트를 가리키는 방법은 서로 교환할 수 있는 것처럼 보인다.답을 찾을 수 없어서 방법을 찾을 때까지 가지고 놀아야 했어요.

silkfire가 말하는 것처럼, 이것은 PDO 고유의 모드를 사용하여 달성할 수 있습니다. 예를 들어 보겠습니다.동일한 데이터베이스 값과 정의된 개체 사용:

id | type | propertyVal----+------+-------------1 | foo | lorum2 | bar | ipsum
클래스 Parent Class {...}클래스 Foo는 Parent Class {private $id, $propertyVal;}을 확장합니다.}클래스 바는 ParentClass {private $id, $propertyVal;}을 확장합니다.}//...(더 많은 클래스)...

단일 쿼리를 사용하여(클래스 이름을 포함하는 필드의 이름을 먼저 지정해야 합니다).

$stmt = $db->prepare('SELECT type,id,propertyVal FROM table WHERE id=1');
$stmt->execute();
$foo = $stmt->fetch(PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE);
var_dump($foo); // $foo is a newly created object of class foo, with properties named like and containing the value of subsequent fields

신기하지만 시간이 지나면 시원해진다.

$stmt = $db->prepare('SELECT type,id,propertyVal FROM table');
$stmt->execute();
while ($object = $stmt->fetch(PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE))
 {var_dump($object);} // here all desired objects, dynamically constructed accordingly to the first column returned by the query

예를 들어 문자열을 대문자로 바꿈으로써 동적으로 할당된 속성에서 작업할 생성자(데이터베이스의 값이 속성에 할당된 후 호출됨)를 정의할 수 있습니다.

class foo
 {function __construct ()
   {$this->uper = strtoupper($this->propertyVal);}}

언급URL : https://stackoverflow.com/questions/2201335/dynamically-create-php-object-based-on-string