[英]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.