Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Dependency Injection_Tdd - Fatal编程技术网

Php 模型可以填充自己的属性吗?

Php 模型可以填充自己的属性吗?,php,oop,dependency-injection,tdd,Php,Oop,Dependency Injection,Tdd,如果我有一个基本上代表数据库中一行的模型,那么它是否适合于扩展和测试,以及让它填充它自己的属性,或者应该让它注入它的属性,就像注入对象一样 例如: Class blog { $id; $title; $body; public function load($id) { // db query to load id, title, body } } 或 如果您想将数据存储层与模型本身分离,那么应该使其可注入 如果模型是数据存储抽象,您不需

如果我有一个基本上代表数据库中一行的模型,那么它是否适合于扩展和测试,以及让它填充它自己的属性,或者应该让它注入它的属性,就像注入对象一样

例如:

Class blog {
    $id;
    $title;
    $body;

    public function load($id) {
        // db query to load id, title, body
    }
}


如果您想将数据存储层与模型本身分离,那么应该使其可注入

如果模型是数据存储抽象,您不需要在意,只需要注入模型,然后模型应该有定义的接口,这样您就可以测试应用程序的其余部分


但这仅仅取决于您的需求和设计。

将数据库访问直接混合在模型类中被认为是一种不好的做法。通常首选注入值

这就是说,如果您死心塌地地执行$model->load($id)之类的操作,并从数据源获取它,那么您可以使用以下方法:

通过注入一个数据访问类,您可以传递一个模拟来进行测试,或者用一些web服务替换您的数据库,等等。只要$dataProvider有一个loadDataById()方法,该方法接受int并返回适当的数据结构,就可以了


就个人而言,我更喜欢保持我的模型良好,并专注于代表他们正在建模的任何东西。我依靠外部服务类和存储库来加载数据、将数据注入模型并返回它们

当你说数据存储抽象时,你是指CRUD风格的函数吗?例如,Blog类也可能有一个$blog -URL()函数…我是指将模型数据存储到持久存储(例如HTTP请求之间)的层。我明白了,所以您认为数据访问与业务逻辑在这种情况下是分开的吗?假设您已经调整了模型中的数据…可能更改了标题-您是使用模型保存数据,还是将数据注入$dataProvider?在该示例中,模型依赖于
数据提供程序
。哈克雷:我同意,这是一个需要仔细考虑的设计决定。我的关键点是,如果要创建依赖项,请使其可注入。johnnietheblack-是的,某种save()方法只会代理dataProvider::save(),它会将属性数组的对象本身作为参数。@timdev-那么,除了我能做的以外,什么是正常的?我知道从一个表中提取数据并在数据上运行函数是正常的……这通常会被分成这样的类吗?还有,有没有你可以推荐的教程?谢谢
Class blog {
    $id
    $title
    $body
}

// load blog data into $data, and then...

$blog = new Blog($data)
class Model {
    private $_dataProvider;

    // inject data-provider dependency in constructor
    public function __construct($dataProvider){
        $this->_dataProvider = $dataProvider;
    } 

    public function loadById($id){
        $myData = $this->_dataProvider->loadDataById($id);
        $this->setFoo($myData['foo']);
        ...
    } 
}