2011-01-28 5 views
0

저는 PHP에서 매우 모호한 데이터 모델을 실험하고 있습니다. 예를 들어 SQL 데이터베이스에 "model_attributes"라는 테이블이있는 경우 이것은 제가 작업중인 모델에 사용 가능한 모든 속성의 목록입니다. 이제 데이터를 생성자의 배열에로드 한 후 모델 및 다른 모델에서이 목록의 함수를 파생시켜 배열에서 데이터를 가져올 수 있기를 바랍니다.PHP의 데이터 모델

for each attributes as attribute 
    create new function (getAttributeName) 

getAttributeName() 

return $this->_model_data['attribute_name'] 

우선,이 좋은 방법입니다 : 여기에 의사 코드의 예입니다? 그것은 조직 된 것처럼 보이지만, 동시에 더러운 것 같습니다. 어쩌면 누군가가 내게 PHP에서 대형 데이터 모델을 처리하는 방법에 대한 다른 제안을 줄 수 있습니다.

또한 누군가가 이와 같은 작업을 수행 한 경우 phpDocs에서 어떻게 처리 할 수 ​​있습니까?

답변

2

PHP로 런타임에 쉽게이 작업을 수행 할 수 없습니다.

Doctrine 또는 Propel과 같이 기존 ORM을 사용할 수 있습니다.

또는 모델 클래스 파일을 미리 생성하거나 magic methods을 사용할 수 있습니다.

빠른 예 :

class something { 

    private $_model_data; 

    public function __call($name, $value = null) { 
     if (strpos($name, 'get') === 0) { 
      $attribute = substr($name, 3); 
      return $this->_model_data[$attribute]; 
     } else if (strpos($name, 'set') === 0) { 
      $attribute = substr($name, 3); 
      $this->_model_data[$attribute] = $value; 
     } 
    } 
} 

__call는 방법이 존재하지 않을 때 호출되는 마법의 방법이다. 따라서 클래스의 인스턴스에서 getAttributeName을 호출하면 getAttributeName 문자열을 첫 번째 인수로 사용하여 __call을 호출합니다.

+0

특히, 링크 된 해당 URL의'__get' 메소드. – Nicole

0

컨테이너 개체의 컨텍스트에서 model_data 배열에 액세스하려는 경우 __get 마법 메서드를 사용하거나 ArrayAccess 인터페이스를 구현해야합니다. $obj->property_name, 또는 경우에 어디 '

function __get($name) 
{ 
    if (array_key_exists($name, $this->model_data)) 
    { 
    return $this->model_data[$name]; 
    } 
    return; 
} 

당신은 단지 개체의 속성을 호출하려는 데이터에 액세스하려면 : 구현은 다음과 같이 보일 것 같은

__get

는 밖으로 쉬운 방법입니다 문자열을 사용하는 경우 : $obj->{$property} 물론 이것은 사용자가 가지고있는 공개 속성을 방해 할 수 있습니다 (일반적으로 어쨌든 가져 오는 것이 좋지 않음).

또는 당신은 당신이 같은 속성에 액세스 할 수 ArrayAccess의 구현으로 개체를 설정할 수 있습니다 $obj['property_name'], 또는 $obj[$property]

당신이 원하는 경우 두 솔루션은 사용자 정의 액세스 관리를 할 수 있습니다 필드 이름을 난독 화하거나 나중에 데이터를 검색하는 방법을 조정할 수 있습니다.

AFAIK ArrayAccess 메서드는 빠르지 만 확실하게 테스트해야합니다. 매직 방법은 약간 느려지는 경향이 있습니다.

+0

예, 동의합니다.내가 결정한 것은 메소드를 정의한 각 모델에 대한 속성의 기본 목록을 생성하고 직접 모델 (즉, 맞춤 속성)의 일부가 아닌 속성에 액세스하는 방법으로 __get을 사용하는 것입니다. –