PHP自动加载 spl

xiaoxiao2021-02-28  106

内容描述:      刚开始自学PHP的时候,一个功能类单独写一个文件,引入类文件时用 require_once "类文件路径";后来工作中接触thinkPHP3.2.3框架,发现框架中引入类文件的方式用的是 命名空间 配合 spl_autoload_register() 实现的自动加载;

一、无命名空间同一个目录下

目录结构: MyClass1.class.php文件内容: <?php class MyClass1 { function __construct() { echo 'This is MyClass1 <br>'; } } MyClass2.class.php文件内容: <?php class MyClass2 { function __construct() { echo 'This is MyClass2 <br>'; } } index.php文件内容: <?php //自动加载 spl_autoload_register(function ($class_name) { require_once $class_name . '.class.php’; }); $obj = new MyClass1(); $obj2 = new MyClass2(); echo 'END <br>’; 运行效果:https://www.httpsdomain.com/index.php This is MyClass1  This is MyClass2  END  OK

二、有命名空间,不在同一个目录中的类

目录结构如下: /Animal/Cat.class.php文件内容如下: <?php namespace Animal; class Cat { function __construct() { echo 'This is a Cat Class!<br>'; } } /Anima/Dog.class.php文件内容如下: <?php namespace Animal; class Dog { function __construct() { echo 'This is a Dog Class!<br>'; } } 如果不使用自动加载,按照原有的require_once,那么 /index.php文件内容如下: <?php require_once "Animal/Dog.class.php"; $dog = new Dog(); echo 'END <br>’; 如果使用自动加载,那么/index.php文件内容如下: <?php //自动加载 spl_autoload_register(function ($class_name) { $class_name = str_replace('\\','/', $class_name); /*将 use语句中的’\’替换成’/‘,避免造成转移字符导致require_once时会报错*/ require_once $class_name . '.class.php'; /*文件的后缀名是 .class.php*/ }); use Animal\Dog; $dog = new Dog(); echo 'END <br>’; 运行结果: 如果不在代码开头写 user Animal\Cat;那么在实例化类时,就必须写完整的类路径。/index.php文件内容如下: <?php //自动加载 spl_autoload_register(function ($class_name) { $class_name = str_replace('\\','/', $class_name); /*将 use语句中的’\’替换成’/‘,避免造成转移字符导致require_once时会报错*/ require_once $class_name . '.class.php’; /*文件的后缀名是 .class.php*/ }); use Animal\Dog; $dog = new Dog(); $cat = new \Animal\Cat(); echo 'END <br>'; 运行结果:

不同命名空间的类 不同路径的类文件

如/Logic/Activity/ActivityOne.class.php文件 与 /Animal/Dog.class.php文件,目录如下: /Logic/Activity/ActivityOne.class.php文件内容如下: <?php namespace Logic\Activity; class ActivityOne { function __destruct() { echo 'This is a ActivityOne Class!\Logic\Activity\ActivityOne.class.php<br>'; } } /index.php文件内容如下: <?php //自动加载 spl_autoload_register(function ($class_name) { $class_name = str_replace('\\', '/', $class_name); $file_name = $class_name . '.class.php'; if (file_exists($file_name)) { require_once $file_name; } }); use Animal\Dog; use Logic\Activity\ActivityOne; $dog = new Dog(); $A = new ActivityOne(); 运行结果:

注意

    1.命名空间与文件路劲的对应关系:如use Animal\Dog; Dog类的存放路径必须是在Animal文件夹中,否则引入文件是会报错找不到文件。     2.类文件的后缀名必须统一:如以’.class.php'结尾

转载请注明原文地址: https://www.6miu.com/read-66747.html

最新回复(0)