Php 面向对象继承
另一个开发者和我正在构建一个站点,我们实现了我们自己的OOP模型,我们对此进行了很多讨论,但似乎我遇到了麻烦请容忍我 我们所有的类都扩展了Object,Object有一个构造函数,它使用Php 面向对象继承,php,oop,inheritance,Php,Oop,Inheritance,另一个开发者和我正在构建一个站点,我们实现了我们自己的OOP模型,我们对此进行了很多讨论,但似乎我遇到了麻烦请容忍我 我们所有的类都扩展了Object,Object有一个构造函数,它使用get\u called\u class()来获取类,然后使用get\u class\u vars()等来加载列名,这意味着我们可以在一个类中默认使用save,delete,displayExisting,getAll,以及其他一些方法,这消除了很多代码。这很好。现在,我有一个类InboundData,它有三个类
get\u called\u class()
来获取类,然后使用get\u class\u vars()等来加载列名,这意味着我们可以在一个类中默认使用save
,delete
,displayExisting
,getAll
,以及其他一些方法,这消除了很多代码。这很好。现在,我有一个类InboundData
,它有三个类扩展,分别称为Visit
,inquiry
,和brockhureRequest
,它们有一个“inbound\u data\u 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);
}
class TemplateBuilder {
public static function addDataToTemplate(Template $tpl, Object $enq) {
$enq->addToTemplate($tpl);
}
}
问题是,联系人
、地址
、域
和公园
都受到保护,以防止对象的方法将它们作为列名/类变量提取。这是我们对所有非db成员采用的方法,例如:
protected $contact;
protected $address;
protected $domain;
protected $park;
我们没有遇到任何问题,直到编写前端代码,我才发现我显然无法填写$formObj->contact->var
等,更不用说我没有为入站数据扩展对象编写任何保存代码,这将需要保存所有附加表
请让OOP大师告诉我们哪里出了问题,以及实现这一点的最佳方法是什么。请随便问任何问题,我知道这听起来一定很混乱。一般来说,从对象扩展所有内容不是一个好主意。它在您的模型中添加了大量不属于您的方法。它还打破了一个良好的对象模型通常期望的基本is-a关系 在不考虑前端的情况下构建后端也不是一个好主意。这会导致徒劳的努力 就设置属性而言。您不能简单地添加getter/setter来访问您需要的内容吗?你考虑过使用uuu get()和uuu set()魔术方法吗 跟踪需要保存的修改的常用方法是使用isDirty标志。下一个问题是跟踪从数据库加载的对象。这通常通过使用实体管理器来解决
如果在无法解决的对象上设置属性时遇到问题,可以使用反射API强制设置某些属性。ReflectionProperty::setAccessible()可以让您在私有/受保护的属性上设置一个值。我不确定是否理解您的意图,但听起来您有一个显示页面的某种
模板对象,您想获得查询(例如)联系
值并将其应用于模板。我建议这样做:
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);
}
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;
}
}
这使得查询
只保护数据,就像您希望的那样,并且您可以非常具体地控制要向哪些对象添加哪些数据
这有点离题了,但我建议不要使用扩展,并经历所有这些神奇的过程。如果您有许多扩展对象的类可以使用的实用方法,那么您可以将对象
(或其名称)作为成员来构造它们,并通过组合使用它。您是否尝试过编写getter<代码>函数get($field){return$this->$field;}
并使用get(“contact”)
提取contactBTW,get\u调用的类
是多余的,因为从PHP起,\u类
魔术常量的行为就是多余的5@rdlowrey谢谢,将来会用的,Eugen这就是我现在用的,但它无助于节省:(这个扩展业务把我搞砸了。:/还请记住松散耦合的方面。例如,更改Address类也可能会破坏inboundData。$This->Address=new Address($This->Address\u id);这真的很好。谢谢,除了当尝试保存inbounddata对象时,当前正在从visit保存()'d,然后在重载的save()中调用parent::save();不知何故不仅从inbounddata返回变量,而且从visit返回变量?所有这些都使用get_class_vars from object。