当前位置: 首页 > news >正文

类的自动加载

1、__autoload()

  当编写面向对象的代码时,人们经常习惯于把每一个类放到它自己的源文件中。这样做的好处是可以很轻松地找到类在哪里,而且这样还可以将包含的代码数量最小化,因为你只须引入实际需要的类。

  缺陷:你不得不经常包含大量的源文件,而且经常导致包含太多的文件和一个头疼的代码维护问题。

  

  如果你定义一个__autoload()函数(每一个应用只能有一个这样的函数),而且当你访问一个还未存在的类时,它将被调用并且把类的名字作为它的参数,这样就给你一个实时包含类的可能性。如果你成功地包含了该类,你的源代码会继续执行,就像这个类已经定义了一样。如果你没有成功地包含该类,脚本引擎会产生一个类不存在的严重错误。

MyClass.php

<?php 
class MyClass{
    function printHelloWorld(){
        print "Hello,Wolrld\n";
    }
}
?>

general.inc

<?php 
function __autoload($class_name){
    //载入web服务器的根目录下demo/目录种的指定类名
    $class_name=strtolower($class_name);    //统一将类名转变为小写
    require_once($_SERVER['DOCUMENT_ROOT']."/demo/$class_name.class.php");
}
?>

main.php

<?php 
/**
*只要MyClass.php存在于Web服务器的根目录下面的demo/目录中,代码将打印Hello,World
*/
require_once "general.inc";
$obj =new MyClass();
$obj->printHelloWorld();
?>

在这个例子中,MyClass.php并没有真正包含于main.php文件中,而是通过将__autoload()函数定义在一个文件中,并在你所有的主脚本文件中包含它,如本例子中的general.inc文件,从而当你需要调用的类时,暗中调用__autoload()函数包含进来,从而可以节省大量的代码而且可以减少维护代码的工作量。

 

 

 

2、spl_autoload_register()

  __autoload()可以实现自动加载类,但有一个致命的缺陷,就是整个应用中只能有一个__autoload()函数,如上例子中,类只能存放于web服务器下的demo目录中,类名才会自动被加载。

  spl_autoload_register()弥补了函数__auotload()的缺陷,可以将整个应用中定义多个__autoload()函数。

  如果在你的程序中已经使用了__autoload()函数,那么__autoload()函数必须显示注册到__autoload()队列中。

  

  为了在框架中实现自动加载类名,通常我们命名类名都以XXX再加上.class.php形式来保存,比如XXXController.class.php来表示XXX的控制器,XXXModel.class.php来表示XXX的模型类。

第一种方法:

<?php 
/**
*使用spl_autoload_resigter实现自动加载
*在MVC框架中,类名通常放置在框架目录中,这些目录与应用程序无关,这些目录是固定的。然后通过file_exists()函数判断类名是否存在,将自动触发spl_autoload_register()函数。
*对于应用下的控制器和模型,都基于应用平台,通过平台分发参数来确定,一旦平台分发参数确定,那么子目录也可以确定。
*这里只简单介绍spl_autoload_register()函数定义和使用
*
*自动加载Controller和Model类
*如果是控制器,则从Controller目录加载类
*如果是模型类,则从Model目录记载类
*/
function my_autoload($class_name){
    //截取类名后10个字符,与Controller比较,如果相等,说明是控制器
    if(substr($class_name,strtpos($class_name,-10))=='Controller'){
        require_once './Controller/'.$class_name.'.class.php';
    }elseif(substr($class_name,strtpos($class_name,-5))=='Model'){    //如果类名后5个字符,与Model比较,如果相等,说明是模型类
        require_once './Model/'.$class_name.'.class.php';
    }
}
spl_autoload_register('my_autoload');
?>

 

上面这种方法可以演变成匿名函数书写形式:

<?php 
spl_autoload_register(function($class_name){
    if(substr($class_name,-10)=='Controller'){
        require_once './Controller/'.$class_name.'.class.php';
    }elseif(substr($class_name,-5))=='Model'){
        require_once './Model/'.$class_name.'.class.php';
    }
});
?>

 

 

  

  

转载于:https://www.cnblogs.com/mnhome/p/9872728.html

相关文章:

  • 【DP复习】背包 ovo
  • CSS3 Transform变形(3D转换)
  • Python——数据存储:XML操作
  • python 求助!
  • OpenGL step by step 38 : Skeletal Animation with Assimp
  • 顺为资本第四期美元基金募集完成 规模12.1亿美元
  • 【经验分享】:如何将PDF格式的文件进行翻译
  • 当奶猫来敲门
  • Jquery attr()方法 属性赋值和属性获取
  • [译] Google 工程师提升网页性能的新策略:空闲执行,紧急优先
  • 程序员的炼金术,如何用技术变现
  • java中如何使用Junit测试
  • 马斯克放大招!直逼高铁时速的240km h汽车隧道挖成了!
  • 书摘—松下幸之助全传
  • [洛谷P3567][POI2014]KUR-Couriers
  • [译]如何构建服务器端web组件,为何要构建?
  • Android单元测试 - 几个重要问题
  • Android框架之Volley
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • canvas 五子棋游戏
  • Computed property XXX was assigned to but it has no setter
  • exif信息对照
  • gulp 教程
  • jquery ajax学习笔记
  • nodejs实现webservice问题总结
  • Promise面试题2实现异步串行执行
  • Redis中的lru算法实现
  • REST架构的思考
  • VuePress 静态网站生成
  • Zsh 开发指南(第十四篇 文件读写)
  • 好的网址,关于.net 4.0 ,vs 2010
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 消息队列系列二(IOT中消息队列的应用)
  • 译米田引理
  • 中文输入法与React文本输入框的问题与解决方案
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • # 飞书APP集成平台-数字化落地
  • ###STL(标准模板库)
  • #define,static,const,三种常量的区别
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (LeetCode C++)盛最多水的容器
  • (一)为什么要选择C++
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • *上位机的定义
  • .bat批处理出现中文乱码的情况
  • .NET 材料检测系统崩溃分析
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET基础篇——反射的奥妙
  • .NET命名规范和开发约定
  • @Transaction注解失效的几种场景(附有示例代码)
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [20180224]expdp query 写法问题.txt