gpt4 book ai didi

php - 一个很好的 mvc 模型类,跟踪属性

转载 作者:搜寻专家 更新时间:2023-10-31 20:50:25 24 4
gpt4 key购买 nike

这是我的 model_users 类(它扩展的“模型”还没有任何东西——仍在努力准备好这个,然后抽象出通用函数以供其他模型使用),数据库: :query 只返回 mysql_fetch_assoc() 结果:

class Model_User extends Model {    
private static $_table = 'users';

public function __construct($properties = array())
{
parent::__construct();
foreach ($properties as $key => $value) {
$this->{$key} = $value;
}
}

public function exists()
{
return ($this->id) ? TRUE : FALSE;
}

public static function get_by_id($id = NULL)
{
if ($id)
{
$result = Database::query(
sprintf('SELECT * FROM ' . self::$_table . ' WHERE id = %d', $id)
);

return new Model_User($result);
}
else
{
return new Model_User(array());
}
}

public function save()
{
return TRUE;
}
}

这允许我做类似的事情:

$u = Model_User::get_by_id(5);
if ($u->exists())
{
echo $u->name;
echo $u->id;
}
else
{
echo 'No user';
}

我正在尝试学习如何在没有 orm 或类似东西的情况下使用模型(我以前使用过它们,但我想学习如何制作它们的简单版本)。

我想知道如何以抽象的方式跟踪模型的属性,我已经看到了 php 的反射对象,这可能正是我所需要的。我只想能够做这样的事情:

$u = new Model_User();
$u->name = 'John';
$u->email = 'john@example.com';
$u->save();

或者喜欢

$u = Model_User::get_by_id(2);
$u->email = 'someone@example.com';
$u->save();
// Different than the prior one since it would UPDATE, not INSERT

我不是在问如何实现整个 save() 方法,但我需要知道如何以一种可以让我拥有一个抽象模型类的方式来思考这个问题使用方便。我需要克服的障碍之一是有两种类型的属性,一种是模型的实际属性(在本例中为“姓名”或“电子邮件”),另一种类型与其他事物有关,例如作为“表名”,甚至可能是一些“有很多”关系信息。

最佳答案

一个答案是:元数据。

您需要跟踪有关您的数据的一些数据。

如果你想让你的数据库列在你的模型上作为普通的公共(public)属性公开(并且你不想进入魔法 _get()/_set() 东西) ,您需要在某处维护一个列表,其中的属性需要从数据库读取/写入数据库。

你可以有类似的东西;

<?php
class User extends Model {
public $dbcols = array(
'id',
'name',
'email'
);
}

然后您的 save() 方法将检查 $this->dbcols 以确定它需要担心的数据。在上面的例子中,一个 update() 方法会做这样的事情:

function update(){
$updates = array();
foreach($this->dbcols as $name){
$updates[$name] = "'{$this->escape($this->$name))}'";
}
$sql = "UPDATE {$this->tableName} SET " . implode(',',$updates) . " WHERE id={$this->id}";
...
}

当然,您可以使 $dbcols 成为一个关联数组,并为您的属性和列名使用不同的标识符,添加验证或转义规则,最终使事情变得非常复杂。

关于php - 一个很好的 mvc 模型类,跟踪属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8146037/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com