Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php中的数据模型_Php_Database_Datamodel - Fatal编程技术网

php中的数据模型

php中的数据模型,php,database,datamodel,Php,Database,Datamodel,我正在用php尝试一些非常模糊的数据模型。例如,如果我在SQL数据库中有一个名为“model_attributes”的表。这是我正在处理的模型的所有可用属性的列表。现在,我希望模型和其他模型能够从这个列表中派生函数,在数据从构造函数加载到数组中之后,从数组中提取数据。下面是一个伪代码示例: for each attributes as attribute create new function ( getAttributeName ) 及 会 return $this->_mod

我正在用php尝试一些非常模糊的数据模型。例如,如果我在SQL数据库中有一个名为“model_attributes”的表。这是我正在处理的模型的所有可用属性的列表。现在,我希望模型和其他模型能够从这个列表中派生函数,在数据从构造函数加载到数组中之后,从数组中提取数据。下面是一个伪代码示例:

for each attributes as attribute
    create new function ( getAttributeName )

return $this->_model_data['attribute_name'] 
首先,这是好的做法吗?它看起来很有条理,但同时也有点脏。也许有人可以给我一些关于如何在php中处理大型数据模型的其他建议


另外,如果有人做过类似的事情,我如何在phpDocs中处理它呢?

使用PHP在运行时很难做到这一点

您可以使用现有的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;
        }
    }
}

\u call
是一个神奇的方法,当该方法不存在时会被调用。因此,在类的实例上调用
getAttributeName
将调用
\uu call
,字符串
getAttributeName
作为第一个参数。

如果您只想从容器对象的上下文访问
model\u data
的数组,则应该使用magic方法或实现接口

\uuu get
是一个简单的解决方法,因为实现看起来像这样:

function __get($name)
{
  if (array_key_exists($name, $this->model_data))
  {
    return $this->model_data[$name];
  }
  return;
}
要访问数据,只需调用对象的属性:
$obj->property\u name
,或者在使用字符串的情况下:
$obj->{$property}
当然,这可能会干扰您拥有的任何公共属性(无论如何,拥有它们通常是个坏主意)

或者,您可以将对象设置为ArrayAccess的实现,这将允许您以以下方式访问属性:
$obj['property\u name']
,或
$obj[$property]

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


虽然ArrayAccess方法更快,但您必须对其进行测试才能确定。神奇的方法有一种缓慢的趋势。

具体来说,就是从链接到的URL获取
方法。是的,我同意。我决定要做的是,为每个定义了方法的模型生成一个基本属性列表,并使用uu get作为访问不属于直接模型的属性的方式,即自定义属性。
function __get($name)
{
  if (array_key_exists($name, $this->model_data))
  {
    return $this->model_data[$name];
  }
  return;
}