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与javascript的两种交互方式
Oct 09 PHP
set_include_path在win和linux下的区别
Jan 10 PHP
php minixml详解
Jul 19 PHP
CodeIgniter上传图片成功的全部过程分享
Aug 12 PHP
php-fpm配置详解
Feb 12 PHP
yii上传文件或图片实例
Apr 01 PHP
php中base64_decode与base64_encode加密解密函数实例
Nov 24 PHP
php第一次无法获取cookie问题处理
Dec 15 PHP
详解Window7 下开发php扩展
Dec 31 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
Oct 17 PHP
调试php程序的简单步骤
Oct 04 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
Dec 18 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
如何对PHP程序中的常见漏洞进行攻击(上)
2006/10/09 PHP
php 正则 过滤html 的超链接
2009/06/02 PHP
PHP验证码类代码( 最新修改,完全定制化! )
2010/12/02 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
2016/05/09 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
php连接sftp的作用以及实例代码
2019/09/23 PHP
php判断IP地址是否在多个IP段内
2020/08/18 PHP
jQuery 使用手册(二)
2009/09/23 Javascript
JQuery live函数
2010/12/24 Javascript
jquery的键盘事件修改代码
2011/02/24 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
Bootstrap如何创建表单
2016/10/21 Javascript
Bootstrap基本组件学习笔记之分页(12)
2016/12/08 Javascript
bootstrap table 多选框分页保留示例代码
2017/03/08 Javascript
CSS3+JavaScript实现翻页幻灯片效果
2017/06/28 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
2018/07/10 Javascript
Angular ElementRef简介及其使用
2018/10/01 Javascript
小程序云开发部署攻略(图文教程)
2018/10/30 Javascript
vue中axios防止多次触发终止多次请求的示例代码(防抖)
2020/02/16 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
2020/10/30 Javascript
利用Python批量生成任意尺寸的图片
2016/08/29 Python
Python 在字符串中加入变量的实例讲解
2018/05/02 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
PyTorch预训练的实现
2019/09/18 Python
flask框架渲染Jinja模板与传入模板变量操作详解
2020/01/25 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
2020/10/12 Python
受希腊女神灵感的晚礼服、鸡尾酒礼服和婚纱:THEIA
2018/04/15 全球购物
女性时尚网购:Chic Me
2019/07/30 全球购物
施华洛世奇新加坡官网:SWAROVSKI新加坡
2020/10/06 全球购物
机械系大学毕业生推荐信
2013/11/27 职场文书
幼儿园家长会欢迎词
2014/01/09 职场文书
会务接待方案
2014/02/27 职场文书
2015年初中元旦晚会活动总结
2014/11/28 职场文书
工作表现证明
2015/06/15 职场文书
新闻通讯稿模板
2015/07/22 职场文书
python编程项目中线上问题排查与解决
2021/11/01 Python