PHP 实例化类的一点摘记


Posted in PHP onMarch 23, 2008

下面是调用一个模型(Module)的函数。这个函数的基本功能是指定一个模型(抽象化为类)的名称,然后它会在模型目录下面寻找这个类的脚本实例化以后返回。这样的做法有一点好处就是载入和实例化是自动的,你可以获得最大的灵活性。下面请看下面的代码,它并不长而且不复杂:

function &load_class($class_name, $param = null, $instantiate = true)
{
    static $objects = array();

    $class_name = ucfirst(strtolower($class_name));
    if (isset($objects[$class_name])) {
        return $objects[$class_name];
    }

    $class_file = DIR_MODELS . "/{$class_name}.inc.php";
    if (file_exists($class_file)) {
        require_once $class_file;

        if (!class_exists($class_name)) {
            return false;
        } else {
            $objects[$class_name] =& new $class_name($param);
            return $objects[$class_name];
        }

    }  else {
        if ($instantiate) {
            $objects[$class_name] = null;
        } 
        return null;
    }
}函数只有三个参数,分别是 $class_name 、$param 以及 $instaniate ,其中 $param 是构造函数的参数,$instaniate 是可选的。请注意函数中的 $objects 数组是一个静态变量,也就是当调用完这个函数的时候数组并不会释放,下次调用此函数时这个数组的数据是会保存的。这样做的好处就是可以将大部分的类实例了以后,如需要重复调用则直接返回这个类的实例就可以了,避免了重复调用,提高了性能。代码如下:

    static $objects = array();

    if (isset($objects[$class_name])) {
        return $objects[$class_name];
    }其它继续的代码就是检测是否有这个类名称的文件,如果有载入这个文件并寻找指定名称的类,如找到了这个类以后就实例化。这要求脚本中类的名称必须和脚本的文件名是一致的。我想这也有利于以后的代码管理。

$instaniate 参数这个时候就发挥了功效,这个参数会告诉函数如果未找到则在 $objects 下面做一个标记位(null)避免函数又重复的寻找文件名并重复载入和寻找。

    $class_file = DIR_MODELS . "/{$class_name}.inc.php";
    if (file_exists($class_file)) {
        require_once $class_file;

        if (!class_exists($class_name)) {
            return false;
        } else {
            $objects[$class_name] =& new $class_name($param);
            return $objects[$class_name];
        }

    }  else {
        if ($instantiate) {
            $objects[$class_name] = null;
        } 
        return null;
    }其中语句:

$objects[$class_name] =& new $class_name($param);可以多次的推敲一下。$class_name 在函数中是一个字符串变量。关键字 new 可以动态的实例化指定字符串的类(如果存在的话)。有关此调用方法可以参见 PHP 手册和这里。

此函数的不足之处就是如何去考虑传递不同个数的参数给每个不同的类的构造函数。或许可以使用 call_user_func_array 等函数实现,但是这样的做法非常的不 Grace。在这里需要推敲一下。其实 file_exists 等文件存在的测试可以交给 __autoload 函数处理,不过由于其他的函数比如 interface_exists 等也会调用 __autolaod 函数,出于兼容性的考虑,所以只在函数内做一个简单的测试。

PHP5 相对 PHP4 而言更加的面向对象。我想是时候更新我们我们的编码思想了。有关 PHP5 的类和对象,这里有一个非常好的教程。

PHP 相关文章推荐
PHP的宝库目录--PEAR
Oct 09 PHP
解决控件遮挡问题:关于有窗口元素和无窗口元素
Jan 28 PHP
php入门之连接mysql数据库的一个类
Apr 21 PHP
单点登录 Ucenter示例分析
Oct 29 PHP
PHP用反撇号执行外部命令
Apr 14 PHP
PHP的全局错误处理详解
Apr 25 PHP
Yii+upload实现AJAX上传图片的方法
Jul 13 PHP
PHP实现对二维数组某个键排序的方法
Sep 14 PHP
PHP数组的定义、初始化和数组元素的显示实现代码
Nov 05 PHP
Laravel框架实现的记录SQL日志功能示例
Jun 19 PHP
PHP fprintf()函数用法讲解
Feb 16 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
May 02 PHP
深思 PHP 数组遍历的差异(array_diff 的实现)
Mar 23 #PHP
附件名前加网站名
Mar 23 #PHP
由php if 想到的些问题
Mar 22 #PHP
php实现mysql数据库备份类
Mar 20 #PHP
php 常用字符串函数总结
Mar 15 #PHP
php str_replace的替换漏洞
Mar 15 #PHP
PHP执行速率优化技巧小结
Mar 15 #PHP
You might like
Memcache 在PHP中的使用技巧
2010/02/08 PHP
用PHP ob_start()控制浏览器cache、生成html实现代码
2010/02/16 PHP
php递归使用示例(php递归函数)
2014/02/14 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
2014/06/23 PHP
PHP使用header()输出图片缓存实例
2014/12/09 PHP
Zend Framework框架中实现Ajax的方法示例
2017/06/27 PHP
解决laravel中日志权限莫名变成了root的问题
2019/10/17 PHP
基于jquery的无缝循环新闻列表插件
2011/03/07 Javascript
jquery 插件学习(三)
2012/08/06 Javascript
js获取当前页面路径示例讲解
2014/01/08 Javascript
js 日期比较相关天数代码
2014/04/02 Javascript
javascript的函数作用域
2014/11/12 Javascript
JavaScript通过prototype给对象定义属性用法实例
2015/03/23 Javascript
Vue开发之封装分页组件与使用示例
2019/04/25 Javascript
vue项目初始化到登录login页面的示例
2019/10/31 Javascript
《javascript设计模式》学习笔记五:Javascript面向对象程序设计工厂模式实例分析
2020/04/08 Javascript
Vue使用自定义指令实现拖拽行为实例分析
2020/06/06 Javascript
vue element-ui中table合计指定列求和实例
2020/11/02 Javascript
js回到页面指定位置的三种方式
2020/12/17 Javascript
js面向对象方式实现拖拽效果
2021/03/03 Javascript
[02:08:58]2014 DOTA2国际邀请赛中国区预选赛 Ne VS CIS
2014/05/22 DOTA
对python append 与浅拷贝的实例讲解
2018/05/04 Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
2019/12/13 Python
pytorch 准备、训练和测试自己的图片数据的方法
2020/01/10 Python
Tensorflow获取张量Tensor的具体维数实例
2020/01/19 Python
Python 读取xml数据,cv2裁剪图片实例
2020/03/10 Python
html5+CSS3+JS实现七夕言情功能代码
2017/08/28 HTML / CSS
Yves Rocher捷克官方网站:植物化妆品的创造者
2019/07/31 全球购物
军校制空专业毕业生自我鉴定
2013/11/16 职场文书
给实习单位的感谢信
2014/02/01 职场文书
党员公开承诺书范文
2014/03/25 职场文书
竞选大队干部演讲稿
2014/09/11 职场文书
2014年销售内勤工作总结
2014/12/01 职场文书
上甘岭观后感
2015/06/10 职场文书
奥巴马开学演讲观后感
2015/06/12 职场文书
《活见鬼》教学反思
2016/02/24 职场文书