php面向对象——类的自动加载

手动加载 link

  • include ; include_once
  • require ; require_once
  • include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的
  • require 如果引入的文件不存在,生成一个致命错误,在错误发生后脚本会停止执行
  • include 如果引入的文件不存在,生成一个警告,在错误发生后脚本会继续执行
  • _once 的作用:只引入1次,如果之前已经引用过,不再重复引用
include("./sub.php");       // 就相当于把 sub.php 里的代码替换到这里
t();

// include_once     // 相同文件仅能引入一次

include_once ("./sub.php");       // 就相当于把 sub.php 里的代码替换到这里
include_once ("./sub.php");       // 无效
t();

自动加载的意义

  • 开发中,一个类对应一个文件,其命名方式为 类名.class.php
  • 如果一个文件中使用很多个类,手动加载很麻烦,并且灵活性差,不利于维护

类的自动加载

__autoload 尝试加载未定义的类

  • 使用一个未定义的类时,系统会自动调用__autoload函数
  • 需要某个类时加载,不需要时永远不会加载
/*
    @function 完成类的自带加载
    @param: $class_name 是类的名称
    @说明:当程序员使用一个未定义的类时,系统会自动调用__autoload函数,该函数时系统提供的
 */
function __autoload($class_name){
    echo $class_name;
    require '../'.$Cat.'.php';
}

$cat = new Cat();

__autoload 加载不同文件夹下的类

  • 上面的代码将自动加载路径写死了,要加载不同路径的类怎么办?
  • 新建一个common.php文件,将类名和路径的映射关系用数组定义好
// 新建一个common.php文件,将类名和路径的映射关系用数组定义好

require './common.php';

/*
$class_map = array(
    'Dog' => './Dog.class.php',
    'Cat' => './Cat.class.php',
    'Pig' => './model/Pig.class.php'
)
*/ 

// __autoload函数是系统提供的
function __autoload($class_name){
	global $class_map;	// 声明使用全局变量  作用域问题
    require $class_map[$class_name];
}

spl_autoload_register() 以更加灵活的方式来实现类的自动加载

  • 与__autoload的区别就是,可以灵活的注册你自己的自动加载函数
  • 不再建议使用 __autoload() 函数,在以后的版本中它可能被弃用
require './common.php';

/*
$class_map = array(
    'Dog' => './Dog.class.php',
    'Cat' => './Cat.class.php',
    'Pig' => './model/Pig.class.php'
)
*/

// spl_autoload_register() 可以灵活的注册你自己的自动加载类,这里注册之后my_autoload函数才会自动调用
spl_autoload_register('my_autoload');

// my_autoload函数是用户自定义的
function my_autoload($class_name){
    global $class_map;
    require $class_map[$class_name];
}

思考问题

function __autoload($class_name){
    echo $class_name;
    // require '../'.$Cat.'.php';
    class Cat{
        public function say(){
            echo '喵喵喵';
        }
    }
}
$cat = new Cat();
$cat->say();

问题1:类不是在函数内声明的吗?为何在函数外部可以调用?
-------类声明是全局有效的,不管是在多深的函数下声明的类
问题2:函数内部竟然也可以写类?
-------函数内部可以写任何合法的php代码,包括再声明一个函数类
问题3:函数需要调用才会执行内部代码!
-------这里未写调用是因为使用一个未定义的类时,__autoload函数会自动被调用,调用后内部的类才会声明
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值