Laravel如何实现自动加载类

本人水平有限,如有错误望告知,谢谢!

Laravel如何实现自动加载类

Laravel使用的是composer的自动加载。

首先看 vendor/autoload.php文件

<?php
// autoload.php @generated by Composer
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3::getLoader();

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

看一下部分代码

  if (null !== self::$loader) {
   return self::$loader;
  }

  spl_autoload_register(array('ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3', 'loadClassLoader'), true, true);
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
  spl_autoload_unregister(array('ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3', 'loadClassLoader'));

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

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

$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
  if ($useStaticLoader) {
   require_once __DIR__ . '/autoload_static.php';

   call_user_func(\Composer\Autoload\ComposerStaticInit5586036d8fdd45ae351f9a5ae924a5a3::getInitializer($loader));
  } else {
   $map = require __DIR__ . '/autoload_namespaces.php';
   foreach ($map as $namespace => $path) {
    $loader->set($namespace, $path);
   }

   $map = require __DIR__ . '/autoload_psr4.php';
   foreach ($map as $namespace => $path) {
    $loader->setPsr4($namespace, $path);
   }

   $classMap = require __DIR__ . '/autoload_classmap.php';
   if ($classMap) {
    $loader->addClassMap($classMap);
   }
  }

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

随后调用$loader->register(true);

这个方法比较重要

 public function register($prepend = false)
 {
  spl_autoload_register(array($this, 'loadClass'), true, $prepend);
 }

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

查看loadClass方法

 /**
  * Loads the given class or interface.
  *
  * @param string $class The name of the class
  * @return bool|null True if loaded, null otherwise
  */
 public function loadClass($class)
 {
  if ($file = $this->findFile($class)) {
   includeFile($file);

   return true;
  }
 }

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

现在看一下$this->findFile($class)方法内使用了之前getLoader()方法加载的相关资源。

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

以上这篇Laravel如何实现自动加载类就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • PHP自动加载机制实例详解

    本文实例讲述了PHP自动加载机制.分享给大家供大家参考,具体如下: 在php中,我们一般使用 require, requre_once, include, include_once 这四个命令来加载其他php文件,这在一般小型的php文件中是没有任何问题的,相信每个初学者都会遇到这样的应用场景:使用一个 Db.php 来定义数据库连接,在其他文件中直接引用这个文件,达到代码复用的效果. 再让我们考虑这样一个应用场景,如果我们使用一个框架,或者一个第三方包,里面一般有成百上千个类文件,而我们通常是

  • Laravel 加载第三方类库的方法

    Laravel 版本:5.5 有很多第三方的类库并没有制作 Composer,而是还以 require 的方式进行加载.对于此类的类库,我们只要小粒度的修改,就可以进行使用.我以极验 geetest 和邮件服务 SendCloud 为例. 在 Laravel 框架中建立存放第三方的 SDK 目录 mkdir app/Libraries 放置 geetest.SendCloud 的 SDK 官方下载后相关 SDK 后,移动到 app/Libraries 目录下: app/Libraries/sen

  • Laravel如何实现自动加载类

    本人水平有限,如有错误望告知,谢谢! Laravel如何实现自动加载类 Laravel使用的是composer的自动加载. 首先看 vendor/autoload.php文件 <?php // autoload.php @generated by Composer require_once __DIR__ . '/composer/autoload_real.php'; return ComposerAutoloaderInit5586036d8fdd45ae351f9a5ae924a5a3::

  • Yii实现自动加载类地图的方法

    本文实例讲述了Yii实现自动加载类地图的方法.分享给大家供大家参考.具体如下: Yii继承的一个静态属性$classMap,可以用于Yii的自动加载类地图.数组中的键是类名,数组中的值是相应类文件的路径. require_once($yii); $app = Yii::createWebApplication($config); Yii::$classMap = array( 'JPhpMailer' => Yii::getPathOfAlias('ext') . '/phpmailer/JPh

  • 解析zend Framework如何自动加载类

    1.模块中类的自动载入 复制代码 代码如下: $loader = new Zend_Application_Module_Autoloader(array(   //模块内容自动加载类    'namespace' => 'Blog',//命名空间定义 即方法的开头为Blog_    'basePath'  => APPLICATION_PATH . '/modules/blog',//模块位置)); 2. 自动载入 复制代码 代码如下: require_once 'Zend/Loader/A

  • PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间

    PHP前言: •动态地创建属性和方法 •对象的复制 •对象的比较 •加载指定的文件 •自动加载类文件 •命名空间 示例 1.类的相关知识点 3(动态地创建属性和方法) class/class3.php <?php /** * 类的相关知识点 3(动态地创建属性和方法) */ // 用于演示如何动态地创建属性(这就是 php 中所谓的重载) class Class1 { // __set 魔术方法,当设置的属性不存在或者不可访问(private)时就会调用此函数 public function _

  • Yii2中YiiBase自动加载类、引用文件方法分析(autoload)

    本文实例分析了Yii2中YiiBase自动加载类.引用文件的方法.分享给大家供大家参考,具体如下: 在Yii2中这个函数是用来加载类的,没有直接引用文件的相关实现.但是这个也可以用来引用文件. public static function autoload($className) { /* * $classMap是一个name-value数组, * name为类的名称, * value为这个类的文件路径,其中路径可包含别名 * * 首先在$classMap中查找是否设置了类别名路径 */ if

  • php _autoload自动加载类与机制分析

    在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可 test.class.php 复制代码 代码如下: <?php class abc{ function __construct() { echo 'www.hzhuti.com; } } ?> load.php 代码如下 复制代码 代码如下: <?php class LOAD { static function loadClass($class_name) { $filename = $cl

  • php面向对象全攻略 (十七) 自动加载类

    自动加载类 很多开发者写面向对象的应用程序时,对每个类的定义建立一个PHP 源文件.一个很大 的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 在软件开发的系统中,不可能把所有的类都写在一个PHP 文件中,当在一个PHP 文件 中需要调用另一个文件中声明的类时,就需要通过include 把这个文件引入.不过有的时候, 在文件众多的项目中,要一一将所需类的文件都include 进来,是一个很让人头疼的事,所以 我们能不能在用到什么类的时候,再把这个类所在的PHP 文件导入

  • PHP命名空间和自动加载类

    PHP的命名空间(namespace)是php5.3之后才有的.这个概念在C#中已经很早就有了,php中的namespace其实和c#的概念是一样的. 为什么php中要使用namespace? 假设如果不使用namespace,那么每个类在一个项目中的名字就必须是固定的.因为php在new的时候不管是调用autoload还是调用已加载过的类,都存在一个类名对应的文件.所以在没有namespace的时候,我们会想各种命名规则来区分不同的类,比如project1_school1_class1_Stu

  • PHP面向对象程序设计之命名空间与自动加载类详解

    本文实例讲述了PHP面向对象程序设计之命名空间与自动加载类.分享给大家供大家参考,具体如下: 命名空间 避免类名重复,而产生错误. <?php require_once "useful/Outputter.php"; class Outputter { // output data private $name; public function setName($name) { $this->name = $name; } public function getName()

  • PHP命名空间与自动加载类详解

    本文实例讲述了PHP命名空间与自动加载类.分享给大家供大家参考,具体如下: 今天我要给大家介绍的是PHP的命名空间 和 自动加载类 我先简单的分开演示 在放在一起 大家请看: 什么是自动加载类? 想必大家都应该知道__autoload 这个魔术方法 $db = new DB(); function __autoload($className) { echo $className; exit(); //在这个里面引用类 } 在运用这个类只能加载一次 ,在很多时候我们要引入的不止一个类这个时候怎么办

随机推荐