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 轻松做到这一点。

您可以使用现有的 ORM,例如DoctrinePropel

或者你可以预先生成模型类文件,或者使用魔法方法

快速示例:

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从容器对象的上下文中访问数组,您应该使用__get魔术方法或实现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]

如果您想混淆字段名称或调整以后检索数据的方式,这两种解决方案都允许您进行自定义访问管理。

AFAIK ArrayAccess 方法更快,但您必须对其进行测试才能确定。魔术方法往往有点慢。

于 2011-01-28T17:10:28.617 回答