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で実行時に簡単にこれを行うことはできません。

既存のORMを使用することができます(例:DoctrineまたはPropel)。

または、モデルクラスファイルを事前に生成するか、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を使用することです。 –

関連する問題