首页
学习
活动
专区
圈层
工具
发布

OOP继承
EN

Stack Overflow用户
提问于 2012-02-14 14:56:56
回答 2查看 244关注 0票数 1

另一个开发人员和我正在建设一个网站,我们实现了我们自己的OOP模型,我们进行了大量的讨论,但我似乎遇到了砖墙。,请容忍我,

我们所有的类都扩展对象,它有一个构造函数,它使用get_called_class()获取类,然后使用get_class_vars()等来加载列名,这意味着默认情况下我们可以在类中拥有一个savedeletedisplayExistinggetAll和其他一些方法,这就消除了很多代码。这很好。现在,我有了一个类InboundData,它有3个类扩展了自身,称为VisitEnquiryBrochureRequest,它们有一个"inbound_data_id“,然后InboundData有一个重载的构造函数,如下所示:

代码语言:javascript
复制
function __construct($id = '')
{   
    $this->className = get_called_class();
    $this->id = (int)$id;
    $this->tableName = strtolower($this->className);
    $this->setDbFields();
    $this->loadData();

    $this->contact = new Contact($this->contact_id);
    $this->address = new Address($this->address_id);
    $this->domain = new Domain($this->domain_id);
    $this->park = new Park($this->park_id);
}

问题是,contactaddressdomainpark都受到保护,从而阻止对象的方法将它们作为列名/类vars来获取。这是我们对所有非db成员采用的方法,例如:

代码语言:javascript
复制
protected $contact;
protected $address;
protected $domain;
protected $park;

在编写前端代码之前,我们还没有遇到任何问题,我发现我显然无法填写$formObj->contact->var等,更不用说我还没有为入站数据扩展对象编写任何保存代码,这些对象需要保存所有附加的表。

请一位OOP大师让我们知道我们哪里出了问题,以及实现这一目标的最佳方法是什么。随便问点问题,我知道这听起来一定很混乱。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-14 15:18:17

我不确定我是否理解您想要做什么,但听起来好像您有一个显示页面的Template对象,您希望获得Enquiry (例如) contact值并将其应用到模板中。我建议这样做:

代码语言:javascript
复制
class TemplateBuilder {
    public static function addDataToTemplate(Template $tpl, Object $enq) {
       $enq->addToTemplate($tpl);
    }
}

这并不完全必要,但下一步是:

代码语言:javascript
复制
class Enquiry extends Object {
   ...
   public function addToTemplate(Template $tpl) {
      $tpl->contact->var = $this->contact;
   }
}

这使Enquiry-only数据得到保护,就像您想要的那样,并且您可以非常具体地控制要向哪个对象添加哪些数据。

这是一个有点离题的话题,但我建议不要使用扩展,而要经历所有这些魔术。如果您有许多扩展Object的类可以使用的实用工具方法,则可以使用Object (或其调用的任何函数)作为成员来构造它们,并通过组合使用它。

票数 1
EN

Stack Overflow用户

发布于 2012-02-14 15:14:57

一般说来,从对象扩展所有东西并不是一个好主意。它在您的模型中添加了许多不属于实际的方法。它也破坏了基本的is--这是你通常希望从一个好的对象模型中得到的关系。

在不考虑前端的情况下建造后端也不是一个好主意。这会导致徒劳的努力。

关于设置属性的范围。您不能简单地添加getter/setter来访问所需的内容吗?您考虑过使用__get()和__set()魔术方法吗?

跟踪需要保存的修改的一种常见方法是使用isDirty标志。跟踪从数据库加载的对象的下一个问题。这通常通过使用实体管理器来解决。

如果遇到设置无法解决的对象的属性的问题,可以使用反射API强制设置一些属性。ReflectionProperty::setAccessible()允许您在私有/受保护的属性上设置一个值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9279083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档