PHP - 类构造中的Require_once
Posted
技术标签:
【中文标题】PHP - 类构造中的Require_once【英文标题】:PHP - Require_once inside a class construct 【发布时间】:2012-02-25 03:03:14 【问题描述】:当我使用 require_once
并尝试访问所需文件中的变量时,我收到一个错误,即变量 ($db
) 未定义。
我试图将require_once
语句放在几个不同的地方,因为我认为这可能是变量范围的问题,但此时我尝试在构造函数中调用它并将值分配给类变量。
我的配置类:
class Config
public $db;
public function __construct()
require_once (BASE_DIR."config/DBConfig.php");
$this->db = $db;
DBConfig 文件如下所示:
$db['default']['hostname'] = 'localhost'
【问题讨论】:
您的 DBConfig 文件就是这样吗?没有<?php
?
看1:***.com/questions/9002188/…,2:***.com/questions/2679602/…
我实际上是通过制作 Config 类单例来解决它。似乎由于 Require_once 仅在第一次创建类时获取文件,因此该变量仅在我创建的第一个对象中可用。
@LasseVabeRolstad:这是require_once
的正常行为。它只需要一次。由此得名。另请参阅require
并请在下面添加您的“解决方案”作为答案并接受它(实际上我会说 Luc Franken 有答案)。只需在使用之前预先设置您需要的东西,然后您就不会遇到这些问题。是的,Singleton 是您的问题的一部分,而不是解决方案。
【参考方案1】:
我会做不同的事情并为此使用依赖注入,给你:
public function __construct((IDb)$Db)
$this->db=$Db;
这样以后测试你的软件更容易,很明显这个类需要一些数据库对象。这使您的代码也减少了耦合,这似乎是一个很好的架构决策。
此外,它还可以让开始使用不同的数据库类变得更加容易,从而节省您以后的时间和精力。
【讨论】:
【参考方案2】:似乎由于 Require_once 仅在第一次创建类时获取文件,因此该变量仅在我创建的第一个对象中可用。
那么,将require_once
更改为require
。 require_once
用于包含定义类和函数的文件,a) 不需要包含多次,b) 如果包含多次,则会导致错误。如果您总是想包含该文件,请跳过_once
。
话虽如此,多次包含数据库配置是糟糕设计的标志。
【讨论】:
嗯,这样就可以解决问题了。但是,似乎 OP 正在使用require_once
来避免糟糕的架构问题,这不是该方法应该使用的方式。以上是关于PHP - 类构造中的Require_once的主要内容,如果未能解决你的问题,请参考以下文章