• PHP面向对象之自动加载类


    自动加载类

    • 概念

      • 在项目开发中,因为一个文件中只能写一个类
      • 并且在执行过程中会有很多的类参与
      • 如果一个一个的加载很麻烦
      • 所以,就需要一个机制实现在PHP执行过程中自动加载需要的类
    • 类的规则

      • 一个文件中只能放一个类(必须)
      • 文件名和类名同名(必须)
      • 类文件以.class.php结尾(不是必须)

    手动加载类

    # Goods.class.php
    <?php
    //商品类
    abstract class Goods {
    	protected $name;
    	final public function setName($name) {
    		$this->name=$name;	
    	}
    	public abstract function getName();
    }
    ?>
    
    # Book.class.php
    <?php
    //图书类
    class Book extends Goods {
    	public function getName() {
    		echo "《{$this->name}》<br>";
    	}
    }
    ?>
    
    # Phone.class.php
    <?php
    //电话类
    class Phone extends Goods {
    	public function getName() {
    		echo $this->name,'<br>';
    	}
    }
    ?>
    
    # index.php
    <?php
    require './Goods.class.php';    //手动加载类文件
    require './Book.class.php';		  //手动加载类文件
    require './Phone.class.php';	  //手动加载类文件
    //测试
    $book=new Book();
    $book->setName('PHP和MySQL Web开发');
    $book->getName();
    $phone=new Phone();
    $phone->setName('华为 荣耀30');
    $phone->getName();
    ?>
    

    自动加载类

    • 概念
      • 当缺少类的时候自动的调用__autoload()函数
      • 并且将缺少的类名作为参数传递给__autoload()
      • __autoload()函数在PHP7.2以后就不支持了
    <?php
    function __autoload($class_name) {
    	require "./{$class_name}.class.php";
    }
    //测试
    $book=new Book();
    $book->setName('PHP和MySQL Web开发');
    $book->getName();
    $phone=new Phone();
    $phone->setName('华为 荣耀30');
    $phone->getName();
    ?>
    

    注册加载类

    • 概念
      • 通过spl_autoload_register()注册__autoload()函数
      • spl_autoload_register()可以注册多个自动加载函数
      • PHP5.1以后就开始支持此函数
    <?php
    # 方法一:
    /*
    //加载类函数
    function loadClass($class_name) {
    	require "./{$class_name}.class.php";
    }
    //注册加载类函数
    spl_autoload_register('loadClass');
    */
    # 方法二:
    spl_autoload_register(function($class_name){
    	require "./{$class_name}.class.php";
    });
    //测试
    $book=new Book();
    $book->setName('PHP和MySQL Web开发');
    $book->getName();
    $phone=new Phone();
    $phone->setName('华为 荣耀30');
    $phone->getName();
    ?>
    
    <?php
    function load1($class) {
    	require "./{$class}.class.php";
    }
    function load2($class) {
    	require "./{$class}.php";
    }
    function load3($class) {
    	require "./{$class}.fun.php";
    }
    spl_autoload_register('load1');
    spl_autoload_register('load2');
    spl_autoload_register('load3');
    ?>
    

    类文件存储不规则的加载方法

    • 概念
      • 将类名和文件地址做一个映射,组成一个关联数组
      • 在项目中,绝大部分都是规则存储的,不规则的比较少
    $map=array(
      //类名	=>	类文件地址
    	'Goods'	=>	'./aa/Goods.class.php',
    	'Book'	=>	'./bb/Book.class.php',
    	'Phone'	=>	'./cc/Phone.class.php'
    );
    
    <?php
    spl_autoload_register(function($class_name){
    	//类名和文件地址映射成一个关联数组
    	$map=array(
    		'Goods'	=>	'./Goods.class.php',
    		'Book'	=>	'./Book.class.php',
    		'Phone'	=>	'./Phone.class.php'
    	);
    	//在映射数组中找到就包含
    	if(isset($map[$class_name]))
    		require $map[$class_name];
    });
    //测试
    $book=new Book();
    $book->setName('PHP和MySQL Web开发');
    $book->getName();
    $phone=new Phone();
    $phone->setName('华为 荣耀30');
    $phone->getName();
    ?>
    
  • 相关阅读:
    QEMU内存分析(四):ept页表构建
    virtio简介(二) —— virtioballoon guest侧驱动
    将数据库所有的表的字符集改为utf8
    windows 10 mysql 安装
    Windows10 安装MySQL详细教程2020版 亲测亲写
    发现了一个可以免费下载jar包的网站,所有jar包都有
    我的新书《Flink大数据分析实战》出版啦
    2022最新 Navicat Premium 16中文软件激活安装永久使用正版(支持MAC+win)
    Adobe全家桶PS、PR、AU等2022正版永久有效,无需破解直接安装就能用
    虚拟机问题:VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行
  • 原文地址:https://www.cnblogs.com/SharkJiao/p/14117149.html
Copyright © 2020-2023  润新知