Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否每次都使用PDO数据库类而不创建新连接?_Php_Mysql_Pdo - Fatal编程技术网

Php 是否每次都使用PDO数据库类而不创建新连接?

Php 是否每次都使用PDO数据库类而不创建新连接?,php,mysql,pdo,Php,Mysql,Pdo,我得到了这个PDO数据库类 class clsDatabase{ // db settings private $host = 'localhost'; private $user = 'test'; private $dbname = 'test'; private $pass = 'test1'; private $dbh; private $error; public function __construct(){ // Se

我得到了这个PDO数据库类

class clsDatabase{
  // db settings
  private $host   = 'localhost';
  private $user   = 'test';
  private $dbname = 'test';
  private $pass   = 'test1';

  private $dbh;
  private $error;

  public function __construct(){
        // Set DSN
        $dsn = 'mysql: host=' . $this->host . ';dbname=' . $this->dbname;
        // Set options
        $options = array(
            PDO::ATTR_PERSISTENT            => true,
            PDO::ATTR_ERRMODE               => PDO::ERRMODE_EXCEPTION,
            PDO::MYSQL_ATTR_INIT_COMMAND    => 'SET NAMES UTF8'
        );
        // Create a new PDO instanace
        try{
            $this->dbh = new PDO($dsn, $this->user, $this->pass, $options); 
        }
        // Catch any errors
        catch(PDOException $e){
            $this->error = $e->getMessage();
            echo $this->error;
            exit;
        }       
    }

    public function query($query){
        $this->stmt = $this->dbh->prepare($query);
    }
}   
我尝试在不同的类中分离代码,例如,我得到了一个连接到clsUserController的clsDBUser。我这样做是为了知道什么类使用什么数据库代码。我的clsDBUser课是这样的

class clsDBUser extends clsDatabase {
    // construct
    public function __construct() {
        parent::__construct();
    }

    // get users
    public function getUsers($users_id){
        $query = "
            SELECT 
                email
            FROM 
                users
            WHERE 
               users_id = :users_id
        ";          
        $this->query($query);
        $this->bind(':users_id', $users_id);

        if($row = $this->single()){
            $this->close();
            return $row;
        }
        $this->close();
        return false;       
    }
}
class DB {
   // connectionStuff goes Here
}

class Model {
   private $db

   public function __construct($db) {
       $this->db = $db;
   }
}
我想知道这是一种方法,还是我现在正在每个类中创建一个新的数据库连接?因为通常在PHP4中(是的,我知道旧的),我无法识别每次都必须建立一个新的数据库连接


我需要改进吗?我需要如何改进呢?

不要从连接类(
clsDatabase
)扩展实体(
clsDBUser

clsDatabase
使用单例(或更高级的模式)

例如:

class clsDatabase {

    static private $instance = null;

    // some other private fields

    private function __construct(/* parameters*/) {
        // do it
    }

    public static function instance() {
        if (is_null(self::$instance)) {
            self::$instance = new self(/* pass any parameters */);
        }
        return self::$instance;
    }

    public function queryRow($query) {
        $oStatement = $this->dbh->prepare($query);

        // ...

        return $row;
    }
}

class clsDBUser {

    public function getUser($id) {
        $query = "...";
        return $clsDatabase::instance()->queryRow($query);
    }

}

嘿,我会这样做的

class clsDBUser extends clsDatabase {
    // construct
    public function __construct() {
        parent::__construct();
    }

    // get users
    public function getUsers($users_id){
        $query = "
            SELECT 
                email
            FROM 
                users
            WHERE 
               users_id = :users_id
        ";          
        $this->query($query);
        $this->bind(':users_id', $users_id);

        if($row = $this->single()){
            $this->close();
            return $row;
        }
        $this->close();
        return false;       
    }
}
class DB {
   // connectionStuff goes Here
}

class Model {
   private $db

   public function __construct($db) {
       $this->db = $db;
   }
}
使用:

重建:

仅包含连接内容的clsDB类

class clsDB{
    // db settings
    private $host   = 'localhost';
    private $user   = 'test';
    private $dbname = 'test';
    private $pass   = 'test';

    private $dbh;
    private $error;

    public function __construct(){
        // Set DSN
        $dsn = 'mysql: host=' . $this->host . ';dbname=' . $this->dbname;
        // Set options
        $options = array(
            PDO::ATTR_PERSISTENT            => true,
            PDO::ATTR_ERRMODE               => PDO::ERRMODE_EXCEPTION,
            PDO::MYSQL_ATTR_INIT_COMMAND    => 'SET NAMES UTF8'
        );
        // Create a new PDO instanace
        try{
            $this->dbh = new PDO($dsn, $this->user, $this->pass, $options); 
        }
        // Catch any errors
        catch(PDOException $e){
            $this->error = $e->getMessage();
            echo $this->error;
            exit;
        }       
    }           
}
clsDBLogin:

class clsDBLogin{   
   private $db;

   public function __construct($db) {
       $this->db = $db;
   }
}
在index.php中,我执行以下操作:

$clsDB      = new clsDB();
$clsDBLogin = new clsDBLogin($clsDB);
在clsDBLogin中,我会:

public function validateLogin($email){  
    $email = str_replace(' ', '', $email);
    $email = strtolower($email);

    // Check user in db to start verification
    $query = '
        SELECT
            u.*, ui.*
        FROM
            users as u,
            users_info as ui
        WHERE
            u.users_id = ui.users_id
        AND
            u.email = :email                
    ';
    $this->db->prepare($query);
    $this->db->bindValue(':email', $email, PDO::PARAM_STR);

    if($this->db->execute()){
        if($row = $this->db->fetch(PDO::FETCH_ASSOC)){
            return $row;            
        }       
    }   
}

你应该走void先生回答中所示的路。简言之:

  • 摆脱clsDatabase
  • 创建PDO的实例
  • 将其传递到clsDBLogin的财产中,如void先生的回答所示
  • 然后以$this->db->prepare()等形式使用这个pdo实例
  • 所以应该是这样

    class clsDBLogin
    {
        public function __construct($db)
        {
            $this->db = $db;
        }
    
        public function validateLogin($email)
        {  
            $email = trim($email);
    
            // Check user in db to start verification
            $query = 'SELECT * FROM users u, users_info ui 
                      WHERE u.users_id = ui.users_id AND u.email = ?';
            $stmt = $this->db->prepare($query);
            $stmt->execute([$email]);
            return $stmt->fetch();
        }
    }
    
    $dsn = 'mysql: host=localhost;dbname=test;charset=utf8';
    $options = array(
            PDO::ATTR_PERSISTENT            => true,
            PDO::ATTR_ERRMODE               => PDO::ERRMODE_EXCEPTION,
    );
    // Create a new PDO instanace
    $pdo = new PDO($dsn, $this->user, $this->pass, $options); 
    
    $DBLogin = new clsDBLogin($pdo);
    $user = $DBLogin->validateLogin($email);
    

    这里有三层:

    • 数据库连接器:您可以将纯PDO用于此或数据库抽象层库()
    • 实体存储库:换句话说,某种ORM。提供高级ORM功能。当然,您可以编写自己的轻量级解决方案
    • 实体:可以是逻辑记录的简单、简单或任何其他对象表示形式
    当我们手动执行此操作时。。。首先,不要相互延伸。一般情况下:切勿延伸与其他层不同的层。使用(DI)代替

    当您将所有特定信息(依赖项)作为构造函数参数传递时,DI的情况非常简单。我的活动对象(如示例
    Entity
    )只知道实体的一般行为(在存储库中的一个键处)。为了简单起见,我使用原始SQL

    存储库类:

    class Repository {
    
        private $oPDO;
        private $tableName;
        private $keyFieldName;
    
        public function __construct($oPDO, $tableName, $keyFieldName) {
            $this->oPDO = $oPDO;
            $this->tableName = $tableName;
            $this->keyFieldName = $keyFieldName;
        }
    
        public function getPDO() {
            return $this->oPDO;
        }
    
        public function getTableName() {
            return $this->tableName;
        }
    
        public function getKeyFieldName() {
            return $this->keyFieldName;
        }
    
        public function getEntity($id) {
            return new Entity($this, $id);
        }
    
        public function createEntity() {
            return new Entity($this, null);
        }
    
    }
    
    class Entity implements ArrayAccess {
    
        private $oRepository;
        private $id;
    
        private $record = null;
    
        public function __construct($oRepository, $id) {
            $this->oRepository = $oRepository;
            $this->id = $id;
        }
    
        public function load($reload = false) {
            if (!$this->record && !$this->id) {
                return false;
            }
    
            if (!$reload && !is_null($this->record)) {
                return true;
            }
    
            $quotedTableName = $this->quoteIdentifier($this->oRepository->getTableName());
            $quotedKeyFieldName = $this->quoteIdentifier($this->oRepository->getKeyFieldName());
            $selectSql = "SELECT * FROM {$quotedTableName} WHERE {$quotedKeyFieldName} = ?";
            $oStatement = $this->oRepository->getPDO()->prepare($selectSql);
            $this->bindParam($oStatement, 1, $this->id);
            $oStatement->execute();
    
            $result = $oStatement->fetch(PDO::FETCH_ASSOC);
    
            if ($result === false || is_null($result)) {
                return false;
            }
    
            $this->record = $result;
            return true;
        }
    
        public function save() {
            $oPDO = $this->oRepository->getPDO();
    
            $tableName = $this->oRepository->getTableName();
            $keyFieldName = $this->oRepository->getKeyFieldName();
            $quotedTableName = $this->quoteIdentifier($tableName);
            $quotedKeyFieldName = $this->quoteIdentifier($keyFieldName);
    
            if (is_null($this->id)) {
                $insertSql = "INSERT INTO {$quotedTableName} (";
                $insertSql .= implode(", ", array_map([$this, "quoteIdentifier"], array_keys($this->record)));
                $insertSql .= ") VALUES (";
                $insertSql .= implode(", ", array_fill(0, count($this->record), "?"));
                $insertSql .= ")";
                $oStatement = $oPDO->prepare($insertSql);
    
                $p = 1;
                foreach ($this->record as $fieldName => $value) {
                    $this->bindParam($oStatement, $p, $value);
                    $p++;
                }
    
                if ($oStatement->execute()) {
                    $this->id = $oPDO->lastInsertId();
                    return true;
                } else {
                    return false;
                }
            } else {
                $updateSql = "UPDATE {$quotedTableName} SET ";
                $updateSql .= implode(" = ?, ", array_map([$this, "quoteIdentifier"], array_keys($this->record)));
                $updateSql .= " = ? WHERE {$quotedKeyFieldName} = ?";
                $oStatement = $oPDO->prepare($updateSql);
    
                $p = 1;
                foreach ($this->record as $fieldName => $value) {
                    $this->bindParam($oStatement, $p, $value);
                    $p++;
                }
                $this->bindParam($oStatement, $p, $this->id);
    
                if ($oStatement->execute()) {
                    if (isset($this->record[$keyFieldName])) {
                        $this->id = $this->record[$keyFieldName];
                    }
                    return true;
                } else {
                    return false;
                }
            }
        }
    
        public function isExisting($reload = false) {
            if (!$this->record && !$this->id) {
                return false;
            }
    
            if (!$reload && !is_null($this->record)) {
                return true;
            }
    
            $quotedTableName = $this->quoteIdentifier($this->oRepository->getTableName());
            $quotedKeyFieldName = $this->quoteIdentifier($this->oRepository->getKeyFieldName());
            $selectSql = "SELECT 1 FROM {$quotedTableName} WHERE {$quotedKeyFieldName} = ?";
            $oStatement = $this->oRepository->getPDO()->prepare($selectSql);
            $oStatement->bindParam(1, $this->id);
            $oStatement->execute();
    
            $result = $oStatement->fetch(PDO::FETCH_ASSOC);
    
            if ($result === false || is_null($result)) {
                return false;
            }
    
            return true;
        }
    
        public function getId() {
            return $this->id;
        }
    
        public function getRecord() {
            $this->load();
            return $this->record;
        }
    
        public function offsetExists($offset) {
            $this->load();
            return isset($this->record[$offset]);
        }
    
        public function offsetGet($offset) {
            $this->load();
            return $this->record[$offset];
        }
    
        public function offsetSet($offset, $value) {
            $this->load();
            $this->record[$offset] = $value;
        }
    
        public function offsetUnset($offset) {
            $this->load();
            $this->record[$offset] = null;
        }
    
        private function quoteIdentifier($name) {
            return "`" . str_replace("`", "``", $name) . "`";
        }
    
        private function bindParam($oStatement, $key, $value) {
            $oStatement->bindParam($key, $value);
        }
    
    }
    
    $oRepo = new Repository($oPDO, "user", "user_id");
    
    var_dump($oRepo->getEntity(2345235)->isExisting());
    
    $oSameUser = $oRepo->getEntity(1);
    var_dump($oSameUser->isExisting());
    var_dump($oSameUser->getRecord());
    
    $oNewUser = $oRepo->createEntity();
    $oNewUser["username"] = "smith.john";
    $oNewUser["password"] = password_hash("ihatesingletons", PASSWORD_DEFAULT);
    $oNewUser["name"] = "John Smith";
    $oNewUser->save();
    
    $oNewUser["name"] = "John Jack Smith";
    $oNewUser->save();
    
    实体类:

    class Repository {
    
        private $oPDO;
        private $tableName;
        private $keyFieldName;
    
        public function __construct($oPDO, $tableName, $keyFieldName) {
            $this->oPDO = $oPDO;
            $this->tableName = $tableName;
            $this->keyFieldName = $keyFieldName;
        }
    
        public function getPDO() {
            return $this->oPDO;
        }
    
        public function getTableName() {
            return $this->tableName;
        }
    
        public function getKeyFieldName() {
            return $this->keyFieldName;
        }
    
        public function getEntity($id) {
            return new Entity($this, $id);
        }
    
        public function createEntity() {
            return new Entity($this, null);
        }
    
    }
    
    class Entity implements ArrayAccess {
    
        private $oRepository;
        private $id;
    
        private $record = null;
    
        public function __construct($oRepository, $id) {
            $this->oRepository = $oRepository;
            $this->id = $id;
        }
    
        public function load($reload = false) {
            if (!$this->record && !$this->id) {
                return false;
            }
    
            if (!$reload && !is_null($this->record)) {
                return true;
            }
    
            $quotedTableName = $this->quoteIdentifier($this->oRepository->getTableName());
            $quotedKeyFieldName = $this->quoteIdentifier($this->oRepository->getKeyFieldName());
            $selectSql = "SELECT * FROM {$quotedTableName} WHERE {$quotedKeyFieldName} = ?";
            $oStatement = $this->oRepository->getPDO()->prepare($selectSql);
            $this->bindParam($oStatement, 1, $this->id);
            $oStatement->execute();
    
            $result = $oStatement->fetch(PDO::FETCH_ASSOC);
    
            if ($result === false || is_null($result)) {
                return false;
            }
    
            $this->record = $result;
            return true;
        }
    
        public function save() {
            $oPDO = $this->oRepository->getPDO();
    
            $tableName = $this->oRepository->getTableName();
            $keyFieldName = $this->oRepository->getKeyFieldName();
            $quotedTableName = $this->quoteIdentifier($tableName);
            $quotedKeyFieldName = $this->quoteIdentifier($keyFieldName);
    
            if (is_null($this->id)) {
                $insertSql = "INSERT INTO {$quotedTableName} (";
                $insertSql .= implode(", ", array_map([$this, "quoteIdentifier"], array_keys($this->record)));
                $insertSql .= ") VALUES (";
                $insertSql .= implode(", ", array_fill(0, count($this->record), "?"));
                $insertSql .= ")";
                $oStatement = $oPDO->prepare($insertSql);
    
                $p = 1;
                foreach ($this->record as $fieldName => $value) {
                    $this->bindParam($oStatement, $p, $value);
                    $p++;
                }
    
                if ($oStatement->execute()) {
                    $this->id = $oPDO->lastInsertId();
                    return true;
                } else {
                    return false;
                }
            } else {
                $updateSql = "UPDATE {$quotedTableName} SET ";
                $updateSql .= implode(" = ?, ", array_map([$this, "quoteIdentifier"], array_keys($this->record)));
                $updateSql .= " = ? WHERE {$quotedKeyFieldName} = ?";
                $oStatement = $oPDO->prepare($updateSql);
    
                $p = 1;
                foreach ($this->record as $fieldName => $value) {
                    $this->bindParam($oStatement, $p, $value);
                    $p++;
                }
                $this->bindParam($oStatement, $p, $this->id);
    
                if ($oStatement->execute()) {
                    if (isset($this->record[$keyFieldName])) {
                        $this->id = $this->record[$keyFieldName];
                    }
                    return true;
                } else {
                    return false;
                }
            }
        }
    
        public function isExisting($reload = false) {
            if (!$this->record && !$this->id) {
                return false;
            }
    
            if (!$reload && !is_null($this->record)) {
                return true;
            }
    
            $quotedTableName = $this->quoteIdentifier($this->oRepository->getTableName());
            $quotedKeyFieldName = $this->quoteIdentifier($this->oRepository->getKeyFieldName());
            $selectSql = "SELECT 1 FROM {$quotedTableName} WHERE {$quotedKeyFieldName} = ?";
            $oStatement = $this->oRepository->getPDO()->prepare($selectSql);
            $oStatement->bindParam(1, $this->id);
            $oStatement->execute();
    
            $result = $oStatement->fetch(PDO::FETCH_ASSOC);
    
            if ($result === false || is_null($result)) {
                return false;
            }
    
            return true;
        }
    
        public function getId() {
            return $this->id;
        }
    
        public function getRecord() {
            $this->load();
            return $this->record;
        }
    
        public function offsetExists($offset) {
            $this->load();
            return isset($this->record[$offset]);
        }
    
        public function offsetGet($offset) {
            $this->load();
            return $this->record[$offset];
        }
    
        public function offsetSet($offset, $value) {
            $this->load();
            $this->record[$offset] = $value;
        }
    
        public function offsetUnset($offset) {
            $this->load();
            $this->record[$offset] = null;
        }
    
        private function quoteIdentifier($name) {
            return "`" . str_replace("`", "``", $name) . "`";
        }
    
        private function bindParam($oStatement, $key, $value) {
            $oStatement->bindParam($key, $value);
        }
    
    }
    
    $oRepo = new Repository($oPDO, "user", "user_id");
    
    var_dump($oRepo->getEntity(2345235)->isExisting());
    
    $oSameUser = $oRepo->getEntity(1);
    var_dump($oSameUser->isExisting());
    var_dump($oSameUser->getRecord());
    
    $oNewUser = $oRepo->createEntity();
    $oNewUser["username"] = "smith.john";
    $oNewUser["password"] = password_hash("ihatesingletons", PASSWORD_DEFAULT);
    $oNewUser["name"] = "John Smith";
    $oNewUser->save();
    
    $oNewUser["name"] = "John Jack Smith";
    $oNewUser->save();
    
    用法:

    class Repository {
    
        private $oPDO;
        private $tableName;
        private $keyFieldName;
    
        public function __construct($oPDO, $tableName, $keyFieldName) {
            $this->oPDO = $oPDO;
            $this->tableName = $tableName;
            $this->keyFieldName = $keyFieldName;
        }
    
        public function getPDO() {
            return $this->oPDO;
        }
    
        public function getTableName() {
            return $this->tableName;
        }
    
        public function getKeyFieldName() {
            return $this->keyFieldName;
        }
    
        public function getEntity($id) {
            return new Entity($this, $id);
        }
    
        public function createEntity() {
            return new Entity($this, null);
        }
    
    }
    
    class Entity implements ArrayAccess {
    
        private $oRepository;
        private $id;
    
        private $record = null;
    
        public function __construct($oRepository, $id) {
            $this->oRepository = $oRepository;
            $this->id = $id;
        }
    
        public function load($reload = false) {
            if (!$this->record && !$this->id) {
                return false;
            }
    
            if (!$reload && !is_null($this->record)) {
                return true;
            }
    
            $quotedTableName = $this->quoteIdentifier($this->oRepository->getTableName());
            $quotedKeyFieldName = $this->quoteIdentifier($this->oRepository->getKeyFieldName());
            $selectSql = "SELECT * FROM {$quotedTableName} WHERE {$quotedKeyFieldName} = ?";
            $oStatement = $this->oRepository->getPDO()->prepare($selectSql);
            $this->bindParam($oStatement, 1, $this->id);
            $oStatement->execute();
    
            $result = $oStatement->fetch(PDO::FETCH_ASSOC);
    
            if ($result === false || is_null($result)) {
                return false;
            }
    
            $this->record = $result;
            return true;
        }
    
        public function save() {
            $oPDO = $this->oRepository->getPDO();
    
            $tableName = $this->oRepository->getTableName();
            $keyFieldName = $this->oRepository->getKeyFieldName();
            $quotedTableName = $this->quoteIdentifier($tableName);
            $quotedKeyFieldName = $this->quoteIdentifier($keyFieldName);
    
            if (is_null($this->id)) {
                $insertSql = "INSERT INTO {$quotedTableName} (";
                $insertSql .= implode(", ", array_map([$this, "quoteIdentifier"], array_keys($this->record)));
                $insertSql .= ") VALUES (";
                $insertSql .= implode(", ", array_fill(0, count($this->record), "?"));
                $insertSql .= ")";
                $oStatement = $oPDO->prepare($insertSql);
    
                $p = 1;
                foreach ($this->record as $fieldName => $value) {
                    $this->bindParam($oStatement, $p, $value);
                    $p++;
                }
    
                if ($oStatement->execute()) {
                    $this->id = $oPDO->lastInsertId();
                    return true;
                } else {
                    return false;
                }
            } else {
                $updateSql = "UPDATE {$quotedTableName} SET ";
                $updateSql .= implode(" = ?, ", array_map([$this, "quoteIdentifier"], array_keys($this->record)));
                $updateSql .= " = ? WHERE {$quotedKeyFieldName} = ?";
                $oStatement = $oPDO->prepare($updateSql);
    
                $p = 1;
                foreach ($this->record as $fieldName => $value) {
                    $this->bindParam($oStatement, $p, $value);
                    $p++;
                }
                $this->bindParam($oStatement, $p, $this->id);
    
                if ($oStatement->execute()) {
                    if (isset($this->record[$keyFieldName])) {
                        $this->id = $this->record[$keyFieldName];
                    }
                    return true;
                } else {
                    return false;
                }
            }
        }
    
        public function isExisting($reload = false) {
            if (!$this->record && !$this->id) {
                return false;
            }
    
            if (!$reload && !is_null($this->record)) {
                return true;
            }
    
            $quotedTableName = $this->quoteIdentifier($this->oRepository->getTableName());
            $quotedKeyFieldName = $this->quoteIdentifier($this->oRepository->getKeyFieldName());
            $selectSql = "SELECT 1 FROM {$quotedTableName} WHERE {$quotedKeyFieldName} = ?";
            $oStatement = $this->oRepository->getPDO()->prepare($selectSql);
            $oStatement->bindParam(1, $this->id);
            $oStatement->execute();
    
            $result = $oStatement->fetch(PDO::FETCH_ASSOC);
    
            if ($result === false || is_null($result)) {
                return false;
            }
    
            return true;
        }
    
        public function getId() {
            return $this->id;
        }
    
        public function getRecord() {
            $this->load();
            return $this->record;
        }
    
        public function offsetExists($offset) {
            $this->load();
            return isset($this->record[$offset]);
        }
    
        public function offsetGet($offset) {
            $this->load();
            return $this->record[$offset];
        }
    
        public function offsetSet($offset, $value) {
            $this->load();
            $this->record[$offset] = $value;
        }
    
        public function offsetUnset($offset) {
            $this->load();
            $this->record[$offset] = null;
        }
    
        private function quoteIdentifier($name) {
            return "`" . str_replace("`", "``", $name) . "`";
        }
    
        private function bindParam($oStatement, $key, $value) {
            $oStatement->bindParam($key, $value);
        }
    
    }
    
    $oRepo = new Repository($oPDO, "user", "user_id");
    
    var_dump($oRepo->getEntity(2345235)->isExisting());
    
    $oSameUser = $oRepo->getEntity(1);
    var_dump($oSameUser->isExisting());
    var_dump($oSameUser->getRecord());
    
    $oNewUser = $oRepo->createEntity();
    $oNewUser["username"] = "smith.john";
    $oNewUser["password"] = password_hash("ihatesingletons", PASSWORD_DEFAULT);
    $oNewUser["name"] = "John Smith";
    $oNewUser->save();
    
    $oNewUser["name"] = "John Jack Smith";
    $oNewUser->save();
    

    当然,您可以从
    存储库
    扩展
    morecuterepository
    ,从
    实体
    扩展
    morecuteentity
    ,并使用特定的行为。

    观察单例实现和其他类似工厂的设计模式,或者查看其他解决方案:PDO已经有了一个非常好的类,为什么要彻底改造一个轮子?为什么要调用一个方法
    query()
    ,当它所做的一切都是
    prepare
    时,你要添加到PDO中的就是混淆Singleton是一个反模式,你应该避免它。你想要的是DI()。您可以使用php di。它是一个DIC(依赖注入容器),可以自动连接您的依赖项是的,DI是正确的解决方案,但是“不要扩展”是正确的答案。我写过:“或者更高级的模式。”好吧,我可以用你的例子吗?因为我明天会试试这个,可能会给你更多的问题,如果可以的话@Dávid Horváth你能给我一个完整的例子吗?@poNgz0r请看我的另一个答案,一个高级的例子。不完全是。您的代码非常凌乱(到处都是clsDatabase::getInstance()),令人困惑(使用query作为prepare的别名,我会称之为破坏)且不灵活(此代码将只限于一个实例,您将无法使用另一个实例)。此外,在关闭连接后,您将无法在脚本中运行多个查询,这相当可笑,那么该怎么办呢?1。摆脱clsDatabase。2.创建PDO的实例。3.将其传递到clsDBLogin的财产中,如void先生的回答所示。4.然后以$this->db->prepare()等形式使用这个pdo实例。这个实例本质上更好。虽然仍然有很多无用的代码,但总体来说,这种方法是可行的,这不正是问题所在吗?因为在这段代码中,您每次都会在所有类中的每个操作之前调用
    $db=new db..
    ——这不是效率低下吗?@教父不,在初始问题中,会为继承父类的对象的每个实例建立连接。在我的示例中,只有一个用于创建连接的实例,它被传递给依赖于sql连接的所有实例