我需要帮助设计我需要从多个类扩展的PHP类。
我有一个普通的类,Pagination.php,可以进行各种分页和排序。所有其他类都将使用它进行分页。
为了让我的生活更轻松,我创建了一个从MySQL表生成类的类生成器。所有属性,getter,setter和常用方法都是自动创建的,这样可以节省时间和金钱。
例如,Staff_Base.php中的类Staff_Base是从SQL表t_staff自动生成的。
由于类Personzzase是从SQL表自动生成的,因此任何“自定义”方法/属性都位于另一个扩展Staff_Base.php的类中。 (因此,无论何时添加新字段,我都可以简单地重新生成Staff_Base类并在Staff_Base.php中覆盖)。
所以我有一个扩展Staff_Base.php的类Staff.php。
问题是,Staff.php还需要扩展另一个类Pagination.php。 (目前的解决方法是将Pagination.php中的方法放入每个类中。每当我对分页/排序方法进行更改时,这真的很麻烦。)
我该怎么做? 实现这一目标的最佳设计模式是什么?
我知道重组我的课程的常见建议,但我真的很难想到其他解决方法/解决方案。另外,我可能还需要扩展除Pagination.php之外的其他类。
谢谢!
答案 0 :(得分:8)
您可以将生成的Staff_Base类继承自Pagination吗?或者Staff_Base已经从另一个基类继承(你无法控制)......
听起来像Doctrine或Propel,我不记得哪个使用* _Base类系统。
我的建议是重写分页,以便能够被实体类使用,而不是要求实体类扩展它。
答案 1 :(得分:2)
因此,如果我正在阅读您正确编写的内容,因为您无法从2个类继承,所以您将paginate复制到您拥有的每个类中。
类堆叠是一种解决方案。我googled的第一件事之一。
答案 2 :(得分:1)
我建议您更改Staff_Base.php
生成器以使该类默认扩展分页。这样Staff
扩展Staff_Base
,Staff_Base
扩展Pagination
。我认为这可能是获得所需结果的最干净(也是最面向对象)的方式。
答案 3 :(得分:0)
你不能,php不支持多重继承,但如果你对这个主题进行谷歌搜索,你可以找到一些解决方法......
答案 4 :(得分:0)
听起来你在这里混合了一些东西。类(例如Staff类)用于表示单个实体。例如:
$john = new Staff('John');
分页究竟如何适合这个?可分页(可分页?)听起来像是一个允许访问这些Staff实体的属性,而不是实体本身。这样,您创建的每种类型的Staff类都可以清楚地从基类继承。
所以,我相信你需要的解决方案:
要注意的是,DAO类和Staff类之间没有直接继承。您仍然可以根据数据库中的属性生成Staff_Base类,并从那里扩展...只要您不在该类中包含实际数据访问。
使用它的代码看起来像这样:
<?php
$staffDao = new DAO\Staff;
$staffMembers = $staffDao->getPagedResult($start, $amount);
?>
编辑强调继承结构应与实际检索分开
答案 5 :(得分:-1)
好吧,您可能已经知道PHP不支持多重继承。一种方法可能是使用接口而不是超类,但是,如果每个接口的实现逻辑相同,这可能会变得乏味。如何编写代码生成器,只是将方法注入每个类?你似乎已经在“常用方法”上做到了这一点。
哦,在PHP中使用getter和setter(因为它们在例如Java中使用)被认为不是一个好主意。对象虽然很慢,但使用公共字段被认为是常态。
编辑:然后是__call() - hack,它可以识别实际驻留在其他类中的方法,并手动调用它们。