PHP 中的准备语句和 class 继承
Prepared statements and class inheritance in PHP
我在 PHP 中执行准备语句时遇到问题。我的主要目标是创建两个 classes,第一个用于连接 (Conexion) 到服务器和数据库,第二个用于执行准备好的语句 (RealizarConsultas)。
我决定用来做语句的class应该继承自"Conexion"。通过这样做,我每次使用函数 "RealizarConsultas::MostrarConsulta()" 时都假装连接到数据库。这个函数应该与数据库连接,然后它应该执行准备好的语句,最后它应该关闭连接。
Class 用于连接。
<?php
class Conexion extends PDO{
protected $conexionDb;
public function Conexion(){
try{
$conexionDb=new PDO ('mysql:host=localhost;dbname=euroburo','root','');
$conexionDb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conexionDb->exec("SET CHARACTER SET utf8");
}catch(Exception $e){
echo "Error: ".$e->getLine();
}
}
public function stopConexion(){
$conexionDb->close();
}
}
?>
Class 用于准备语句。
<?php
require("conexion.php");
class RealizarConsulta extends Conexion{
public function RealizarConsulta(){
parent::__construct();
}
public function MostrarConsulta($consulta){
$resultado=$this->conexionDb->prepare($consulta);
$resultado->execute();
$final = $resultado->fetch(PDO::FETCH_ASSOC);
print_r($final);
$this->stopConexion();
}
}
?>
我的主要问题出在这一行,位于 "RealizarConsulta::MostrarConsulta()" 内。
$resultado=$this->conexionDb->prepare($consulta);
每次调用函数 (RealizarConsulta::MostrarConsulta());
出现此错误:在非对象上调用成员函数 prepare()。
我知道这个错误告诉我 $this->conexionDb 不是一个对象,但我不太明白为什么。我不明白该错误的原因是因为 $conexionDb 是在父 class 中创建的受保护变量,作为受保护变量 "RealizarConsulta" class 应该继承它而无需任何问题,我应该可以访问它。如您所见,$conexionDb 在构造函数被调用时被初始化,它应该保存与连接相关的信息。
正如您通过我的推理看到的那样,$conexionDb 应该是对属于 "Conexion" class 的对象的引用,我应该可以在 "RealizarConsulta" class。
我想知道我失败的地方以及如何解决错误。谢谢
您正在声明 class 级别变量,但除非您遗漏了一些代码,否则您不会将局部变量分配给 class 级别。在 PHP 中,您确实必须这样做。例如
class A {
protected $a;
public function __construct() {
$this->a = 'Hello';
}
public function echo() {
$a = 'World';
echo $this->a . ' ' . $a;
}
}
$a = new A();
$a->echo()
会回显 Hello World
。这是因为在echo()
中,$a
是局部变量,而$this->a
是作用域为class的变量。它们是两个不同的变量,拥有两个不同的值。
所以你的构造函数应该是这样的
public function __construct() {
try {
$conexionDb= new PDO('mysql:host=localhost;dbname=euroburo', 'root', '');
$conexionDb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conexionDb->exec("SET CHARACTER SET utf8");
$this->conexionDb = $conexionDb;
} catch(Exception $e) {
echo "Error: ".$e->getLine();
}
}
此外,作为旁注,强烈建议使用 public function __construct()
作为 PHP 中的构造函数,而不是与 class[=17= 同名的函数]
我在 PHP 中执行准备语句时遇到问题。我的主要目标是创建两个 classes,第一个用于连接 (Conexion) 到服务器和数据库,第二个用于执行准备好的语句 (RealizarConsultas)。
我决定用来做语句的class应该继承自"Conexion"。通过这样做,我每次使用函数 "RealizarConsultas::MostrarConsulta()" 时都假装连接到数据库。这个函数应该与数据库连接,然后它应该执行准备好的语句,最后它应该关闭连接。
Class 用于连接。
<?php
class Conexion extends PDO{
protected $conexionDb;
public function Conexion(){
try{
$conexionDb=new PDO ('mysql:host=localhost;dbname=euroburo','root','');
$conexionDb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conexionDb->exec("SET CHARACTER SET utf8");
}catch(Exception $e){
echo "Error: ".$e->getLine();
}
}
public function stopConexion(){
$conexionDb->close();
}
}
?>
Class 用于准备语句。
<?php
require("conexion.php");
class RealizarConsulta extends Conexion{
public function RealizarConsulta(){
parent::__construct();
}
public function MostrarConsulta($consulta){
$resultado=$this->conexionDb->prepare($consulta);
$resultado->execute();
$final = $resultado->fetch(PDO::FETCH_ASSOC);
print_r($final);
$this->stopConexion();
}
}
?>
我的主要问题出在这一行,位于 "RealizarConsulta::MostrarConsulta()" 内。
$resultado=$this->conexionDb->prepare($consulta);
每次调用函数 (RealizarConsulta::MostrarConsulta());
出现此错误:在非对象上调用成员函数 prepare()。
我知道这个错误告诉我 $this->conexionDb 不是一个对象,但我不太明白为什么。我不明白该错误的原因是因为 $conexionDb 是在父 class 中创建的受保护变量,作为受保护变量 "RealizarConsulta" class 应该继承它而无需任何问题,我应该可以访问它。如您所见,$conexionDb 在构造函数被调用时被初始化,它应该保存与连接相关的信息。
正如您通过我的推理看到的那样,$conexionDb 应该是对属于 "Conexion" class 的对象的引用,我应该可以在 "RealizarConsulta" class。
我想知道我失败的地方以及如何解决错误。谢谢
您正在声明 class 级别变量,但除非您遗漏了一些代码,否则您不会将局部变量分配给 class 级别。在 PHP 中,您确实必须这样做。例如
class A {
protected $a;
public function __construct() {
$this->a = 'Hello';
}
public function echo() {
$a = 'World';
echo $this->a . ' ' . $a;
}
}
$a = new A();
$a->echo()
会回显 Hello World
。这是因为在echo()
中,$a
是局部变量,而$this->a
是作用域为class的变量。它们是两个不同的变量,拥有两个不同的值。
所以你的构造函数应该是这样的
public function __construct() {
try {
$conexionDb= new PDO('mysql:host=localhost;dbname=euroburo', 'root', '');
$conexionDb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conexionDb->exec("SET CHARACTER SET utf8");
$this->conexionDb = $conexionDb;
} catch(Exception $e) {
echo "Error: ".$e->getLine();
}
}
此外,作为旁注,强烈建议使用 public function __construct()
作为 PHP 中的构造函数,而不是与 class[=17= 同名的函数]