/** *连贯操作调用field() where() order() limit() group() having()方法,组合SQL语句 */ function __call($methodName, $args) { $methodName = strtolower($methodName); if (array_key_exists($methodName, $this->sql)) { if (empty($args[0]) || (is_string($args[0]) && trim($args[0]) === '')) { $this->sql[$methodName] = ""; } else { $this->sql[$methodName] = $args; } ? if ($methodName == "limit") { if ($args[0] == "0") $this->sql[$methodName] = $args; } } else { Debug::addmsg("<font color='red'>调用类" . get_class($this) . "中的方法{$methodName}()不存在!</font>"); } return $this; }比如执行下面的代码:
$date=$user->field('uid,user_password')->where(array('user_username'=>$_POST['user_username']))->find();最终$sql中保存的数据如下:
arra ( "field" => 'uid,user_password', "where" => array('user_username'=>"xxxxx") )表名称和表字段结构
protected $fieldList = array(); 和 $tabName,在dpdp类setTable方法中自动获取
/** * 自动获取表结构 */ function setTable($tabName) { $cachefile = PROJECT_PATH . "runtime/data/" . $tabName . ".php"; $this->tabName = TABPREFIX . $tabName; //加前缀的表名 ? if (!file_exists($cachefile)) { try { $pdo = self::connect(); $stmt = $pdo->prepare("desc {$this->tabName}"); $stmt->execute(); $auto = "yno"; $fields = array(); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { if ($row["Key"] == "PRI") { $fields["pri"] = strtolower($row["Field"]); } else { $fields[] = strtolower($row["Field"]); } if ($row["Extra"] == "auto_increment") $auto = "yes"; } //如果表中没有主键,则将第一列当作主键 if (!array_key_exists("pri", $fields)) { $fields["pri"] = array_shift($fields); } if (!DEBUG) file_put_contents($cachefile, "<?php " . json_encode($fields) . $auto); $this->fieldList = $fields; $this->auto = $auto; } catch (PDOException $e) { Debug::addmsg("<font color='red'>异常:" . $e->getMessage() . '</font>'); } } else { $json = ltrim(file_get_contents($cachefile), "<?ph "); $this->auto = substr($json, -3); $json = substr($json, 0, -3); $this->fieldList = (array)json_decode($json, true); } Debug::addmsg("表<b>{$this->tabName}</b>结构:" . implode(",", $this->fieldList), 2); //debug }3.5、运行时(Runtime)
· 处理模块类的隐式集成common类,处理统一的业务,比如用户验证
· 处理运行时生成对应数据库驱动的数据模型
1)运行时数据模型
以一个简单的数据库表查询作为例子,
function test_query() { $article = D("article"); $data = https://www.isolves.com/it/cxkf/yy/php/2019-12-16/$article->query("SELECT * FROM article", "select"); print_r($data); }整体步骤流程:
整体步骤流程: D("article") -> Structure::model($className, $app); -> $model->setTable($className); $article->query("SELECT * FROM article", "select");1、 D("article")中D方法的职责如下:
· 运行时生成数据模型
· 获取数据模型对应的数据库表的字段以及其他表信息
/** * 创建Models中的数据库操作对象 * @param string $className 类名或表名 * @param string $app 应用名,访问其他应用的Model * @return object 数据库连接对象 */ function D($className = null, $app = "") { $db = null; //如果没有传表名或类名,则直接创建DB对象,但不能对表进行操作 if (is_null($className)) { $class = "D" . DRIVER; $db = new $class; } else { $className = strtolower($className); $model = Structure::model($className, $app); $model = new $model(); //如果表结构不存在,则获取表结构 $model->setTable($className); $db = $model; } if ($app == "") $db->path = APP_PATH; else $db->path = PROJECT_PATH . strtolower($app) . '/'; return $db; }1.1、 运行时数据模型
运行时生成数据模型由Structure::model这个方法处理
static function model($className, $app) { //父类名,使用PDO链接对应的父类名为Dpdo $driver = "D" . DRIVER; $rumtimeModelPath = PROJECT_PATH . "runtime/models/" . TMPPATH; if ($app == "") { // 数据模型类源码的位置:eg ./test/models/article.class.php,用户可以自定义数据模型保存在该位置 $src = https://www.isolves.com/it/cxkf/yy/php/2019-12-16/APP_PATH . "models/" . strtolower($className) . ".class.php"; // 数据模型父类源码的位置(___表示占位符,后面会有替换步骤) eg ./test/models/___.class.php $psrc = APP_PATH . "models/___.class.php"; // 运行时数据模型类名称,规则为原始类名添加"Model"后缀 $className = ucfirst($className) . 'Model'; // 运行时数据模型父类名称(___表示占位符,后面会有替换步骤) $parentClass = '___model'; // 运行时保存的数据模型类位置 /Users/aron/git-repo/PhpLearning/Foundation/26-brophp/runtime/models/Foundation_26-brophp_test_php/articlemodel.class.php $to = $rumtimeModelPath . strtolower($className) . ".class.php"; // 运行时保存的数据模型父类位置 eg /Users/aron/git-repo/PhpLearning/Foundation/26-brophp/runtime/models/Foundation_26-brophp_test_php/___model.class.php $pto = $rumtimeModelPath . $parentClass . ".class.php"; } else { $src = PROJECT_PATH . $app . "/models/" . strtolower($className) . ".class.php"; $psrc = PROJECT_PATH . $app . "/models/___.class.php"; $className = ucfirst($app) . ucfirst($className) . 'Model'; $parentClass = ucfirst($app) . '___model'; $to = $rumtimeModelPath . strtolower($className) . ".class.php"; $pto = $rumtimeModelPath . $parentClass . ".class.php"; } // 如果有原model存在,用户自定义了数据模型类 if (file_exists($src)) { $classContent = file_get_contents($src); $super = '/extendss+(.+?)s*{/i'; // 如果已经有父类 if (preg_match($super, $classContent, $arr)) { $psrc = str_replace("___", strtolower($arr[1]), $psrc); $pto = str_replace("___", strtolower($arr[1]), $pto); if (file_exists($psrc)) { if (!file_exists($pto) || filemtime($psrc) > filemtime($pto)) { $pclassContent = file_get_contents($psrc); $pclassContent = preg_replace('/classs+(.+?)s*{/i', 'class ' . $arr[1] . 'Model extends ' . $driver . ' {', $pclassContent, 1); file_put_contents($pto, $pclassContent); } } else { Debug::addmsg("
推荐阅读
- win7提示explorer.exe应用程序错误的解决方法
- 新买的Mac电脑如何设置更好用
- Mac小技巧|小技能有大作用
- 涌泉穴位位置图和作用 涌泉穴正确的按摩方法
- 浙江松阳启用茶叶质量IC卡 力求以质兴茶
- 原地热车究竟有啥作用?不少老司机都搞不明白,看看维修师傅怎么说?
- 汽车上的转速表究竟有什么用?我们开车时如何利用转速表?
- 汽车内外循环该怎样使用?
- 汽车上用的铅酸蓄电池,“铅”和“酸”是如何反应产生电能的?
- 暖脚宝可以在被窝用吗,暖脚宝可不可以睡觉用