如何在框架中扩展核心类

时间:2011-01-31 18:26:21

标签: php design-patterns frameworks php-5.3

我一直在使用自己的make PHP 5.3 Web应用程序框架,我必须说这是一个非常愉快的工作。我实际上是在考虑用它开源,并让其他人感受到同样的快乐;)

这是我的问题。所有核心类必须是可扩展的,以及良好方式实现这一目标的重要性有多重要? Codeigniter在任何地方都使用单例模式,这是不可能的。 Kohanas文件系统很好,但是根据我的喜好包含许多文件(空类)。

我从未使用过Symfony,但我听说它利用了依赖注入?我不是这个主题的大师,但有一些知识。这是要走的路吗?有一种“更聪明”的方式吗?

P.S。我正在使用带有命名空间,闭包等的PHP 5.3。

Tobias(开发中的瑞典人)

2 个答案:

答案 0 :(得分:2)

我会看一下Symfony2LithiumZend Framework,我认为它们在设计方面是最好的。我建议不要使用单例并使用依赖注入。

  

所有核心类必须是可扩展的并且实现这一目标的好方法有多重要?

这实际上取决于班级责任。您可能不希望扩展MVC堆栈中的某些核心组件(假设它是MVC)并且您可以将它们声明为final,或者通过插件和帮助程序将某些方法声明为final和force扩展。其他类可能被设计为扩展,在这种情况下,它们应该被声明为抽象。

IMO,您应该主要使用受保护的属性并提供访问器方法。但是,不要仅仅在所有属性上使用受保护的可见性,一些人可以公开和私有,这一切都归结为责任。

所有考虑到一个班级有多少责任,如果它正在服务多个角色/目的,那么就该重构并将该班级分成太多或多个班级。并且不要忘记使用接口!

  

我实际上是在考虑使用它来开放源代码并让其他人感受到同样的快乐;)

在发布代码之前,请考虑以下事项:

  • 我的所有代码单元都经过测试吗?
  • 我是否使用版本控制?
  • 我是否有完整的API文档?

我讨厌成为一个沮丧的人,但是如果你对这些问题的回答都是“不”,那就不用担心开源代码了,因为没有人会使用它。也许只是开始使用GitHub for SCM。还要考虑那里已经有很多顶级框架,为什么他们会使用你的呢?

另请务必阅读Top ten reasons why I wont use your open source project

...我只是想让你免于额外的,不必要的努力进入你的项目供公众使用,无论如何你都不会有任何牵引力。

答案 1 :(得分:0)

我非常喜欢Zend Framework执行此操作的方式:主要有一个抽象类(用于扩展它)和一个具体类(用于具体用例),例如: Db Mapper:

您可以扩展Zend_Db_Table_Abstract类:

class Bugs extends Zend_Db_Table_Abstract
{
    protected $_name = 'bugs';
}

或者,如果您只需要简单的函数,则可以通过以下方式创建新的Db表对象:

$bugTable = new Zend_Db_Table('bug'); 
// Zend_Db_Table extends Zend_Db_Table_Abstract

因此,您必须为解决方案中的每种类型创建两个类:抽象类和具体类。

更多信息: http://framework.zend.com/manual/en/zend.db.table.html