【问题标题】:Abstract PDO Repository File error抽象 PDO 存储库文件错误
【发布时间】:2017-03-02 20:03:40
【问题描述】:

我是 php 新手,最近遇到了一些错误。请在下面查看我的代码。

我收到一些错误提示 在对象上下文之外使用 $this。

这是 index.php

 <?php
        require_once ('setting.php');


        try{

            $sql = "CREATE TABLE users (
                user_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
                account VARCHAR(30) NOT NULL,
                password VARCHAR(30) NOT NULL,
                )";

            $result = $this->db->getConnection()->execute($sql);

        }catch(Exception $e){
            echo " " . $e->message();
        }

    ?> 

我将这个设置命名为.php

<?php
    abstract class PDORepository{
        const USERNAME="xxxx";
        const PASSWORD="";
        const HOST="xxxxxx";
        const DB="xxxxx";

        private function getConnection(){
            $username = self::USERNAME;
            $password = self::PASSWORD;
            $host = self::HOST;
            $db = self::DB;
            $connection = new PDO("mysql:dbname=$db;host=$host", $username, $password);
            return $connection;
        }

        protected function queryList($sql, $args){
            $connection = $this->getConnection();
            $stmt = $connection->prepare($sql);
            $stmt->execute($args);
            return $stmt;
        }

    }

?>

我应该怎么做才能访问该类 PDORepository。我在这里找到了一些关于使用抽象类的讨论。但它与此不相似。谢谢您的帮助!新手来了!

【问题讨论】:

  • 我真的不明白为什么这个类是抽象的。此外,Your first database wrapper's childhood diseases
  • ^.其他 notes$this 指的是您当前所在的对象。在 index.php 中,您不在对象上下文中,因此未定义 $this。抽象类被用作创建基类的一种方式,该基类应该被扩展以完成类中预期的功能。看来您的课程应该是普通(或最终)课程。然后你需要用$db = new PDORepository; 实例化它。然后,您将遇到一些问题,因为 getConnection 方法是私有的(只能在对象内访问)。我建议从更简单的开始并经常测试代码。
  • 总的来说,这段代码只是一堆运算符,随意拼凑在一起。让我建议你用香草 PDO 练习一段时间。它将为您省去很多麻烦。仅作记录:$this 的问题不是这里唯一的问题

标签: php oop pdo


【解决方案1】:

第一个问题,你不能实例化一个抽象类,你必须有一个扩展抽象类的“具体”类。所以我会创建一个类UserRepository 扩展PDORepository:

<?php //pdorepository.php
    abstract class PDORepository{
        const USERNAME="xxxx";
        const PASSWORD="";
        const HOST="xxxxxx";
        const DB="xxxxx";
        private $conn;
        private function getConnection(){
            if (!$this->conn) {
                $username = self::USERNAME;
                $password = self::PASSWORD;
                $host = self::HOST;
                $db = self::DB;
                $this->conn = new PDO("mysql:dbname=$db;host=$host", $username, $password);
            }
            return $this->connection;
        }

        protected function execute($sql, $args = null) {
            return $this->getConnection()->prepare($sql)->execute($args);
        }
    }

?>

现在,在您的用户存储库中,我们将从 index.php 中放入您的代码,并且由于您现在正在在对象内部进行操作,因此您可以使用 $this 而不会出现错误:

<?php //userrepository.php
    require_once 'pdorepository.php';
    class UserRepository extends PDORepository{
        public function init() {
            $sql = "CREATE TABLE users (
                      user_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
                      account VARCHAR(30) NOT NULL,
                      password VARCHAR(30) NOT NULL,
                    )";
            try {
                $this->execute($sql);
            } catch(Exception $e){
                echo " " . $e->message();
            }
        }

?>

现在,通过这两个类,您可以实例化UserRepository 的实例,然后您可以在其上调用方法:

<?php //index.php

require_once 'userrepository.php'
$repository = new UserRepository();
$repository->init();

【讨论】:

  • 用户不是数据库 API,因此不应扩展后者。
  • @YourCommonSense 首先,他显然是一个全新的程序员,所以虽然软件架构的答案可能对你有用,但就这个问题而言,这将毫无意义.二、user不是我写的类,是我写的userrepository。存储库被定义为“存储和管理数据的中心位置”。我认为数据库符合该定义。
【解决方案2】:

我很欣赏 Dave 的回答,它在总体上解释了正确的架构是正确的,但不幸的是,特定代码相当不可行,因为它保留了 OP 的很多问题。

为了使它正确,我们需要 3 个文件:

pdo.php 我们将在其中创建 PDO 类的实例:

<?php
$user = 'root';
$pass = '';
$dsn  = "mysql:dbname=test;host=localhost;charset=utf8";
$opt  = array(
     PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
     PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
     PDO::ATTR_EMULATE_PREPARES   => FALSE,
);
$pdo = new PDO($dsn, $user, $pass, $opt);

pdorepository.php

<?php
abstract class PDORepository
{
    protected $pdo;

    public function __construct(\PDO $pdo)
    {
        $this->pdo = $pdo;
    }
    protected function _sql($sql, $args = null)
    {
        if (!$args) {
            return $this->pdo->query($sql);
        }
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }
}

userrepository.php

<?php
require_once 'pdorepository.php';
class UserRepository extends PDORepository
{
    public function init()
    {
        $sql = "CREATE TABLE users (
                  user_id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
                  account VARCHAR(30) NOT NULL,
                  password VARCHAR(30) NOT NULL
                )";
        $this->_sql($sql);
    }
}

最后是我们的应用程序文件:

<?php
require_once 'pdo.php';
require_once 'userrepository.php';

$repository = new UserRepository($pdo);
$repository->init();

这里的数据库连接只进行一次,这非常重要。还修复了很多小问题。这是工作和可用的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    相关资源
    最近更新 更多