PHP类:需要帮助继承两个类

Posted

技术标签:

【中文标题】PHP类:需要帮助继承两个类【英文标题】:PHP classes: Need help to inherit two classes 【发布时间】:2010-09-29 23:30:52 【问题描述】:

在设计需要从多个类扩展的 php 类时,我需要帮助。

我有一个通用类 Pagination.php,它执行各种分页和排序。所有其他类都将使用它进行分页。

为了让我的生活更轻松,我制作了一个从 mysql 表生成类的类生成器。所有属性、getter、setter 和常用方法都是自动创建的,真正节省了时间和金钱。

例如,Staff_Base.php 中的 Staff_Base 类是从 SQL 表 t_staff 自动生成的。

由于Staff_Base 类是从SQL 表中自动生成的,因此任何“自定义”方法/属性都位于另一个扩展Staff_Base.php 的类中。 (这样每当添加一个新字段时,我就可以简单地重新生成 Staff_Base 类并在 Staff_Base.php 中覆盖)。

所以我有扩展 Staff_Base.php 的类 Staff.php。

问题是,Staff.php 还需要扩展另一个类 Pagination.php。 (目前的解决方法是将 Pagination.php 中的方法放入每个类中。每当我更改分页/排序方法时,这真的很麻烦。)

我该怎么做? 实现这一目标的最佳设计模式是什么?

我知道重组课程的常见建议,但我真的很想其他解决方法/解决方案。另外,我可能还需要扩展 Pagination.php 以外的其他类。

谢谢!

【问题讨论】:

员工“是分页”?听起来更像是应该简单地使用 Pagination 对象而不是扩展它。 【参考方案1】:

你不能,php不支持多重继承,但是如果你在这个主题上进行谷歌搜索,你可以找到一些解决方法......

【讨论】:

只是告诉某人去谷歌搜索并没有太大帮助,特别是如果提问者专门寻求有关如何重组事物的指导,并且清楚地表明他知道方向的问题。他目前正在考虑。【参考方案2】:

好吧,您可能已经知道 PHP 不支持多重继承。一种解决方法可能是使用接口而不是超类,但是,如果接口的每个实现的逻辑相同,这可能会变得乏味。编写一个代码生成器怎么样,它只是将方法注入每个类?您似乎已经在“常用方法”上这样做了。

哦,在 PHP 中使用 getter 和 setter(它们在例如 Java 中使用)被认为不是一个好主意。对象虽然很慢,所以使用公共字段被认为是常态。

编辑:然后是__call()-hack,它可以识别实际驻留在其他类中的方法,并手动调用它们。

【讨论】:

你有公共领域的来源是常态吗?我认为任何试图在 PHP 中认真练习 OOP 的人都在使用 getter/setter。否则你不能正确地强制你的对象内部状态的正确性,对吧?【参考方案3】:

你可以让你生成的 Staff_Base 类继承自 Pagination 吗?或者 Staff_Base 是否已经从另一个基类(您无法控制)继承...

听起来像 Doctrine 或 Propel,我不记得哪个使用 *_Base 类系统。

我的建议是重写分页以供您的实体类使用,而不是要求您的实体类对其进行扩展。

【讨论】:

轻轻一推:刚刚发布的Doctrine2不再有基类要求。不过,这是一次彻底的重写,摒弃了 Doctrine 中一些最糟糕的想法。【参考方案4】:

我建议更改您的 Staff_Base.php 生成器以使该类默认扩展分页。这样Staff 扩展Staff_BaseStaff_Base 扩展Pagination。我认为这可能是获得所需结果的最简洁(也是最面向对象)的方式。

【讨论】:

【参考方案5】:

因此,如果我正确阅读了您所写的内容,由于您无法从 2 个类继承,因此您将分页复制到您拥有的每个类中。

类堆叠是一种解决方案。我的第一件事是googled。

【讨论】:

【参考方案6】:

听起来你在这里搞混了。一个类(例如 Staff 类)用于表示单个实体。例如:

$john = new Staff('John');

分页到底是如何适应这个的?可分页(可分页?)听起来像是允许访问这些员工实体的任何属性,而不是实体本身的属性。这样一来,您创建的从基类继承的每种类型的 Staff 类的方法就很清楚了。

所以,我认为您需要的解决方案是:

    Staff 类(Staff_Base 及其子图) 员工数据访问对象(如果您使用命名空间,DAO\Staff 将是一个不错的名称) 一个接口,向世界发出信号表明 DAO 可以被分页

需要注意的是,DAO 类和 Staff 类之间没有直接的继承关系。您仍然可以根据其在数据库中的属性生成 Staff_Base 类,并从那里扩展...只要您不包括该类中的实际数据访问。

使用它的代码将如下所示:

 <?php
 $staffDao = new DAO\Staff;
 $staffMembers = $staffDao->getPagedResult($start, $amount);
 ?>

编辑强调继承结构应该与实际检索分开

【讨论】:

以上是关于PHP类:需要帮助继承两个类的主要内容,如果未能解决你的问题,请参考以下文章

我需要帮助来实现特定的休眠继承映射

9. 实现类复用的两个手段——继承与组合

PHP trait使用

PHP Trait 解决 PHP 单继承问题

关于php继承类的总结

从两个抽象类继承,其中一个也需要另一个基类的一部分