继续开发和完善虚拟类
目标如下
1.执行sql语句
2.支持参数
3.支持多条sql一起执行
代码:
functions.inc
//加载虚拟类
function load_class($class){
$classPath = LKPHP_PATH.'/Libary/Class/myClass.php';
if(!class_exists('myClass')){
require($classPath);
}
return new myClass($class);
}
myClass.php
<?php
/**
* 虚拟注入类实现
*/
class myClass
{
var $xmlContent="";
var $funcList = array();
function myClass($xmlname)
{
$xmlurl = LKPHP_PATH.'Libary/Class/'.$xmlname.'.xml';
$this->xmlContent = file_get_contents($xmlurl);
$this->loadXml();
}
function loadXml(){
$conf = (array)simplexml_load_string($this->xmlContent);
foreach ($conf['func'] as $func) {
$this->funcList[strval($func->name)] = array(
'sql'=>strval($func->sql),
'description'=>strval($func->description),
'resultType'=>strval($func->resultType)
);
}
}
function getSqlByParams($sql,$funcParams){
if(!$funcParams || count($funcParams) === 0) return $sql;
$index = 0;
foreach ($funcParams as $p) {
$sql = str_replace('#{'.$index.'}',$p,$sql);
$index++;
}
return $sql;
}
function __call($funcName,$funcParams){
//echo '执行了'.$funcName.'但是这个方法没有定义,因此本函数来接管';
if(array_key_exists($funcName,$this->funcList)){
$db = load_db();
$sql = $this->funcList[$funcName]['sql'];
$sql = $this->getSqlByParams($sql,$funcParams);
switch ($this->funcList[$funcName]['resultType']) {
case 'array':
return $db->execForArray($sql);
break;
case 'int':
return intval($db->execForOne($sql));
case 'string':
return strval($db->execForOne($sql));
default:
//默认使用返回数组的方式
return $db->execForArray($sql);
break;
}
}
}
}
?>
index.inc 测试代码
//测试下加载的虚拟类
$news=load_class('news');
$info=$news->getNewsDetail();
// var_export($info);