簡體   English   中英

OOP PHP加載未返回正確的對象

[英]OOP PHP load not returning correct object

問題:當我用load對象加載模型時,它不會返回第二個模型。

看一看Test類,在其中我用load對象加載模型。 代碼$this->two將返回對象One(應加載對象Two)。

問:如何解決這個問題? 我打開您的建議/想法/代碼

當前結果:

one is working
object(One)#3 (1) { ["error":"Model":private]=> NULL }
one is working
object(One)#4 (1) { ["error":"Model":private]=> NULL }

正確結果:

one is working
object(One)#3 (1) { ["error":"Model":private]=> NULL }
two is working
object(Two)#4 (1) { ["error":"Model":private]=> NULL }

PHP:

one_model.php

<?php

class One extends Model {

    public function test() {
        echo '<p>one is working</p>';
    }

}

two_model.php

<?php

class Two extends Model {

    public function test() {
        echo '<p>two is working</p>';
    }

}

index.php

<?php

class Controller {

    public $load;

    public function __construct() {
        $this->load = new Load();
    }

}

class Load {

    public function model($name) {
        if (!class_exists($name)) {
            require(strtolower($name) . '_model.php');
        }
        $model = new $name;
        return $model;
    }

}

class Model extends PDO {

    private $error;

    public function __construct() {

        $options = array(
            PDO::ATTR_PERSISTENT => true,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        );

        try {
            $dsn = "mysql:dbname=test;host=localhost;charset=utf8";
            parent::__construct($dsn, 'root', '', $options);
        }
        catch (PDOException $e) {
            $this->error = $e->getMessage();
        }
    }

}

class Test extends Controller {

    public $one;
    public $two;

    public function __construct() {
        parent::__construct();

        $this->one = $this->load->model('one');
        $this->two = $this->load->model('two');
    }

    public function testing() {
        $this->one->test();
        var_dump($this->one);
        $this->two->test();
        var_dump($this->two);
    }

}

// Usage
$test = new Test();
$test->testing();

我將PDO包裝器從Model移到了單獨的類,並創建了用於數據庫連接的對象。

這是好方法嗎? 這是“ waste of resources ”嗎?

class Database extends PDO {

    private $error;

    public function __construct() {

        $options = array(
            PDO::ATTR_PERSISTENT => true,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        );

        try {
            $dsn = "mysql:dbname=test;host=localhost;charset=utf8";
            parent::__construct($dsn, 'root', '', $options);
        }
        catch (PDOException $e) {
            $this->error = $e->getMessage();
        }
    }

}


class Model {

    public $db;

    public function __construct() {
        $this->db = new Database();
    }

}

似乎存在的問題是您正在將PDO::ATTR_PERSISTENT => true傳遞給PDO構造函數。 這將告訴PDO緩存和重用連接-毫無疑問,您會發現-但這似乎也會導致PDO生成在單個腳本范圍內生成的第一個PDO實例的克隆,包括用於創建該第一個實例的子類。 。 (不過,關於這方面似乎沒有很多文檔。)

如果需要持久連接,我的建議是以不要求從PDO擴展模型的方式定義模型。 在任何情況下,這都不是必須的。

例如,如果您的代碼使用CRUD模型,則將其從模型中抽象出來,然后將數據庫代碼放入該模型的基礎中而不是實際的模型中,則可以很好地解決此問題。 例如,以這些為基礎:

class DatabaseSingleton {
    private static $instance;

    public static function get() {
        if (!self::$instance) {
            $options = array(
                PDO::ATTR_PERSISTENT => true,
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
            );
            $dsn = "mysql:dbname=test;host=localhost;charset=utf8";
            self::$instance = new PDO($dsn, 'root', '', $options);
        }
        return self::$instance;
    }
}

abstract class Crud {
    private $pdo;

    public function __construct() {
        $this->pdo = DatabaseSingleton::get();
    }

    public function create(...) {
        $this->pdo->...
    }
    public function retrieve(...) {
        $this->pdo->...
    }
    public function update(...) {
        $this->pdo->...
    }
    public function delete(...) {
        $this->pdo->...
    }
}

然后,您的模型可以簡單地定義為以下子項:

abstract class Model extends Crud {

    public function __construct() {
        parent::__construct();
        // Etc...
    }
}

使用單例提供的單個PDO實例, Crud定義的CRUD功能將可供他們使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM