我正在尝试用纯 php 构建一个看似简单的小应用程序(不能使用任何框架或花哨的工具,如 orms)。
我从定义代表我的模型的对象开始。我的想法是有一个Model
基类,它包含一个静态 pdo 实例来访问数据库,以及两个从它继承并实现他们需要的自定义方法的“具体”模型类。
好吧,男孩我对 PHP 生疏了。这也是我第一次用它做实际的 oop(我已经用其他语言(主要是 C# 和 python)做了足够多的事情来理解它应该如何工作,但一些微妙之处可能很好地避开了我。
如果有人愿意提供帮助,这就是我目前所拥有的:
<?php
/**
* Base model class, handling basic db connection
*/
Class Model {
protected static $db;
public static function initDb() {
self::$db = new PDO(DB_CONNECTION_STRING, DB_USER, DB_PSWD);
}
protected function _prepare_request($sqlstmnt) {
return self::$db->prepare($sqlstmnt);
}
}
Model::initDb();
/**
* Model class for Category objects
**/
Class Categorie extends Model {
private $request_getSingle = NULL;
public function __contruct() {
$this->request_getSingle = $this->_prepare_request(
"SELECT * FROM categorie WHERE cat_id = :id;"
);
}
public function getById($id) {
$poop = $this->request_getSingle->execute(array(':id' => $id));
$res = $poop->fecthAll();
print_r($res);
}
}
// Debug tests:
$c = new Categorie();
var_dump($c);
$c->getById('1');
print_r($c);
echo 'done';
?>
好像我的查询对象没有正确初始化 - 这是我运行那个愚蠢的调试代码时得到的:
object(Categorie)#3 (1) { ["request_getSingle":"Categorie":private]=> NULL }
Fatal error: Call to a member function execute() on a non-object in /home/raphi/dev/naoned-test/models/categories.php on line 18
Call Stack:
0.0003 648192 1. {main}() /home/raphi/dev/naoned-test/models/categories.php:0
0.0011 661784 2. Categorie->getById() /home/raphi/dev/naoned-test/models/categories.php:27
我不知道到底出了什么问题。我可能错误地使用了静态变量,或者错过了有关 PDO 工作原理的一些信息。
希望这足够清楚,并感谢任何愿意提供帮助的人(由于无助的黑客行为可能会导致一些愚蠢的错误)。
编辑:
经过修改后,事实证明,如果我在其中调用 PDO 准备、执行等方法getById
,一切正常。但是为什么我不能将准备好的 SQL 语句保留为实例变量呢?prepare
每次我想访问它时都必须打电话似乎违背了它的目的......
编辑:
嗯......这似乎是固定的,但我还是不明白。我已经用request_getSingle
一个数组替换了我的变量,其中包含几个准备好的语句(这是我最终计划做的......)并且一切正常。
我不明白。如果我将它们存储在一个数组中,它们可以从类的其他方法中访问,但是如果我将它们存储为常规属性,它们不能吗?
如果有人知道发生了什么,我仍然有兴趣......