Laravel实现自动加载类的方法

  介绍

这篇文章将为大家详细讲解有关Laravel实现自动加载类的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

<强> Laravel如何实现自动加载类

Laravel使用的是作曲家的自动加载。

首先看供应商/自动装载。php文件

& lt; php ?//,autoload.php  @generated  by 作曲家   require_once  __DIR__ 只& # 39;/作曲家/autoload_real.php& # 39;;   return  ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3: getLoader ();

代码很少,查看__DIR__。& # 39;/作曲家/autoload_real.php& # 39;文件。有一个类ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3,该类的名字比较奇特,主要为了防止重名。回到上面的代码,可以看到调用了getLoader()方法;

<强>看一下部分代码

,, if  (null  !==, self:: $装载机),{   ,,return 自我::$装载机;   ,,}      spl_autoload_register才能(数组(& # 39;ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3& # 39;,, & # 39; loadClassLoader& # 39;),,真的,,真的);   自我::$ loader 才能=,loader 美元;=,new  \作曲家\自动装载\类加载器();   spl_autoload_unregister才能(数组(& # 39;ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3& # 39;,, & # 39; loadClassLoader& # 39;));

这里自动加载了当前类的loadClassLoader静态方法,该方法加载了__DIR__。& # 39;/ClassLoader.php& # 39;文件,该文件中的类起到了整个框架类自动加载的作用。

回到autoload_real.php文件的getLoader()方法,看剩下部分代码

useStaticLoader 美元;=,PHP_VERSION_ID 祝辞=,50600,,,,!定义(& # 39;HHVM_VERSION& # 39;),,,, (! function_exists (& # 39; zend_loader_file_encoded& # 39;), | |, ! zend_loader_file_encoded ());   if 才能;(useStaticLoader美元),{   ,,require_once  __DIR__ 只& # 39;/autoload_static.php& # 39;;      ,,call_user_func(\ \自动装载\ ComposerStaticInit5586036d8fdd45ae351f9a5ae924a5a3作曲家:getInitializer(装载机)美元);   ,,},{else    ,,map 美元;=,require  __DIR__ 只& # 39;/autoload_namespaces.php& # 39;;   ,,foreach  (map 美元;as  namespace 美元;=祝辞,美元路径),{   ,,,美元装载机→设置(名称空间,美元,美元路径);   ,,}      ,,map 美元;=,require  __DIR__ 只& # 39;/autoload_psr4.php& # 39;;   ,,foreach  (map 美元;as  namespace 美元;=祝辞,美元路径),{   ,,,装载机→美元setPsr4(名称空间,美元,美元路径);   ,,}      ,,classMap 美元;=,require  __DIR__ 只& # 39;/autoload_classmap.php& # 39;;   ,,if  (classMap美元),{   ,,,装载机→美元addClassMap ($ classMap);   ,,}   以前,,}

这里主要加载一些自动加载类相关的资源。

随后调用装载机→美元注册(真正);

<强>这个方法比较重要

, public  function 注册($ prepend =,假)   ,{   spl_autoload_register才能(数组($ this, & # 39; loadclass # 39;),,真的,,预先考虑美元);   以前,}

注册了loadClass方法,并且是放在队列的头。

<强>查看loadClass方法

,/* *   *,才能Loads 从而given  class 或接口。   ,*   *,才能@param  string  class 美元;从而name  of 从而类   *,才能@return  bool | null  True  if 加载,null 否则   ,*/美元,public  function  loadClass(类)   ,{   if 才能;(file 美元;=,$ this→findFile(类)美元),{   ,,includeFile($文件);      ,,return 真实;   ,,}   以前,}

当实例化类的时候,找不到类,就自动会调用该方法,该方法加载了需要的类,这个方法十分重要。

现在看一下$ this→findFile(类)美元方法内使用了之前getLoader()方法加载的相关资源。

现在整个Laravel框架如何自动加载类已经很明显了。每当实例化类的时候,会自动调用类加载器的loadClass方法,加载需要的类。

Laravel实现自动加载类的方法