Php 如何在框架中扩展核心类
我一直在使用我自己的makePHP5.3Web应用程序框架,我必须说,使用它是一件非常愉快的事情。实际上,我在想,用它来开放源代码,让其他人感受到与我一样的快乐;) 这是我的问题。所有核心类都必须是可扩展的,这有多重要?实现这一点的好方法是什么?Codeigniter在任何地方都使用单例模式,这是不可能的。Kohanas文件系统很好,但根据我的口味,它包含了许多文件(空类)的方式 我从未使用过Symfony,但听说它利用了依赖注入?我不是这方面的大师,但我有一些知识。这是路吗?有“更聪明”的方法吗 另外,我正在使用PHP5.3和名称空间、闭包等Php 如何在框架中扩展核心类,php,design-patterns,frameworks,php-5.3,Php,Design Patterns,Frameworks,Php 5.3,我一直在使用我自己的makePHP5.3Web应用程序框架,我必须说,使用它是一件非常愉快的事情。实际上,我在想,用它来开放源代码,让其他人感受到与我一样的快乐;) 这是我的问题。所有核心类都必须是可扩展的,这有多重要?实现这一点的好方法是什么?Codeigniter在任何地方都使用单例模式,这是不可能的。Kohanas文件系统很好,但根据我的口味,它包含了许多文件(空类)的方式 我从未使用过Symfony,但听说它利用了依赖注入?我不是这方面的大师,但我有一些知识。这是路吗?有“更聪明”的方法
/Tobias(开发中的瑞典人)我非常喜欢Zend框架的工作方式:主要有一个抽象类(用于扩展)和一个具体类(用于具体用例),例如Db Mapper: 您可以扩展Zend_Db_Table_抽象类:
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
因此,您必须为解决方案中的每种类型创建两个类:抽象类和具体类
更多信息:
我想看看,而且,我认为它们在设计方面是最好的。我建议不要使用单例,而是使用依赖注入
所有核心类都必须是可扩展的,这有多重要?实现这一点的好方法是什么
这真的取决于班级的职责。您可能不希望MVC堆栈中的一些核心组件(假设是MVC)被扩展,您可以将它们声明为final,或者将某些方法声明为final,并通过插件和助手强制扩展。其他类可能被设计为扩展类,在这种情况下,它们应该被声明为抽象类
在我看来,您应该主要使用受保护的属性并提供访问器方法。但不要只在你所有的财产上使用受保护的可见性,有些财产是公共的和私人的也没关系,这一切都归结于责任
考虑到一个类有多大的责任,如果它服务于多个角色/目的,那么是时候重构该类并将其拆分为太多或更多的类了。别忘了使用接口
实际上,我在想,用它来开放源代码,让其他人感受到与我一样的快乐;)
在您发布代码之前,请考虑以下内容:
- 我所有的代码都经过单元测试了吗
- 我是否使用版本控制
- 我有完整的API文档吗
…我只是想避免你在你的项目中投入额外的、不必要的精力供公众使用,而你无论如何也得不到任何支持。我明白你的意思,但读起来很令人沮丧。希望我们还有一些“改革者”留下来,这样新的开源项目就出现了:/我看了Symfony2,Li3,相信依赖注入是一条路要走。我已经开始集成它,它看起来相当不错。:)谢谢你的回答Tobias别担心,大多数开发人员都会不断地经历这个阶段,我也曾经经历过,而且可能在某个阶段还会经历。这很令人沮丧,但这是事实。正如我所说的,如果你想要操作系统,你的项目只需要开始使用GitHub,但不要为你的框架建立专门的网站。Fabien Povertier做了一个很好的DI容器:你应该检查一下。