另一个开发人员和我正在建设一个网站,我们实现了我们自己的OOP模型,我们进行了大量的讨论,但我似乎遇到了砖墙。,请容忍我,
我们所有的类都扩展对象,它有一个构造函数,它使用get_called_class()获取类,然后使用get_class_vars()等来加载列名,这意味着默认情况下我们可以在类中拥有一个save、delete、displayExisting、getAll和其他一些方法,这就消除了很多代码。这很好。现在,我有了一个类InboundData,它有3个类扩展了自身,称为Visit、Enquiry和BrochureRequest,它们有一个"inbound_data_id“,然后InboundData有一个重载的构造函数,如下所示:
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);
}问题是,contact、address、domain和park都受到保护,从而阻止对象的方法将它们作为列名/类vars来获取。这是我们对所有非db成员采用的方法,例如:
protected $contact;
protected $address;
protected $domain;
protected $park;在编写前端代码之前,我们还没有遇到任何问题,我发现我显然无法填写$formObj->contact->var等,更不用说我还没有为入站数据扩展对象编写任何保存代码,这些对象需要保存所有附加的表。
请一位OOP大师让我们知道我们哪里出了问题,以及实现这一目标的最佳方法是什么。随便问点问题,我知道这听起来一定很混乱。
发布于 2012-02-14 15:18:17
我不确定我是否理解您想要做什么,但听起来好像您有一个显示页面的Template对象,您希望获得Enquiry (例如) contact值并将其应用到模板中。我建议这样做:
class TemplateBuilder {
public static function addDataToTemplate(Template $tpl, Object $enq) {
$enq->addToTemplate($tpl);
}
}这并不完全必要,但下一步是:
class Enquiry extends Object {
...
public function addToTemplate(Template $tpl) {
$tpl->contact->var = $this->contact;
}
}这使Enquiry-only数据得到保护,就像您想要的那样,并且您可以非常具体地控制要向哪个对象添加哪些数据。
这是一个有点离题的话题,但我建议不要使用扩展,而要经历所有这些魔术。如果您有许多扩展Object的类可以使用的实用工具方法,则可以使用Object (或其调用的任何函数)作为成员来构造它们,并通过组合使用它。
发布于 2012-02-14 15:14:57
一般说来,从对象扩展所有东西并不是一个好主意。它在您的模型中添加了许多不属于实际的方法。它也破坏了基本的is--这是你通常希望从一个好的对象模型中得到的关系。
在不考虑前端的情况下建造后端也不是一个好主意。这会导致徒劳的努力。
关于设置属性的范围。您不能简单地添加getter/setter来访问所需的内容吗?您考虑过使用__get()和__set()魔术方法吗?
跟踪需要保存的修改的一种常见方法是使用isDirty标志。跟踪从数据库加载的对象的下一个问题。这通常通过使用实体管理器来解决。
如果遇到设置无法解决的对象的属性的问题,可以使用反射API强制设置一些属性。ReflectionProperty::setAccessible()允许您在私有/受保护的属性上设置一个值。
https://stackoverflow.com/questions/9279083
复制相似问题