关于php反射的问题

来源:互联网 发布:孙楠退赛汪涵救场 知乎 编辑:程序博客网 时间:2024/06/04 23:28

笔者最近刚接触php,所以并没有去学习什么框架,这里就说下笔者自己对php反射的一些经验。

关于什么事反射,这里我就不多说了,学过java的人都知道什么事反射,不知道的人可以自己百度下。

笔者本意是想做一个跟java habernate一样的东西,给一个对象,设置一个模型,然后,我只需要给这些对象里面写入一些值,调用一个方法,把这个对象传入进去后就可以保存了,当然要实现这个功能很容易,也有很多种做法,比如在模型里面把类的全部属性封装到一个数组里面,然后对应赋值也是能实现的。这里感觉有反射做这个事情有点复杂了,但已想到hibernate的好用之处,笔者总有种跃跃欲试的感觉,所以就直接做了。

首先做一个模型类:

class Menu {

private $id ; //         编号
private $topid ; //      上级菜单id(根菜单为0)
private $menuname  ; //    菜单名称
private $menuurl  ; //     菜单链接地址
private $menuclassid; //  菜单类别id



/**
* 得到当前类的名字
* */
public function getClassName() {

return "Menu";
}


//---------------------------------------
/**
* @return the $id
*/
public function getId() {
return $this->id;
}


/**
* @return the $topid
*/
public function getTopid() {
return $this->topid;
}


/**
* @return the $menuname
*/
public function getMenuname() {
return $this->menuname;
}


/**
* @return the $menuurl
*/
public function getMenuurl() {
return $this->menuurl;
}


/**
* @return the $menuclassid
*/
public function getMenuclassid() {
return $this->menuclassid;
}


/**
* @param field_type $id
*/
public function setId($id) {
$this->id = $id;
}


/**
* @param field_type $topid
*/
public function setTopid($topid) {
$this->topid = $topid;
}


/**
* @param field_type $menuname
*/
public function setMenuname($menuname) {
$this->menuname = $menuname;
}


/**
* @param field_type $menuurl
*/
public function setMenuurl($menuurl) {
$this->menuurl = $menuurl;
}


/**
* @param field_type $menuclassid
*/
public function setMenuclassid($menuclassid) {
$this->menuclassid = $menuclassid;
}

}


然后我们创建一个文件封装所有的sql操作,

由于sql操作太多了,笔者只贴添加功能:



public function add($obj) {
/*反射实现*/

$className = $obj->getClassName();
$ref = new ReflectionClass($className);
$method = $ref->getMethods();
$properties = $ref->getProperties();
$cloumns = "";
$values = "";

for ($i = 1; $i < count($properties); $i++) {
$cloumn = $properties[$i]->name;//得到第一个属性
$method = "get" . ucwords($cloumn);//拼第一个属性的get方法
$cloumns = $cloumns . $cloumn . ", ";//将属性连接,作为表的字段
$reflectionMethod = new ReflectionMethod($className,  $method);
$value = $reflectionMethod->invoke($obj);//执行方法
if (is_string($value)) {
$value = "'" . $value . "'";
}
$values = $values . $value . ", ";
}
$cloumns = substr($cloumns,0,strlen($cloumns)-2);
$values = substr($values,0,strlen($values)-2);
$tableName = $this->db_tablePfx . $className;
$sql = "insert into " . $tableName . " (" . $cloumns . " ) " .
"values (" . $values . ")";
$this->setSql($sql);
$this->execute();
$this->colseConn();
}


有了这段添加的代码,不管我吗创建多少个模型class只要来调用就很容易实现了,是不是有点像hibernate呢,呵呵。

如有疑问:联系QQ:572389066

原创粉丝点击