PHP中的预处理语句和类继承

时间:2016-07-28 09:48:14

标签: php inheritance pdo statements

在PHP中执行预准备语句时遇到问题。我的主要目标是创建两个类,第一个用于连接(Conexion)到服务器和数据库,第二个用于做准备语句(RealizarConsultas)。

我已经决定用于执行语句的类应该继承自" Conexion"。通过这样做,我每次使用函数" RealizarConsultas :: MostrarConsulta()"时都假装连接数据库。这个函数应该与数据库连接,然后它应该执行准备好的语句,最后它应该关闭连接。

用于连接的类。

<?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();
        }

    }
?>

用于准备语句的类。

<?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();
        }
    }

?>

我的主要问题在于这一行,位于&#34; RealizarConsulta :: MostrarConsulta()&#34;。

$resultado=$this->conexionDb->prepare($consulta);

每次我调用函数(RealizarConsulta :: MostrarConsulta());

出现此错误:在非对象上调用成员函数prepare()。

我知道这个错误告诉我$ this-&gt; conexionDb不是一个对象,但我不明白为什么。我不理解错误的原因是$ conexionDb是在父类中创建的受保护变量,作为受保护变量&#34; RealizarConsulta&#34; class应该没有任何问题地继承它,我应该可以访问它。您可以看到$ conexionDb在调用constuctor时初始化,它应该保存与连接相关的信息。

正如您可以通过我的推理看到的那样,$ conexionDb应该是对属于&#34; Conexion&#34;的对象的引用。我和我应该可以在&#34; RealizarConsulta&#34;类。

我想知道我失败了什么,如何解决错误。感谢

1 个答案:

答案 0 :(得分:0)

您正在声明您的类级别变量,但除非您省略某些代码,否则您不会将本地变量分配给类级别。在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是一个作用于该类的变量。它们是两个不同的变量,包含两个不同的值。

所以你的构造函数看起来应该是这样的

    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();
        }
    }

另外,作为旁注,强烈建议在PHP中使用public function __construct()作为构造函数,而不是与类同名的函数