PHP mysqli连接类 - 无法在外部访问连接变量。范围问题
PHP mysqli连接类 - 无法在外部访问连接变量。范围问题
我刚开始使用面向对象编程的PHP,但在我的数据库连接类中遇到了问题。\n我有一个文件,其中包含这个mysqli连接类:\n
$db_name = '数据库名'; $db_user = '数据库用户'; $db_password = '数据库密码'; $db_host = 'localhost'; class database { public $mysqli; public function connect($db_host, $db_user, $db_password, $db_name){ $this->mysqli = new mysqli($db_host, $db_user, $db_password, $db_name); if ($mysqli->connect_errno) { return "对不起,Andre,但是你似乎弄乱了数据库连接 :("; } } } $newConnection = new database; $newConnection->connect($db_host, $db_user, $db_password, $db_name);
\n然后,我想在另一个文件中使用变量$mysqli进行数据库连接 - 这是一个简单的使用$mysqli变量进行数据库插入。我在连接文件中包含了上述内容,但似乎在调用数据库类中的方法时,$mysqli变量没有被返回。我收到了PHP错误信息...\n
Fatal error: Call to a member function prepare() on a non-object in...
\n我看到使用\n
global $mysqli;
\n可以解决,但我想按照正确的方式来做,因为我听说这不是一个好的做法。\n我知道我在这里可能做错了一些事情,因为我刚开始使用面向对象编程,但我认为通过在连接函数中返回该变量,我可以从外部创建类时访问它。\n感谢您的帮助。
问题的原因是mysqli连接没有被初始化。解决方法是将连接放在构造函数中,这样在实例化类时会自动初始化连接。这样做还可以节省每次初始化连接时的一行代码。
构造函数的作用是在实例化类时自动执行一些初始化操作,所以将连接的初始化放在构造函数中是比较合适的做法。
下面是一个示例代码:
class Database { public function __construct($db_host, $db_user, $db_password, $db_name){ $this->mysqli = new mysqli($db_host, $db_user, $db_password, $db_name); if ($this->mysqli->connect_errno) { return "Sorry, but there was an error connecting to the database :("; } } public $mysqli; } $foo = new Database('host', 'user', 'pass', 'dbname'); $foo->mysqli->prepare("something");
通过上述代码,当实例化Database类时,连接会自动初始化。这样就不需要每次使用连接时都手动初始化了。
希望这个解决方法对你有帮助。如果还有其他问题,请随时提问。
问题出现的原因是在访问连接变量时,没有使用正确的作用域。解决方法是将代码中的$mysqli->connect_errno
改为$this->mysqli->connect_errno
。
在PHP中,类的成员变量需要使用$this
关键字来访问。在给定的代码中,$mysqli
是一个类的成员变量,因此应该使用$this->mysqli
来访问。
通过使用$this->mysqli->connect_errno
,我们可以确保在类的任何方法中都可以正确访问连接变量。这样,无论在哪个方法中,我们都可以通过$this->mysqli->connect_errno
来获取连接错误的编号。这个修正能够解决原问题中无法在类的外部访问连接变量的问题。
PHP mysqli连接类 - 无法在外部访问连接变量。作用域问题
在使用类的实例化对象来访问类变量时,你可以从外部访问。例如:
$newConnection = new database; $newConnection->connect($db_host, $db_user, $db_password, $db_name); $newConnection->mysqli /* 这里你可以从外部访问 */
而在类的内部,你可以使用关键字$this来访问类变量。例如:
// 在类内部可以这样使用 if ($this->mysqli->connect_errno) { return "Sorry Andre, but you seem to have messed up the DB connection :("; }
如果你想保护变量不被外部访问,可以使用private关键字声明变量,而不是public。例如:
private $mysqli; // 替代 public $mysqli;
另外,你可以直接使用`$newConnection->mysqli`,而不是将其值转移到另一个名为$mysqli的变量中。例如:
$mysqli = $newConnection->mysqli;
以上是关于PHP mysqli连接类中无法在外部访问连接变量的原因以及解决方法的总结。