1

私はPHPで非常にあいまいなデータモデルを試しています。たとえば、SQL データベースに「model_attributes」というテーブルがあるとします。これは、私が取り組んでいるモデルで使用可能なすべての属性のリストです。ここで、データがコンストラクターから配列にロードされた後、モデルと他のモデルがこのリストから関数を導出して配列からデータを取得できるようにしたいと考えています。擬似コードの例を次に示します。

for each attributes as attribute
    create new function ( getAttributeName )

getAttributeName() 

だろう

return $this->_model_data['attribute_name'] 

まず、これは良い習慣ですか?整理されているように見えますが、同時に汚いようにも見えます。PHPで大規模なデータモデルを処理する方法について、誰かが他の提案をしてくれるかもしれません。

また、誰かがこのようなことをした場合、どうすればphpDocsでこれを処理できますか?

4

2 に答える 2

3

PHP では実行時にこれを簡単に行うことはできません。

DoctrinePropelなどの既存の ORM を使用できます。

または、モデル クラス ファイルを事前に生成するか、マジック メソッドを使用することもできます。

簡単な例:

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、クラスのインスタンスを呼び出すと、最初の引数として__call文字列が呼び出されます。getAttributeName

于 2011-01-28T16:48:38.927 に答える
0

model_dataコンテナオブジェクトのコンテキストからの配列にアクセスするだけの場合は、 __getmagicメソッドを使用するか、ArrayAccessインターフェイスを実装する必要があります。

__get実装は次のようになりますので、簡単な方法です。

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

データにアクセスするには、オブジェクトのプロパティを呼び出すだけです:$obj->property_name、または文字列を使用している場合:$obj->{$property} もちろん、これはあなたが持っているパブリック属性に干渉する可能性があります(とにかくそれらを持っていることは一般的に悪い考えです) 。

または、オブジェクトをArrayAccessの実装として設定することもできます。これにより、次のようにプロパティにアクセスできるようになります。$obj['property_name']、または$obj[$property]

どちらのソリューションでも、フィールド名を難読化したり、後でデータを取得する方法を調整したりする場合は、カスタムアクセス管理を使用できます。

ArrayAccessメソッドの方が高速ですが、確実にテストする必要があります。魔法の方法は少し遅い傾向があります。

于 2011-01-28T17:10:28.617 に答える