前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >php自动加载

php自动加载

作者头像
码缘
发布2020-07-21 10:03:53
2K0
发布2020-07-21 10:03:53
举报
文章被收录于专栏:PHP修行之路

平时总使用composer,反而对自动加载的知识有些陌生啦,重新梳理下php中自动加载的知识

首先php中定义一个类当使用的时候需要将包含改类的文件引用进来才可以使用,例如

这种情况下如果类文件少的话还可以,但是如果类文件多的话,一个个去 require 岂不是要烦死

php中给出了两种解决方法:

__autoload($className)【不推荐】

在php的低版本中支持使用 __autoload 函数来自动获取 new 关键后面的类名,然后根据类名再去加载相应的类文件,代码如下

运行结果

代码语言:javascript
复制
需要加载Student类的类文件
实例化Student类
需要加载Teacher类的类文件
实例化Teacher类

spl_autoload_register()

官方文档: https://www.php.net/manual/zh/function.spl-autoload-register.php

其实它与 __autoload 使用上的区别就是,这个函数可以注册多个自动加载函数。我们上面的例子可以改成这种

目录如下

sql_autoload_register() 除了支持自定义函数外还可以使用 类名:静态方法 的方式

随着项目的越来越复杂,我们会把不同的类放到不同的目录中,这时候就需要定义相应的加载函数加载到 spl_autoload_register() 中 项目结构及代码如下

代码语言:javascript
复制
<?php

define("DIR",dirname(__FILE__));

function autoload($className){
    echo "需要加载".$className."类的类文件".PHP_EOL;
    $file_path = str_replace('\\', DIRECTORY_SEPARATOR, DIR .'\\Controller\\'. $className).'.php';
    if(file_exists($file_path)){
        include $file_path;
    }
}

function autoload1($className){
    echo "需要加载".$className."类的类文件".PHP_EOL;
    $file_path = str_replace('\\', DIRECTORY_SEPARATOR, DIR .'\\Model\\'. $className).'.php';
    if(file_exists($file_path)){
        include $file_path;
    }
}

spl_autoload_register("autoload");
spl_autoload_register("autoload1");

new Student();
new Teacher();

这时候会发现很不方便,这个时候我们就需要引入命名空间

spl_autoload_register+命名空间

为每个类引入命名空间,然后在实例化一个对象的时候 注册函数中的 $className 会带上函数的命名空间路径,这样就避免了写多个注册函数的问题,示例如下:

目录结构没有变

Student.php

代码语言:javascript
复制
<?php
namespace Controller;

class Student{
    public function __construct()
    {
        echo "实例化Student类".PHP_EOL;
    }
}

Teacher.php

代码语言:javascript
复制
<?php
namespace Model;

class Teacher{
    public function __construct()
    {
        echo "实例化Teacher类".PHP_EOL;
    }
}

index.php

代码语言:javascript
复制
<?php
use Controller\Student;
use Model\Teacher;

define("DIR",dirname(__FILE__));

function autoload($className){
    echo "需要加载".$className."类的类文件".PHP_EOL;
    // DIRECTORY_SEPARATOR php中内置目录分隔符
    $file_path = str_replace('\\', DIRECTORY_SEPARATOR, DIR .'\\'. $className).'.php';
    include $file_path;
}

spl_autoload_register("autoload");

new Student();
new Teacher();

运行结果

代码语言:javascript
复制
需要加载Controller\Student类的类文件
/home/www/pdemo/demo/Controller/Student.php
实例化Student类
需要加载Model\Teacher类的类文件
/home/www/pdemo/demo/Model/Teacher.php
实例化Teacher类
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • spl_autoload_register()
  • spl_autoload_register+命名空间
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档