手动加载 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函数会自动被调用,调用后内部的类才会声明