Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 面向对象继承_Php_Oop_Inheritance - Fatal编程技术网

Php 面向对象继承

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,它有三个类

另一个开发者和我正在构建一个站点,我们实现了我们自己的OOP模型,我们对此进行了很多讨论,但似乎我遇到了麻烦请容忍我

我们所有的类都扩展了Object,Object有一个构造函数,它使用
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。