子类共享方法而不多次运行__construct

时间:2012-12-01 12:48:11

标签: php class

我有5个不同的模型类。每个都处理不同类型的数据,但它们都遵循相同的格式。

我希望每种模型都能分享像toJson,toArray等函数。

我有很多方法可以做到这一点,我可以解决这些问题,但有一个更好的方法。

这是我想要的效果:

<?
something here{
    function toJson(){return json_encode($this->lastResult);}
}
class applications{
    function findAllFoo(){
        $this->lastResult = $this->db->foo->find();
        return $this;
    }
}

class users{
    function findAllBar(){
        $this->lastResult = $this->db->bar->find();
        return $this;
    }
}
$models = new models();

echo $models->applications->findAllFoo()->toJson();
echo $models->users->findAllBar()->toJson();

我可以new applications($this)每个类都传递模型,但我确信在标准实践中有一种方法可以做到这一点。

TL; DR - 我如何拥有一组共享一些辅助函数的类,但不会与__construct函数冲突?

2 个答案:

答案 0 :(得分:3)

这是一个坏主意。父母不应该了解他们的孩子。一个班级应该独立,按原样运作。孩子可以延长父母并使用它,因为这种关系是通过x extends y声明编纂和执行的。父母与孩子之间没有这种关系,所以只看一堂课就不可能说它是否会起作用,因为不知道孩子是否在实施时存在。

重新思考你在做什么。孩子延伸已经完整的父母,父母不依赖孩子。

答案 1 :(得分:1)

如果所有模型共享某些功能,为什么不为它们设置“模型”基类?

abstract class Model {
    protected $lastResult;
    protected $db;

    public function __construct(DB $db) {
        $this->db = $db;
    }

    public function toJson() {
        return json_encode($this->lastResult);
    }
}

class Applications extends Model {
    public function findAllFoo() {
        $this->lastResult = $this->db->foo->find();
        return $this;
    }
}

class ModelBroker {
    public $applications;

    public function __construct() {
        $db = /* ... connection code here ... */;
        $this->applications = new Applications($db); // <-- dependency injection
    }
}

$models = new ModelBroker();
$json = $models->applications->findAllFoo()->toJson();