【问题标题】:How to handle data when using classes - PHP [closed]使用类时如何处理数据 - PHP [关闭]
【发布时间】:2018-08-15 12:21:26
【问题描述】:

我目前在 CodeIgniter 中工作,我正在努力了解如何在我的编程中正确使用 Anemic 或 Rich Entity Classes

我希望创建一个具有 getter/setter 的贫血实体,但我想知道这一切是如何工作的。

例如:

我可以在第一次创建对象实例时使用该对象来设置和获取信息,但是当从我的数据库中检索信息时,如何将信息返回到对象中以便我可以使用这些对象方法?

我听说过使用 Doctrine 将对象映射到关系数据库,但我已经创建了我想要使用的数据库架构,但我不确定如何让 Doctrine 映射到现有数据库。

我曾想过尝试:

  • 使用__construct 函数设置所有对象属性 使用我从 SQL 查询中得到的数组,这似乎不合适。
  • 创建对象实例并设置所有对象 我从 SQL 查询中获得的数组值的属性,这看起来很乏味。
  • 在对象中创建一个方法,该方法采用我从中获取的数组 SQL 查询并将所有值分配给正确的对象 属性,看起来还可以。

但我的问题是: 这样做有普遍接受的做法吗?(Doctrine 除外)

【问题讨论】:

  • 1) 您可以获取学说来映射现有模式,只需将其定义为与注释相同。 2)如果您要使用自制解决方案,最好有命名约定(php - $myField,db - my_field) - 然后您可以调用由变量定义的函数(循环遍历结果中的所有字段,每个字段调用$fn = 'set'.$fieldName; $obj->$fn($fieldValue);等)3)使用反射
  • 您的三个选项都是可能的并且是明智的。
  • codeigniter 使用活动记录 orm 我记得允许使用对象
  • @bxN5 是否只使用 custom_result_object() 函数并指定要将对象返回到哪个类?

标签: php codeigniter oop


【解决方案1】:

我建议使用 Doctrine 或其他 ORM 工具,但如果你想 DIY,这里是使用反射的小例子。

<?php

class Foo {
    private $id;
    private $name;

    public function getId(){ return $this->id; }

    public function getName(){ return $this->name; }

    public function setName($name){ return $this->name = $name; }
}

$dataFromDb = [
    [
        'id' => 1,
        'name' => 'John'
    ]
];


foreach ($dataFromDb as $row) {
    $foo = new Foo();
    $ref = new ReflectionClass('Foo');

    foreach ($row as $propName => $propValue) {
        $prop = $ref->getProperty($propName);
        $prop->setAccessible(true);
        $prop->setValue($foo, $propValue);
    }

    var_dump($foo);
}

【讨论】:

  • 是的,所以它基本上只是创建函数来操作您想要从 db->class 和 class->db 获取的数据?
  • 好吧,您可以只创建一个函数来处理它并通过表名解析类。使用反射的要点是您可以在没有 setter 的情况下保留私有 props(例如,Id 应该没有 setter)
  • 对不起,我不太明白。使用ReflectionClass 与仅实例化一个类并使用其中一种类方法来正确设置属性有什么区别? ReflectionClass如何避免设置id?
  • @AdamM 实体中不应该有setId()方法,id是自动生成的值,所以不能直接设置
猜你喜欢
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多