zoukankan      html  css  js  c++  java
  • php自动加载

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

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

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

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

    __autoload($className)【不推荐】

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

    运行结果

    需要加载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() 中 项目结构及代码如下

    <?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

    <?php
    namespace Controller;
    
    class Student{
        public function __construct()
        {
            echo "实例化Student类".PHP_EOL;
        }
    }

    Teacher.php

    <?php
    namespace Model;
    
    class Teacher{
        public function __construct()
        {
            echo "实例化Teacher类".PHP_EOL;
        }
    }

    index.php

    <?php
    use ControllerStudent;
    use ModelTeacher;
    
    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();

    运行结果

    需要加载ControllerStudent类的类文件
    /home/www/pdemo/demo/Controller/Student.php
    实例化Student类
    需要加载ModelTeacher类的类文件
    /home/www/pdemo/demo/Model/Teacher.php
    实例化Teacher类
  • 相关阅读:
    hdu1050 Moving Tables
    初读《数学之美》........................(2)
    初读《数学之美》........................(1)
    zju1058 Currency Exchange
    hdu 2391 Filthy Rich
    hdu1029 Ignatius and the Princess IV(统计)
    hdu1072 Nightmare (BFS)
    apache2.2 + tomcat 6 集群
    权限管理系统实现:
    设置页面那些ID对应的对象隐藏setDisplay
  • 原文地址:https://www.cnblogs.com/itsuibi/p/13340368.html
Copyright © 2011-2022 走看看