相关疑难解决方法(0)

在PHP项目中,存在哪些模式来存储,访问和组织帮助程序对象?

在基于PHP的面向对象项目中,如何组织和管理辅助对象,如数据库引擎,用户通知,错误处理等?

假设我有一个大的PHP CMS.CMS由各种类别组织.几个例子:

  • 数据库对象
  • 用户管理
  • 用于创建/修改/删除项目的API
  • 消息传递对象,用于向最终用户显示消息
  • 一个上下文处理程序,可以将您带到正确的页面
  • 显示按钮的导航栏类
  • 记录对象
  • 可能,自定义错误处理

等等

我正在处理永恒的问题,如何最好地使这些对象可以访问需要它的系统的每个部分.

很多年前,我的第一个应用程序是拥有一个包含这些类的初始化实例的$ application全局.

global $application;
$application->messageHandler->addMessage("Item successfully inserted");
Run Code Online (Sandbox Code Playgroud)

然后我切换到Singleton模式和工厂函数:

$mh =&factory("messageHandler");
$mh->addMessage("Item successfully inserted");
Run Code Online (Sandbox Code Playgroud)

但我对此也不满意.单元测试和封装对我来说变得越来越重要,在我的理解中,全局/单例背后的逻辑破坏了OOP的基本思想.

那么当然有可能给每个对象提供它需要的辅助对象的许多指针,可能是最干净,资源节省和测试友好的方式,但我对这长期可维护性有疑问.

我研究过的大多数PHP框架都使用单例模式或访问初始化对象的函数.这两种方法都不错,但正如我所说的那样,我对它们都不满意.

我想扩大我对这里存在的常见模式的看法.我找实例,更多的想法和指针向资源从讨论这个长期的,真实世界的视角.

另外,我很想知道这个问题的专门,利基或简单的奇怪方法.

php oop design-patterns

114
推荐指数
5
解决办法
1万
查看次数

PHP全局函数

global关键字的效用是什么?

是否有任何理由更喜欢一种方法?

  • 安全?
  • 性能?
  • 还要别的吗?

方法1:

function exempleConcat($str1, $str2)
{
  return $str1.$str2;
}
Run Code Online (Sandbox Code Playgroud)

方法2:

function exempleConcat()
{
  global $str1, $str2;
  return $str1.$str2;
}
Run Code Online (Sandbox Code Playgroud)

什么时候使用有意义global

对我来说,它似乎很危险 ......但它可能只是缺乏知识.我感兴趣的是记录(例如代码示例,文档链接......)技术原因.

提前致谢!


赏金

这是关于这个主题的一个很好的一般性问题,我(@Gordon)正在提供奖励以获得更多答案.无论您的答案是否与我的答案一致或给出不同的观点都无关紧要.由于该global主题时不时出现,我们可以使用一个很好的"规范"答案来链接.

php language-design

98
推荐指数
7
解决办法
2万
查看次数

标签 统计

php ×2

design-patterns ×1

language-design ×1

oop ×1