在基于PHP的面向对象的项目中,如何组织和管理助手对象,如数据库引擎,用户通知,错误处理等?
假设我有一个大型PHP CMS。CMS分为各种类别。一些例子:
等等
我正在处理一个永恒的问题,即如何最好地使这些对象可以被需要它的系统的每个部分访问。
多年前,我的第一个方法是创建一个$ application全局变量,其中包含这些类的初始化实例。
global $application;
$application->messageHandler->addMessage("Item successfully inserted");
$mh =&factory("messageHandler");
$mh->addMessage("Item successfully inserted");
但我也不满意。单元测试和封装对我来说变得越来越重要,而据我所知,全局/单子背后的逻辑破坏了OOP的基本思想。
然后当然可以给每个对象一些指向它所需的辅助对象的指针,这可能是最干净,节省资源和易于测试的方式,但是从长远来看,我对此表示怀疑。
我研究过的大多数PHP框架都使用单例模式或访问初始化对象的函数。两种方法都很好,但是正如我所说,我都不满意。
我想扩大一下这里存在哪些常见模式的视野。我正在寻找可以从 长期 , 真实世界的 角度讨论此问题的示例,其他想法和指向资源的指针。
另外,我很想听听有关此问题的专业,利基或 简单怪异的 方法。
我相信您应该问构造函数中该对象需要什么:new YourObject($dependencyA, $dependencyB);
您可以 手动 ($application = new Application(new MessageHandler()
)提供所需的对象(依赖项)。但是您也可以使用 DI框架 (维基百科页面提供了指向PHP DI框架的链接。
重要的是,您仅传递您实际使用的内容(调用操作),而不传递您仅传递给其他对象的内容,因为它们需要它们。
关于Flavius解决方案的更多想法。我不希望这个帖子成为反帖子,但我认为重要的是要弄清为什么依赖注入至少在我看来比全局变量更好。
即使这不是“真正的” Singleton实现,我仍然认为Flavius弄错了。全球状况不好。请注意,此类解决方案还使用难以测试的静态方法。
我知道很多人会这样做,批准并使用它。但是阅读Misko
Heverys的博客文章(一位Google可测试性专家),重新阅读它并慢慢地消化他所说的内容确实改变了我对设计的看法。
如果您希望能够测试您的应用程序,则需要采用其他方法来设计应用程序。当您进行测试优先编程时,您将遇到如下困难:’接下来,我想在这段代码中实现日志记录;让我们先编写一个记录基本消息的测试”,然后提出一个强制您编写和使用不可替代的全局记录器的测试。
我仍然在努力地从博客中获取所有信息,并且实施起来并不总是那么容易,而且我有很多问题。但是,在我掌握了Misko
Hevery所说的话之后,我无法回到以前做过的事情(是的,全局状态和Singletons(大S)):-)
物理存储器在80386系统下被组织成一个8位的字节序列。每个字节含有一个唯一的地址,从0到最大值2**32 -1(4G)。 然而,80386的程序与物理地址空间是相互独立的。这意味着写程序时可以不用关心有多少物理存储器,指令和数据在物理存储器中是如何存放的。 对应用程序可见的存储器组织模型是由系统软件设计者来决定的。80386的体系结构给予了设计者为每个任务选择一种模式的自由。存储器组织模型可以是
我试图列出我存储项目中的所有(甚至一些)桶。如果我知道一个水桶的名字,“水桶”功能就会得到这个水桶。但是我不能用"桶"来列出项目中的桶: 我的服务帐户具有“存储管理员”角色。我很困惑。注意:我使用的是PHP5.6,以防万一。Composer在安装GCS库时没有遇到问题,所以我认为这没问题。 好吧,我一定是错过了什么。使用我得到一个桶的测试用例,我使用了$one_桶- 进一步信息:当点击迭代器(fo
如果是,是否有任何首选的存储方式?
本文向大家介绍对象,方法和变量在Java的内存中存储在哪里?,包括了对象,方法和变量在Java的内存中存储在哪里?的使用技巧和注意事项,需要的朋友参考一下 有五个主要内存区域,用于各种Java元素。以下是相同的列表。 类区域-该区域包含类的静态成员。 方法区域-此区域包含方法定义和可执行代码。 堆区域-该区域包含动态分配/取消分配的对象。如果某个对象不再被任何实时引用引用,则将其释放。 堆栈区域-
本文向大家介绍同时和分层访问存储组织之间的区别,包括了同时和分层访问存储组织之间的区别的使用技巧和注意事项,需要的朋友参考一下 众所周知,在计算机/系统的上下文中,整个性能所依赖的主要关键功能是内存。正是内存及其分配使系统能够快速高效地执行。现在,基于系统中此内存的组织,我们可以区分同时访问和分层访问内存组织。 以下是同时访问存储组织和分层访问存储组织之间的重要区别。 序号 键 同时访问存储组织
问题内容: 我最近开始学习Python,并且有2个与模块有关的问题。 有没有办法获取机器上可用(即已安装)的Python模块列表? 我正在使用Ubuntu Karmic和Synaptic进行软件包管理。我刚刚安装了一个python模块,模块代码实际存储在我的机器上哪里?(是否存在存储模块的默认[推荐]位置)? 问题答案: 1)有没有办法获取机器上可用(即已安装)的Python模块列表? 这对我有用