一、引子
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();