时间:2021-05-26
下面是调用一个模型(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)){
returnfalse;
}else{
$objects[$class_name]=&new$class_name($param);
return$objects[$class_name];
}
}else{
if($instantiate){
$objects[$class_name]=null;
}
returnnull;
}
}函数只有三个参数,分别是$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)){
returnfalse;
}else{
$objects[$class_name]=&new$class_name($param);
return$objects[$class_name];
}
}else{
if($instantiate){
$objects[$class_name]=null;
}
returnnull;
}其中语句:
$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的类和对象,这里有一个非常好的教程。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了Java类的初始化。分享给大家供大家参考,具体如下:一点睛1下面6种方式,系统会初始化该类或接口。创建类的实例。为某个类创建实例的方式包括使用ne
本文实例讲述了Java多态用法与注意点。分享给大家供大家参考,具体如下:一点睛向上转型:或者称为向父类转型。父类的对象通过子类对象实例化,实际上就是对象的向上转
本文实例讲述了php反射学习之不用new方法实例化类操作。分享给大家供大家参考,具体如下:上一篇php反射入门示例简单介绍了php反射的几个常见类的使用方法,但
本文实例讲述了Java类的加载连接和初始化。分享给大家供大家参考,具体如下:一点睛1类加载当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过加载、连
本文实例讲述了Java子类对象的实例化过程。分享给大家供大家参考,具体如下:一点睛子类对象在实例化时,子类对象会默认先调用父类中的无参构造函数,然后再调用子类构