Php 如何使用$query获取类对象->;罗恩编码点火器

Php 如何使用$query获取类对象->;罗恩编码点火器,php,codeigniter,object,stdclass,Php,Codeigniter,Object,Stdclass,我目前正在使用Codeigniter框架。在下面的代码中,我想得到一个Animal_model对象,而不是stdClass对象 <?php class Animal_model extends CI_Model{ var $idanimal; var $name; public static $table = 'animals'; function __construct() { parent::__construct(); }

我目前正在使用Codeigniter框架。在下面的代码中,我想得到一个
Animal_model
对象,而不是
stdClass
对象

<?php
class Animal_model extends CI_Model{

    var $idanimal;
    var $name;
    public static $table = 'animals';

    function __construct() {
        parent::__construct();
    }

    function getone(self $animal){
        $query = $this->db->get_where(self::$table, array('id_animal' => $animal->idanimal));

        if($query == FALSE){
            return FALSE;
        }else{
            return $query->row(); // How to get an Animal_model object here? 
        }
    }
}

$lion = new Animal_model();
$lion->idanimal = 25; 
var_dump($lion); // It says "object(Animal_model)".

$lion = $lion->getone($lion);
var_dump($lion); // Now it says "object(stdClass)".

?>

如何将
$query->row()
转换为动物模型对象?

您的第一个
变量转储($lion)
类型为
对象(动物模型)

然后用
$lion->getone($lion)的结果覆盖
$lion
的值
$lion
现在要么是
FALSE
,要么是
$query->row()
的值,该值返回一个对象(
stdClass

$query->row()
始终返回数据库结果对象(一个
stdClass
对象)

你的代码正在做它应该做的事情

我可以问一下为什么您需要该对象的类型为
动物模型

    if($query == FALSE){
        return FALSE;
    }else{
       // How to get an Animal_model object here? 
       $row = $query->row();

       $animal = new Animal_model();
       $animal->idanimal = $row->idanimal;
       $animal->name= $row->name;
       return $animal;
    }
以上内容可以满足您的要求,但我认为这不是一个好主意。最好有第二个类,例如
Animal
,它不扩展任何可以用来表示动物的模型

class Animal
{
    public name = '';
    public id = 0;

    public function __construct($id, $name)
    {
        $this->id = $id;
        $this->name = $name;
    }
}
在您的模型中,您可以创建并返回这些实例,而不是返回模型对象

    if($query == FALSE){
        return FALSE;
    }else{
        $row = $query->row();
        return new Animal($row->idanimal, $row->name);
    }
我还将更改
getone
函数,改为获取ID,并选择此ID匹配的位置:

function getone($id){

通过这种方式,您可以将模型用作动物的管理器,模型将处理数据并返回动物对象。

而不是返回$query->row();您可以实例化Animal_model类的对象,并将$query->row()中的值分配给该对象的属性。但我不确定这样做有什么价值。您仍将获得相同的数据。在Animal_Model类中是否有一个方法需要在检索行后调用

    if($query == FALSE){
        return FALSE;
    }else{
        $row = $query->row();
        return new Animal($row->idanimal, $row->name);
    }

边栏注释。。。您可能希望避免使用“var”来描述您的属性。也许你想用“Protected”这个词,除非你能想出公开或私人的理由。

如果我理解你的问题;当您调用数据库表而不是单个列数据时,您希望自定义类对象(类型为Animal\u model),对吗

首先,当您调用$query->row()时,您不会检索动物模型对象。您正在检索数据库行对象。您实际上必须从中提取各个数据实例:

   $row = $query->row(); 

   echo $row->title;
   echo $row->name;
   echo $row->body;

因此,由于您设计类的方式,我建议您创建一个自定义静态函数,该函数将获取数据库行对象的实例,并实例化一个新的Animal_模型实例。或者是一种方法,它获取数据库行对象的实例并填充所述对象的字段。

CodeIgniter为此具有内置功能

return $query->row(0, 'Animal_model');

方法不会返回数据库结果对象。您可以在stdClass对象、数组或自定义类之间进行选择。查看或查看
system/database/DB_Result.php
。谢谢,这正是我想要的!感谢您提供有关var/protected的提示。