努力在OOP PHP中掌握不同级别的变量。我想有一个连接文件,可以通过我的项目从所有类和函数访问。我包括' config.php'但无法找到$ mysql变量。任何帮助都非常感谢;
我有一个文件
的config.php
public $mysqli = new mysqli('localhost', 'usernameEG', 'passwordEG', 'databaseEG');
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
和一些类文件
class.User.php
<?php
class User {
private $mysqli = null;
function __construct(){
//=========
//include config.php here?
}
function myProfile($Id){
$stmt = $this->mysqli->prepare("SELECT First_Name, Last_Name, Email, DateJoined FROM members WHERE Id = ? ");
$stmt->bind_param('i',$Id);
$stmt->execute();
$stmt->bind_result($fname,$lname,$email,$date);
$stmt->store_result();
$stmt->fetch();
echo "<p>User#: ".$Id."</p>";
echo "<p>First Name: ".$fname."</p>";
echo "<p>Last Name: ".$lname."</p>";
echo "<p>Email: ".$email."</p>";
echo "<p>Date Joined: ".$date."</p>";
$stmt->close();
}
function example(){
EXAMPLE CODE HERE WILL ALSO NEED TO BE ABLE TO USE SAME CONNECTION
}
}
答案 0 :(得分:3)
因此,而不是在另一个答案中暗示的单身方法。让我为您提供依赖注入方法。对于许多有经验的开发人员来说,依赖注入是一种首选方法,因为它允许接收依赖项的类与依赖项具有更松散的耦合(例如,您甚至不需要知道类的名称以进行实例化像你使用单例方法那样依赖)。您只需要知道传递的依赖项满足某些接口要求(即它实现了某个接口或是某种类型的类)。
所以看起来更像是这样:
class User {
protected $mysqli = null;
// other properties
public function __construct(mysqli $mysqli) {
$this->mysqli = $mysqli;
// other constructor operations
}
// other methods
}
那么这里发生了什么?在这里,您强制要求在实例化此类时传递类型为mysqli
的对象。这可能是一个mysqli
对象,甚至可能是您自己的自定义类,它扩展mysqli
,User
类并不关心,只要所有mysqli
类方法都可以实施
用法可能就像
require('/path/to/db_config.php'); // an include which creates a mysqli object or provides a factory for one, or whatever
$user = new User($mysqli);
$user->foo(); // do something
有趣的是,您有时可能会看到使用singelton模式以及依赖注入。所以说你有一个具有单例功能的mysqli_singleton_factory
类来为你提供单个实例化的mysqli
对象。用法可能如下所示:
require('/path/to/db_config.php'); // an include which provides a singleton
$user = new User(mysqli_singleton_factory::get_instance());
$user->foo(); // do something
$other_class = new other_class_requiring_mysqli(mysqli_singleton_factory::get_instance());
$other_class->bar(); // do something
在这里,您可以确保在脚本执行期间只有一个实例化的mysqli
对象,并且您已将User
类与对象本身的任何实例化分离。
作为参考,单例模式可能如下所示:
class mysqli_singleton_factory {
protected static $mysqli = null;
protected function __construct() {
// assume DB connection setting have been pre-defined as constants somewhere
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
// make sure connection worked
if($mysqli->connect_error) {
throw new Exception(__METHOD__ . ' at line ' . __LINE__ . ' failed with: ' . $mysqli->connect_error);
}
self::mysqli = $mysqli;
}
public static function get_instance() {
if (false === self::mysqli instanceof mysqli) {
self::__construct();
}
return self::mysqli;
}
}
答案 1 :(得分:2)
我之前已经多次这样做了,我发现很容易实现“类单独”类作为数据库连接器,然后可以被应用程序中的任何对象引用。
<强>的config.php 强>
Config.php是设置凭据的位置,实际构建了数据库类。
$dbHost = 'localhost';
$dbUser = 'someUser';
$dbPass = 'somePass';
$dbSchema = 'someSchema';
Database::$db = new MySQLi($dbHost, $dbUser, $dbPass, $dbSchema);
<强> classes.php 强>
classes.php是定义我的类的地方,它与其余代码分开。
class Database {
public static $db;
}
class User {
...
function example()
{
$stmt = Database::$db->prepare('SELECT TRUE');
...
}
}
<强>的index.php 强>
index.php是应用程序的入口点,用于处理请求并使用提供的类显示所需的行为。
require_once('classes.php');
require_once('config.php');
/* Application Goes Here */
这可以确保我项目中的所有对象都使用相同的连接,我只需要调用一次,而且我不必过多地讨论范围。