PHP类的自动载入机制

php的自动加载:

在php5以前,我们要用某个类或类的方法,那必须include或者require,之后才能使用,每次用一个类,都需要写一条include,麻烦

php作者想简单点,最好能引用一个类时,如果当前没有include进来,系统能自动去找到该类,自动引进~

于是:__autoload()函数应运而生。

通常放在应用程序入口类里面,比如discuz中,放在class_core.php中。

先讲浅显的例子:

第一种情况:文件A.php中内容如下

<?php

class A{

  public function __construct(){

         echo ‘fff‘;

  }

}

?>

文件C.php 中内容如下:

<?php   
function __autoload($class)   
{   
$file = $class . ‘.php‘;   
if (is_file($file)) {   
require_once($file);   
}   
}

$a = new A(); //这边会自动调用__autoload,引入A.php文件

?>

第二种情况:有时我希望能自定义autoload,并且希望起一个更酷的名字loader,则C.php改为如下:

<?php
function loader($class)
{
$file = $class . ‘.php‘;
if (is_file($file)) {
require_once($file);
}
}

spl_autoload_register(‘loader‘); //注册一个自动加载方法,覆盖原有的__autoload

$a = new A();

?>

第三种情况:我希望高大上一点,用一个类来管理自动加载

<?php   
class Loader   
{   
public static function loadClass($class)   
{   
$file = $class . ‘.php‘;   
if (is_file($file)) {   
require_once($file);   
}   
}   
}

spl_autoload_register(array(‘Loader‘, ‘loadClass‘));

$a = new A();

?>

当前为最佳形式。

通常我们将spl_autoload_register(*)放在入口脚本,即一开始就引用进来。比如下面discuz的做法。

if(function_exist(‘spl_autoload_register‘)){

  spl_autoload_register(array(‘core‘,‘autoload‘));  //如果是php5以上,存在注册函数,则注册自己写的core类中的autoload为自动加载函数

}else{

  function __autoload($class){         //如果不是,则重写php原生函数__autoload函数,让其调用自己的core中函数。

    return core::autoload($class);

  }

}

这段扔在入口文件最前面,自然是极好的~

转载:http://www.cnblogs.com/zhongyuan/p/3583201.html

时间: 2025-01-15 14:07:40

PHP类的自动载入机制的相关文章

深入理解PHP类的自动载入机制方法

第一种情况:文件A.php中内容如下 <?phpclass A{ public function __construct(){ echo 'fff'; }}?> 文件C.php 中内容如下: <?php function __autoload($class) { $file = $class . '.php'; if (is_file($file)) { require_once($file); } } $a = new A(); //这边会自动调用__autoload,引入A.php文

PHP 设计模式 笔记与总结(1)命名空间 与 类的自动载入

① PHP 面向对象高级特性 ② 11 种 PHP 设计模式 ③ PSR-0,Composer,Phar 等最流行的技术 目标是掌握 PHP 各类设计模式,以及具备设计纯面向对象框架和系统的能力 [命名空间] 早期 php 没有命名空间的概念,所有的代码可以被认为是在同一个命名空间内运行,因此不能出现名称相同的类或函数: php 5.3 增加了命名空间的概念. 例:加入一个项目下有 3 个文件: test1.php: <?php function test(){ echo __FILE__; }

【25】工具类实现自动载入与类

上一节中我们已经创建了相应的目录,但是我们发现我们创建的类并不能成功的跑起来,这是为什么呢?这主要是因为我们载入的类文件的位置不对造成的,我们之前是根据类名载入的是控制器,所以这里需要进行一下判断: private static function _autoload($className){ switch (true) { //判断是控制器 //Controller case strlen($className)>10 && substr($className, -10)=='Con

PHP——大话PHP设计模式——命名空间和类的自动载入

开发工具:phpstorm phpstudy 命名空间: 类的自动载入

PHP 类的命名空间 和自动载入

PHP 类的自动载入有两种方法,__autoload() 和 spl_autoload_register() ,就是在PHP代码中new一个类的时候,会自动触发,将类的类名包括命名空间作为参数传进入方法里,在方法里可根据命名空间和类名准确找到类文件,从而require或者inlcude进来.菜鸟一枚,作为备忘 <?php function auto($class){ //$class = A\B\E; /** 命名空间的自动载入 **/ $class_path = explode("\\&

php设计模式--命名空间与自动载入

关于命名空间: 最早的php是没有命名空间的概念的,这样不能存在相同名称的类或者函数,当项目变大了之后,产生冲突的可能性就高了,代码量也会变大,为了规划,从php5.3开始对命名空间就支持了. 说明代码: test1.php<?php //声明命名空间 namespace Test1; function test(){ echo "test1<br/>"; } test2.php <?php //声明命名空间 namespace Test2; function

Java虚拟机的类载入机制

Java虚拟机类载入过程是把Class类文件载入到内存.并对Class文件里的数据进行校验.转换解析和初始化,终于形成能够被虚拟机直接使用的java类型的过程. 在载入阶段,java虚拟机须要完毕下面3件事: a.通过一个类的全限定名来获取定义此类的二进制字节流. b.将定义类的二进制字节流所代表的静态存储结构转换为方法区的执行时数据结构. c.在java堆中生成一个代表该类的java.lang.Class对象,作为方法区数据的訪问入口. Java虚拟机的类载入是通过类载入器实现的, Java中

PHP的类文件自动加载机制

搜集于网络,学习php的类的自动加载机制,在实际大型项目中其重要性尤为突出. PHP的类自动加载机制 在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和require方法,去把定义这个class的文件包含进来.这个在小规模开发的时候,没什么大问题.但在大型的开发项目中,这么做会产生大量的require或者include方法调用,这样不因降低效率,而且使得代码难以维护,况且require_once的代价很大. 在PHP5之前,各个PHP框架如果要实现类的自动加载,一般

DexClassLoader和PathClassLoader类载入机制

0x00 在DexClassLoader和PathClassLoader载入Dex流程一文中,我们分析了dex文件怎样形成了DexFile结构体.本文中解说类载入机制,实际上就是生成ClassObject对象. 我们以DexClassLoader为例.解说类载入机制,PathClassLoader是一样的. 我们在载入类时一般会调用loadClass,那么我们就从loadClass来開始分析. 0x01 DexClassLoader类没有loadClass方法.所以调用的是父类ClassLoad