Php 未多次运行_构造的子类共享方法

Php 未多次运行_构造的子类共享方法,php,class,Php,Class,我有5个不同的模型课。每一个都处理不同类型的数据,但它们都遵循相同的格式 我希望每种模型都能共享toJson、toArray等函数 有很多黑客的方法我可以做到这一点,我可以找出这些,但必须有一个更好的方法 以下是我想要的效果: <? something here{ function toJson(){return json_encode($this->lastResult);} } class applications{ function findAllFoo(){

我有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();

这是个坏主意。父母不应该知道他们的孩子。一个类应该独立,按原样工作。子级可以扩展父级并使用它,因为该关系是通过
x extends y
声明编码和强制的。然而,父母和孩子之间并没有这种关系,所以仅仅看一个类就不可能判断它是否有效,因为不知道孩子在实现时是否存在


重新思考你在做什么。孩子扩展了已经完成的父母,父母不依赖孩子。

如果所有模型都共享一些功能,为什么不为它们创建一个“模型”基类呢

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();
抽象类模型{
保护$lastResult;
受保护$db;
公共函数构造(DB$DB){
$this->db=$db;
}
公共函数toJson(){
返回json_encode($this->lastResult);
}
}
类应用程序扩展了模型{
公共函数findAllFoo(){
$this->lastResult=$this->db->foo->find();
退还$this;
}
}
类ModelBroker{
公帑申请;;
公共函数构造(){
$db=/*…此处的连接代码…*/;
$this->applications=newapplications($db);//applications->findAllFoo()->toJson();

一种“模拟”的方法这将使用PHP 5.4 traits,对吗?很公平。请原谅我对这种情况的糟糕解释,我发布的示例只是按照我所认为的那样-似乎你从字面上理解了它。我编辑了这篇文章,并澄清了我试图做的事情。我正试图使家长与我无关,但我想要为了能够在所有模型中使用JSON,而无需在每个模型中定义它,也无需多次连接到数据库。@Kavi对于数据库依赖项,您应该遵循依赖项注入原则。实例化一个数据库,并在实例化时将其传递到需要它的对象中。对于共享功能,您可以使用inheritance在有意义的地方。或者traits在有意义的地方。或者在每个类中使用自定义实现的接口声明在有意义的地方。我不确定你要做什么,但是父母实例化孩子是不允许的。顺便说一句,你也违反了这个规定。@deceze谢谢你的链接,我会对你告诉我的其他事情做一些研究我正在从脚本化的意大利面代码中生活,试图把事情做对,所以我真的很感激。传递这个对象是我实际上是怎么做的,但是我认为它是不干净的,虽然我没有达到这些标准的标准。我认为,如果我避免连接到DB,继承就可以在这里工作。在构造中,并保持助手函数不变。我现在将研究特性和接口声明。@Kavin可能对您也很感兴趣。只需将类作为自包含的实体,将它们需要的所有外部内容作为依赖项显式传递。尝试找出一个结构,其中包含5种不同类型的模型可以使用外部定义的函数,而不扩展父函数,因为这样会多次连接到数据库。请避免对您的问题进行根本性更改,除非他们确实改进了问题并澄清了您的要求。目前,您的文本似乎没有讨论所提供的代码。@KaviSiegel,有一点不同“问题”和“陈述”之间的差异。尽管如此,(无耻的插曲)可能是你真正想要的。@Niko请避免回滚我的编辑,这些编辑是为了澄清我的问题。这是我的判断,不是你的,而且非常粗鲁。如果你不明白我的问题,我道歉,但是,嘿,有时候需要一些编辑来表达正确的内容。@tereško通过那篇文章阅读,这很好f类似于MongoDb已经为它的connect方法所做的。这与我想要做的相反,我想共享连接,而不是重新运行连接代码。不过感谢链接-很好的阅读!啊,这很有意义。当你将
ModelBroker
拆分到一个单独的类中时,我出于某种原因ed将这种联系抽象化。我对这方面的工作还不熟悉,我很感谢你在编辑我的评论中对你的回答如此之好!关于你如何定义
\u构造(DB$DB)的问题
-将其定义为DB,有什么意义吗?这叫什么?如果我能帮上忙,我很高兴-事实上,回滚可能不是最佳选择。--
DB$DB
东西被调用,并且要求参数$DB是名为“DB”的类的实例。您需要将其调整为数据库连接的实际类名(或者干脆将其完全剥离,这是一个可选功能)。但通常,最好指定所需的对象类型。