偷懒万岁-让PHP自己初始化类

(本文于2010.10.01发表在 《草根》杂志 第四期)

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值