本文摘自CSDN乐知教育《草根》杂志第四期<?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->类名->类中的方法/属性 偷懒成功了!我相信不少朋友肯定想到了进一步偷懒的方法对吧?伟大的谁谁谁曾经说过,“不会偷懒的程序员不是一个好的程序员”,所以让大家一起开动脑筋,想出更多偷懒的办法来吧。