문자열을 기반으로 동적으로 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 행의 다른 열을 새로 만든 개체에 할당합니다.
내 생각엔...
mysql_fetch_object()
- 유형 특성 읽기
- 유형 특성으로 정의된 유형으로 개체 생성
그러나 문자열을 기반으로 동적으로 유형을 생성할 수 있는 방법은 없습니다.어떻게 하는 거야?
그러나 문자열을 기반으로 동적으로 유형을 생성할 수 있는 방법은 없습니다.어떻게 하는 거야?
매우 쉽고 자연스럽게 실행할 수 있습니다.
$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
'programing' 카테고리의 다른 글
인증 플러그인 'caching_sha2_password'를 로드할 수 없습니다. (0) | 2022.09.19 |
---|---|
PHP에는 스레드 기능이 있습니까? (0) | 2022.09.19 |
현재 실행 중인 파일의 경로와 이름을 얻으려면 어떻게 해야 합니까? (0) | 2022.09.19 |
Eclipse 실행 시 기본 라이브러리를 재정의하지 않고 "java.library.path"에 추가하는 방법 (0) | 2022.09.19 |
MySQL 오류 1241: 오퍼랜드에 1개의 열이 포함되어 있어야 합니다. (0) | 2022.09.19 |