Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop - Fatal编程技术网

Php 将数据库值获取到对象中

Php 将数据库值获取到对象中,php,oop,Php,Oop,问题是你有类,然后你有数据库数据。创建对象时,如何设置对象属性以包含数据库中的数据 我看到这样的事情,我想知道这是否是最好的方法。我相信这是一个相当普遍的问题,但我不知道在如何处理这一问题上,什么是最被接受的解决方案 在本例中,创建对象时,将id作为参数传递,然后使用id对数据库运行查询,并将返回的值分配给对象属性。我没有太多的PHP经验,也没有太多使用过它 这是一种可以接受的实现这一目的的方式吗?有更好或更被接受的方法吗 public function __construct($id = nu

问题是你有类,然后你有数据库数据。创建对象时,如何设置对象属性以包含数据库中的数据

我看到这样的事情,我想知道这是否是最好的方法。我相信这是一个相当普遍的问题,但我不知道在如何处理这一问题上,什么是最被接受的解决方案

在本例中,创建对象时,将id作为参数传递,然后使用id对数据库运行查询,并将返回的值分配给对象属性。我没有太多的PHP经验,也没有太多使用过它

这是一种可以接受的实现这一目的的方式吗?有更好或更被接受的方法吗

public function __construct($id = null){
    if($id != null){
        $sql = "SELECT *
        FROM users
        WHERE user_id = $id";

        $res = Db::returnRow($sql);

        // $res contains an associative array with database columns and values

        if($res){
            $this->user_id = $res['user_id'];
            $this->user_name = $res['user_name'];
            //and so on...
        }
    }
}

是否有人可以提供一些示例代码或伪代码来说明执行此操作的正确方法?

您可以创建一个函数,通过在关联数组的键/值对上循环来自动执行此操作。或者你也可以考虑使用。

这可能是一种可以接受的家庭作业方式。但从建筑上看,情况并非如此

表示业务数据的类(示例中的用户)必须与数据库访问逻辑松散耦合。最后,充当用户的PHP类不应该知道数据来自数据库、文件或任何其他资源。接下来,您将能够在其他项目中重用您的用户php类,而无需对其进行任何更改!如果你有你的数据访问逻辑在里面,你就卡住了


结论:我建议阅读一些关于设计模式的参考资料(在您的情况下,看看DAO模式)提示:Head First系列中的一个非常容易访问且令人愉快。

是的,您可以通过让所有对象都从父类继承来半自动执行此操作。加载时,它查询“显示[my tablename]中的字段”,并用名称填充关联数组。如果传入了id,它将在该表中查找具有该id的有效对象,并将值分配给数组


旁注:不要像那样将id直接传递到查询中。将sql参数化,并围绕任何用户输入包装一个函数,以对其进行清理。

如果是mysql,您只需执行以下操作:

$obj = mysql_fetch_object($query);
PDO—使用任意类作为获取目标的能力,但请注意,在运行构造函数之前,它们会分配变量数据:

$pdo->query($stmt, PDO::FETCH_CLASS, "MyClass", array('foo'=>'bar'));

…其中最后一个参数包含类构造函数的参数。

我非常喜欢你的答案。我知道这对家庭作业或类似你所说的东西来说是可以的,因为它很有效,但我知道它设计得很糟糕,这就是我问这个问题的原因。我正在研究您建议的资源。是否有其他设计模式可以实现这一点?