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= 同名的函数]