我遇到了这个错误:
Notice: Undefined variable: mysqli in /path/to/component.php on line 24
这是在这段代码中:
class Component {
public function foo() {
// something using $mysqli;
}
}
要解决此问题,我必须将global $mysqli
添加到我的foo
方法中 - 我理解这一点,但这对我来说并不实用,因为我更喜欢简单默认情况下,可以在所有类中访问$mysqli
。
这可能吗?
答案 0 :(得分:1)
简短的回答是:不。没有办法改变PHP中范围的处理方式。
由于这可能对你没什么帮助,我会尝试解释一个更好的方法。
function add(x,y)
return {x,x/2.0,y,y*y,x*y,x+y}
end
关键字是PHP的特性之一。有些人认为这是愚蠢的,但它有一定的逻辑。编程中的许多模式都是关于保持依赖关系的显式。你班上发生的东西不应该取决于外面的世界状况。在您的情况下(或者使用global
导入全局变量时,您将您的类与其所处的环境耦合。由于各种原因,这很糟糕。
如果您的类需要数据库连接,则应明确injecting依赖关系,而不是从全局范围隐式提取它。
如果类需要依赖项才能运行,那么注入它的明显位置是在构造函数中。
例如:
global
答案 1 :(得分:1)
对于某些项目,拥有一个数据库并与之建立连接是完全可以接受的。愿意从任何地方访问它而不使用令人讨厌的global
或将其全部注入整个地方是完全合理的。
我做的一种方法就是在静态对象中建立连接,可以从项目的任何位置访问。我是如何工作的:
class Database { public static $connection; public static function connect($host, $user, $password, $database) { self:$connection = mysqli_connect($host, $user, $password, $database); } }
Database::$connection
课程,您现在就可以从任何地方访问Database
。不需要全局... 静态类对于这些类型的用法非常有用。但是有些人不喜欢他们,因为他们更难以在some cases中进行测试。没有完美的解决方案,但在不惜一切代价避免不良模式的同时做有意义的事情。
答案 2 :(得分:0)
您可以将其发送到构造函数:
class Component { protected $mysqli; public function Component($mysqli = null) { $this->mysqli = $mysqli; } public function foo() { // something using $mysqli; } }
或在创建后通过其他类别设置它来设置:
class Component { protected $mysqli; public function SetDBClass($mysqli) { $this->mysqli = $mysqli; } public function foo() { // something using $mysqli; } }
答案 3 :(得分:0)