【发布时间】:2012-02-14 14:56:56
【问题描述】:
另一个开发人员和我正在建立一个网站,我们实现了我们自己的 OOP 模型,我们对此进行了很多讨论,但似乎我遇到了障碍。 请多多包涵
我们所有的类都扩展了Object,它有一个构造函数,它使用get_called_class()来获取类,然后get_class_vars()等加载列名,这意味着我们可以有一个save,delete,@ 987654324@、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 都受到保护,以阻止 Object 的方法将它们作为列名/类变量。这是我们对所有非 db 成员采用的方法,例如:
protected $contact;
protected $address;
protected $domain;
protected $park;
我们没有遇到什么问题,直到写前端代码才发现我明显不能填写$formObj->contact->var等,更何况我还没有写任何入站数据扩展的保存代码对象,这将需要保存所有附加的表。
请 OOP 专家告诉我们哪里出了问题,以及完成此任务的最佳方法是什么。随意提出任何问题,我知道这听起来一定很混乱。
【问题讨论】:
-
你试过写getter吗?
function get($field) { return $this->$field; }并使用get("contact")提取联系人 -
顺便说一句,考虑到 PHP 5 中
__CLASS__魔术常数的行为,get_called_class是多余的 -
@rdlowrey 谢谢,将来会使用,Eugen 这就是我现在使用的东西,但它无助于节省:( 这个扩展业务把我搞砸了。:/
-
还要记住松耦合的方面。例如,更改 Address 类也可能会破坏 inboundData。 $this->address = new Address($this->address_id);
标签: php oop inheritance