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