一、引子

laravel这个优雅的框架很值得学习,特别是其中一些优秀的设计,平时总会对其中某些功能的实现很好奇,这篇文章好奇的是如下:
引子

二、概念

laravel的基本自动加载功能包含了 命名空间、注册自动加载、包含文件。

1、命令空间

命令空间是php引入的一种特性,类似文件目录路径,将代码划分成不同空间,类名互相独立互不冲突,用于解决文件引入冲突;
命令空间namespace需要声明在文件最前面;
命令空间use一般是用来引入类,无法引入函数,因为自动加载spl_autoload_register是在类未找到时触发,调用函数不触发;
两个有命令空间的文件互相引入彼此的类,中间的桥梁是通过"注册自动加载、包含文件"。

2、注册自动加载

new对象时,如果找不到类则自动调用全局函数__autoload()(高版本弃用),spl_autoload_register支持多种注册方式、批量注册

3、包含文件
require、include、require_once、include_once,网上内容很多请自行搜索。

三、逻辑导图

逻辑导图

四、代码模拟

a.php、b.php、c.php三个文件都在同一目录下,分别命令空间a、命名空间b、桥梁c。

c.php

<?php
//__autoload() is Deprecated,采用spl_autoload_register注册自动加载
spl_autoload_register(function($classname){
   //$classname会自动加上当前的命名空间,laravel是将命令空间做为目录路径来加载类文件
   include_once(explode('\\',$classname)[0].".php" );
 });

a.php

<?php
namespace a;

include_once "c.php";

class a{
   function testA(){
      echo "A";
    }
}
/**********************************************************/
//这里引入b
use b\b;
$t = new b();
echo $t->testB();

b.php

<?php
namespace  b;
  
include_once "c.php";

class b{

  function testB(){
    echo "B";
  }
  
}

/**********************************************************/
//这里引入b
use a\a;
$t = new a();
echo $t->testA();

sengerlion
55 声望401 粉丝

了解自己到细胞粒度。