php 实例化类 的含义,PHP 实例化类的一点摘记

PHP 实例化类的一点摘记

更新时间:2008年03月23日 18:22:18   作者:

最近在编写 Grace PHP5 Framework 中,我得到很多类的实例化的心得。Grace PHP5 Framework 是一个完全基于 MVC 架构的框架,具有良好的扩展性。它对于类的调用可以说非常的灵活。

下面是调用一个模型(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 的类和对象,这里有一个非常好的教程。

相关文章

1a1b05c64693fbf380aa1344a7812747.png

这篇文章主要介绍了Laravel框架用户登陆身份验证实现方法,结合实例形式分析了Laravel框架用户登陆验证的原理、实现方法与相关注意事项,需要的朋友可以参考下2017-09-09

4f55910a645b073bc4fc65dc10dc14bd.png

本文给大家介绍PHP实现四种基础排序算法的运行时间比较,非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧2016-08-08

0ea3c7666119d5615e582f823fb3fad6.png

本篇文章介绍了,基于Zend的Config机制的应用分析。需要的朋友参考下2013-05-05

4f96a78db829b1556ff16de21e013c7a.png

这篇文章主要介绍了thinkphp5.1框架实现格式化mysql时间戳为日期的方式,结合实例形式分析了thinkPHP针对mysql时间戳格式转换的相关操作技巧,需要的朋友可以参考下2019-10-10

8cc1031babc6aff2319f1c6af8544aa0.png

这篇文章主要介绍了Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法,需要的朋友可以参考下2014-06-06

0c932a99bb7b6f23c937db507070cc7b.png

下面小编就为大家带来一篇PHP list() 将数组中的值赋给变量的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2016-06-06

cca732bf65a93ed2ec0ac80c638460fe.png

这篇文章主要给大家介绍了关于Laravel如何自定义command命令的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Laravel具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧2019-03-03

2d9f31f2af7b675a3d153d2b7f1035a7.png

include和require的用途是包含并运行指定的文件。在官方手册没有说明被包含的文件类型,那么PHP到底能不能include一个非PHP文件呢?2014-04-04

b452cee8ec5cd9e58ab98eba17281e59.png

今天小编就为大家分享一篇php从数据库中获取数据用ajax传送到前台的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2018-08-08

f4838ec7e2d4da28e0b57d4e852dadd4.png

这篇文章主要介绍了ThinkPHP3.1查询语言,需要的朋友可以参考下2014-06-06

最新评论

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值