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 相关文章推荐
phpfans留言版用到的install.php
Jan 04 PHP
php全排列递归算法代码
Oct 09 PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
Apr 28 PHP
php while循环得到循环次数
Oct 26 PHP
PHP Session机制简介及用法
Aug 19 PHP
PHP中判断文件存在使用is_file还是file_exists?
Apr 03 PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
Sep 13 PHP
php 数据结构之链表队列
Oct 17 PHP
搜索附近的人PHP实现代码
Feb 11 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
Apr 30 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
Aug 14 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
Dec 29 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
《一拳超人》埼玉一拳下去,他们存在了800年毫无意义!
2020/03/02 日漫
php中判断文件空目录是否有读写权限的函数代码
2012/08/07 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
php使用curl抓取qq空间的访客信息示例
2014/02/28 PHP
php读取3389的脚本
2014/05/06 PHP
PHP实现算式验证码和汉字验证码实例
2015/03/09 PHP
PHP自定义函数获取URL中一级域名的方法
2016/08/23 PHP
Laravel5.5 视图 - 创建视图和数据传递示例
2019/10/21 PHP
利用jQuary实现文字浮动提示效果示例代码
2013/12/26 Javascript
jquery validate 自定义验证方法介绍 日期验证
2014/02/27 Javascript
AngularJS入门教程(一):静态模板
2014/12/06 Javascript
Vue 项目中遇到的跨域问题及解决方法(后台php)
2018/03/28 Javascript
js实现滑动进度条效果
2020/08/21 Javascript
js实现数字跳动到指定数字
2020/08/25 Javascript
react-native 实现购物车滑动删除效果的示例代码
2021/01/15 Javascript
[02:26]2018DOTA2亚洲邀请赛赛前采访-Newbee篇
2018/04/03 DOTA
[03:17]史诗级大片应援2018DOTA2国际邀请赛 致敬每一位坚守遗迹的勇士
2018/07/20 DOTA
使用python绘制人人网好友关系图示例
2014/04/01 Python
Python数组条件过滤filter函数使用示例
2014/07/22 Python
python读取和保存图片5种方法对比
2018/09/12 Python
Python Django简单实现session登录注销过程详解
2019/08/06 Python
解决Python设置函数调用超时,进程卡住的问题
2019/08/08 Python
pycharm 添加解释器的方法步骤
2020/08/31 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
2021/01/28 Python
仓库班组长岗位职责
2013/12/12 职场文书
优秀的毕业生的自我评价
2013/12/12 职场文书
小学教师办公室制度
2014/02/03 职场文书
认识深刻的检讨书
2014/02/16 职场文书
导游个人求职信范文
2014/03/23 职场文书
行政专员岗位职责说明书
2014/07/30 职场文书
初三毕业评语
2014/12/26 职场文书
2015年度校学生会工作总结报告
2015/05/23 职场文书
外科护士长工作总结
2015/08/12 职场文书
使用SQL实现车流量的计算的示例代码
2022/02/28 SQL Server
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL
mysql通过group by分组取最大时间对应数据的两种有效方法
2022/09/23 MySQL