<?php
class a {
......
function a1() {
include_once ROOT_PATH . 'lib/db.php';
$db = new db();
$res = $db->get_array('select * from table');
......
}
......
}
?>
很平常的一段代码不是吗?相信大家也都写过类似的东西,我以前也写过很多。由于我是一个懒人,懒到不想多打几个字,于是我很讨厌每次都要手工去new一下那个对象,这得让我多打多少个字啊,累啊。于是我就在想,怎么能让php自己去对某个对象进行初始化呢?
古人教导我们“书中自有颜如玉,书中自有黄金屋,书中自有偷懒法……”你说什么?没有最后那句?哦,好吧,那是我加的- -! 反正多看看书没坏处啦,你问什么书?当然是php手册啦,其他的书我基本没看过,主角是未央生那本算是看过……
言归正传啊,我就拿着手册看啊、看啊、看啊,终于,我找到了一个魔术方法,__get()
很符合我的要求嘛,不错不错,接下来需要做的就是思考,如何来做呢?第一次,我将代码写成了这样:
<?php
class a {
......
public function __get($name) {
$name = strtolower(trim($name));
$file = ROOT_PATH . 'lib/' . $name . '.php';
if(is_file($file)) {
include_once $file;
$obj = new $name;
return $obj;
} else {
die('no file');
}
}
function a1() {
$res = $this->db->get_array('select * from table');
......
}
......
}
?>
但是很快,我发现不对劲了,每执行一次$this->db的时候都会重新new一个对象出来,这可不行,用的多了,内存不是全完蛋了?于是我又想到了单件模式,略加思考得出了以下的版本:
<?php
class a {
......
public function __get($name) {
static $instances = array();
$name = strtolower(trim($name));
$instance = null;
if (!array_key_exists($name, $instances)) {
$file = ROOT_PATH . 'lib/' . $name . '.php';
if(is_file($file)) {
include_once $file;
$instances[$name] = new $name;
} else {
die('no file');
}
}
$instance = $instances[$name];
return $instance;
}
function a1() {
$res = $this->db->get_array('select * from table');
......
$this->tpl->assign('res', $res);
}
......
}
?>
太爽了,不是么?只要类名和它自己的文件名相同,并且放在指定的目录下,我就可以不用去include,不用去new,使用的时候直接 $this->类名->类中的方法/属性 偷懒成功了!我相信不少朋友肯定想到了进一步偷懒的方法对吧?伟大的谁谁谁曾经说过,“不会偷懒的程序员不是一个好的程序员”,所以让大家一起开动脑筋,想出更多偷懒的办法来吧。转载于:https://blog.51cto.com/quxiaozuzhou/407793