我目前正在开发oophp应用程序。我有一个网站类,其中包含应用程序的所有配置设置。最初,我打算使用单例模式允许每个对象引用站点对象的单个实例,但主要是由于此模式中涉及的测试问题,我决定尝试不同的方法。
我想使网站类成为我的应用程序中的主要父类,并从子类的构造函数中调用它的构造函数,以便在需要时使所有属性可用。
第一次运行时,该类将仅包含应用程序的数据库详细信息。要获取剩余值,必须使用db详细信息执行查询。但是,任何后续实例都将是原始克隆(包含所有值)。我也可以设置一个布尔标志来再次执行查询,需要一个全新的实例。
这会成为单身人士的可行替代方案吗?它会解决它导致的测试问题吗?这是理论上的全部,我还没有开始编码,
任何想法或建议都非常感谢。 感谢。
答案 0 :(得分:3)
我认为更好的方法是让一个'配置'对象传递给所有其他类的构造函数。所以,几乎像单身一样,除了它是明确创建并只传递给需要它的类。这种方法通常称为dependency injection。
答案 1 :(得分:2)
在尝试了许多不同的技术之后,我发现这种方法的功能性和可靠性是:
使用引导程序或初始化文件。它位于站点的ROOT,具有适当的许可和防止直接访问的安全措施。
网站中的所有网页都首先包含此文件。在其中,我创建了所有的全局对象(设置,用户),并从那里引用它们。
例如:
// OBJECT CREATION
$Config = new Configuration();
$User = new User();
然后在需要这些对象的类中:
public function __construct($id = NULL) {
global $Config; // DEPENDENCY INJECTION SOUNDS LIKE AN ADDICTION!
if($Config->allow_something) {
$this->can_do_something = true;
}
if(NULL !== $id) {
$this->load_record($id);
}
}
请注意,我只是从类中访问这些全局对象,以及我不必每次都将对象变量包含为第一个构造函数参数。那变老了。
此外,拥有静态数据库类非常有帮助。没有对象我不得不担心传球,我可以打电话给$row = DB::select_row($sql_statement);
;看看PhpConsole课程。
UPDATE 感谢upvote,无论谁做到了。它引起了人们的注意,我的答案不是我引以为豪的事实。虽然它可能有助于OP完成他们想要的东西,但这不是一个好习惯。
将对象传递给新的对象构造函数是一种很好的做法(依赖注入),虽然“不方便”,但与生活中的其他事情一样,额外的努力是值得的。
我的答案中唯一的救赎部分是使用外观模式(例如DB :: select_row())。这不一定是单身(OP想要避免的东西),并且让您有机会展示精简的界面。
Laravel是一个现代的PHP框架,它使用依赖注入和外观,以及其他经过验证的设计模式。我建议任何新手开发人员都要彻底审查这些和其他此类设计实践。