用PHP实现OOP。有些困惑
我在本文中遵循了OOP 在我开始为对象使用占位符变量之前,似乎还可以:用PHP实现OOP。有些困惑,php,oop,Php,Oop,我在本文中遵循了OOP 在我开始为对象使用占位符变量之前,似乎还可以: php > require('class_lib.php'); php > $test = new Db(); 我使用交互式PHP,因为逐行测试代码似乎更容易。 这一行似乎是问题所在: php > $result = $test->query("SELECT * FROM test"); PHP Fatal error: Call to a member function query() on a
php > require('class_lib.php');
php > $test = new Db();
我使用交互式PHP,因为逐行测试代码似乎更容易。
这一行似乎是问题所在:
php > $result = $test->query("SELECT * FROM test");
PHP Fatal error: Call to a member function query() on a non-object in class_lib.php on line 23
这是OOP代码:
<?php
class Db {
protected static $connection;
public function connect(){
if (!isset(self::$connection)){
$configfile = realpath("database.ini");
echo $configfile . PHP_EOL;
$config = parse_ini_file($configfile);
$connection = mysqli_connect($config['host'],$config['user'],$config['password'],$config['dbname'],$config['port']);
}
if (self::$connection === false){
die ("Database connection failed.");
return mysql_errno(self::$connection);
}
return self::$connection;
}
public function query($query){
$connection = $this->connect();
$result = $connection->query($query);
return $result;
}
public function select_rows($query){
$rows = array();
$result = $this->query($query);
if ($result === false){
return false;
}
while ($result = $result->fetch_assoc()){
$rows[] = $row;
}
return $rows;
}
public function error(){
$connection = $this->connect();
return $connection->error;
}
public function quote($value){
$connection = $this->connect();
return "'" . $connection->real_escape_string($value) . "'";
}
}
非对象不是指$test
。它指的是DB->query()
方法中使用的$connection
。该方法调用$this->connect()
,但尽管connect方法返回self::$connection
,但它实际上从未将其设置为任何值,因此它为null
我想这条线是应该设置的
$connection = mysqli_connect($config['host'],$config['user'],$config['password'],$config['dbname'],$config['port']);
但是,$connection
只是函数范围中的一个局部变量。它不引用self::$connection
它应该与self::$connection=mysqli\u connect一起工作(…
相反。该代码似乎是复制和粘贴尝试的失败结果。有两个你的类库文件中有一个额外的开始标记。你应该得到一个语法错误。我建议你打开错误报告。啊。谢谢。显然我错过了。剪切和粘贴错误在这里,而不是在我系统的代码中。因此作者的code是错误的。我需要一段时间才能完全理解PHP的OOP实现的特性。是的。老实说,我会寻找一个不同的教程。一个使用准备好的语句的教程。字符串转义不足以阻止SQL注入。好的。你的最后一行完成了这个想法。对教程有什么建议吗?我已经在阅读关于准备语句的教程。不太关心将所有内容放在一个地方。是的。在函数范围内,引用类变量的唯一方法是$this->variable
,或者self::$variable
用于静态变量。只需使用$variable
就可以创建一个新变量,限制在该变量的范围内行动。