本篇文章给大家分享的内容是关于Laravel框架中Autoloader模块的代码分析,有一定的参考价值,希望可以帮助到有需要的朋友。
首先是中文注释:
<?php namespace Laravel; class Autoloader { /** * 类名到文件名得映射 * * @var array */ public static $mappings = array(); /** * PSR-0命名转换目录 * * @var array */ public static $directories = array(); /** * 命名空间和目录的映射 * * @var array */ public static $namespaces = array(); /** * 下划线类库和目录映射 * * @var array */ public static $underscored = array(); /** * 自动加载类的别名 * * @var array */ public static $aliases = array(); /** * Load the file corresponding to a given class. * * This method is registered in the bootstrap file as an SPL auto-loader. * * @param string $class * @return void */ public static function load($class) { // 尝试类是否有别名 if (isset(static::$aliases[$class])) { return class_alias(static::$aliases[$class], $class); } // 查找映射 elseif (isset(static::$mappings[$class])) { require static::$mappings[$class]; return; } // 加载这个新的类 foreach (static::$namespaces as $namespace => $directory) { # 支持函数 是否命名空间开头 在helpers.php中 if (starts_with($class, $namespace)) { return static::load_namespaced($class, $namespace, $directory); } } static::load_psr($class); } /** * 从给定的目录加载命名空间 * * @param string $class * @param string $namespace * @param string $directory * @return void */ protected static function load_namespaced($class, $namespace, $directory) { return static::load_psr(substr($class, strlen($namespace)), $directory); } /** * 使用PSR-0标准来试图解析一个类 * * @param string $class * @param string $directory * @return void */ protected static function load_psr($class, $directory = null) { // 用PSR-0来解析类 使之变成路径字符串 $file = str_replace(array('\\', '_'), '/', $class); $directories = $directory ?: static::$directories; // 获得类路径 $lower = strtolower($file); # 默认全部小写 // 尝试解析 foreach ((array) $directories as $directory) { if (file_exists($path = $directory.$lower.EXT)) { return require $path; } elseif (file_exists($path = $directory.$file.EXT)) { return require $path; } } } /** * 注册一个数组 包含类路径映射 * * @param array $mappings * @return void */ public static function map($mappings) { static::$mappings = array_merge(static::$mappings, $mappings); } /** * 注册类的别名 * * @param string $class * @param string $alias * @return void */ public static function alias($class, $alias) { static::$aliases[$alias] = $class; } /** * 注册目录 * * @param string|array $directory * @return void */ public static function directories($directory) { $directories = static::format($directory); static::$directories = array_unique(array_merge(static::$directories, $directories)); } /** * 映射命名空间和目录 * * @param array $mappings * @param string $append * @return void */ public static function namespaces($mappings, $append = '\\') { $mappings = static::format_mappings($mappings, $append); static::$namespaces = array_merge($mappings, static::$namespaces); # 合并之后: (array "命名空间", array "命名空间","路径") } /** * 注册下划线命名空间 * * @param array $mappings * @return void */ public static function underscored($mappings) { static::namespaces($mappings, '_'); # 下划线风格 } /** * 格式目录映射 * * @param array $mappings * @param string $append * @return array */ protected static function format_mappings($mappings, $append) { foreach ($mappings as $namespace => $directory) { # 清理命名空间 $namespace = trim($namespace, $append).$append; unset(static::$namespaces[$namespace]); # 去除之前的 如果存在的话 $namespaces[$namespace] = head(static::format($directory)); # 一个命名空间只能对应一个目录 } return $namespaces; } /** * 格式化一个目录数组 * * @param array $directories * @return array */ protected static function format($directories) { return array_map(function($directory) { return rtrim($directory, DS).DS;# 清理目录 }, (array) $directories); // 用map遍历目录数组 } }
改类被自动装在到spl中:
spl_autoload_register(array('Laravel\\Autoloader', 'load')); # spl_autoload_register array 命名空间,具体方法
注册好之后,就载入一些预先设置好的配置:
定义系统root
Autoloader::namespaces(array('Laravel' => path('sys'))); # 定义Laravel系统根目录映射
然后是默认使用的ORM框架
# 定义EloquentORM框架 Autoloader::map(array( 'Laravel\\Database\\Eloquent\\Relationships\\Belongs_To' => path('sys').'database/eloquent/relationships/belongs_to'.EXT, 'Laravel\\Database\\Eloquent\\Relationships\\Has_Many' => path('sys').'database/eloquent/relationships/has_many'.EXT, 'Laravel\\Database\\Eloquent\\Relationships\\Has_Many_And_Belongs_To' => path('sys').'database/eloquent/relationships/has_many_and_belongs_to'.EXT, 'Laravel\\Database\\Eloquent\\Relationships\\Has_One' => path('sys').'database/eloquent/relationships/has_one'.EXT, 'Laravel\\Database\\Eloquent\\Relationships\\Has_One_Or_Many' => path('sys').'database/eloquent/relationships/has_one_or_many'.EXT, ));
随后是Symfony的HTTP组件和Console组件
# Symfony组件加载 Autoloader::namespaces(array( 'Symfony\Component\Console' => path('sys').'vendor/Symfony/Component/Console', 'Symfony\Component\HttpFoundation' => path('sys').'vendor/Symfony/Component/HttpFoundation', ));
当然,不要忘记了application.php中的配置
'aliases' => array( 'Auth' => 'Laravel\\Auth', 'Authenticator' => 'Laravel\\Auth\\Drivers\\Driver', 'Asset' => 'Laravel\\Asset', 'Autoloader' => 'Laravel\\Autoloader', 'Blade' => 'Laravel\\Blade', 'Bundle' => 'Laravel\\Bundle', 'Cache' => 'Laravel\\Cache', 'Config' => 'Laravel\\Config', 'Controller' => 'Laravel\\Routing\\Controller', 'Cookie' => 'Laravel\\Cookie', 'Crypter' => 'Laravel\\Crypter', 'DB' => 'Laravel\\Database', 'Eloquent' => 'Laravel\\Database\\Eloquent\\Model', 'Event' => 'Laravel\\Event', 'File' => 'Laravel\\File', 'Filter' => 'Laravel\\Routing\\Filter', 'Form' => 'Laravel\\Form', 'Hash' => 'Laravel\\Hash', 'HTML' => 'Laravel\\HTML', 'Input' => 'Laravel\\Input', 'IoC' => 'Laravel\\IoC', 'Lang' => 'Laravel\\Lang', 'Log' => 'Laravel\\Log', 'Memcached' => 'Laravel\\Memcached', 'Paginator' => 'Laravel\\Paginator', 'Profiler' => 'Laravel\\Profiling\\Profiler', 'URL' => 'Laravel\\URL', 'Redirect' => 'Laravel\\Redirect', 'Redis' => 'Laravel\\Redis', 'Request' => 'Laravel\\Request', 'Response' => 'Laravel\\Response', 'Route' => 'Laravel\\Routing\\Route', 'Router' => 'Laravel\\Routing\\Router', 'Schema' => 'Laravel\\Database\\Schema', 'Section' => 'Laravel\\Section', 'Session' => 'Laravel\\Session', 'Str' => 'Laravel\\Str', 'Task' => 'Laravel\\CLI\\Tasks\\Task', 'URI' => 'Laravel\\URI', 'Validator' => 'Laravel\\Validator', 'View' => 'Laravel\\View', ),
基本上流程就出来了。
牵扯的重要的文件地址:
laravel/core.php
laravel/autoloader.php
application/config/application.php
配合Ioc,够用了。下次分析一下laravel的Ioc,不过个人感觉功能太少。使用仿spring的Ding更好
以上就是本篇文章的全部内容了,更多laravel内容请关注laravel框架入门教程。
相关文章推荐:
实时聊天室:基于Laravel+Pusher+Vue通过事件广播实现
laravel框架中TokenMismatchException的异常处理内容
相关课程推荐:
以上がLaravelフレームワークのAutoloaderモジュールのコード分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

反応、vue、andangularcanbe veintedated withlaravelbyfollowingspecificsetupSteps.1)forReact:instruectusinglaravelui、setUpComponentsInapp.js.2)forvue:uselaravel'sbuilt-invuesuptort、futureinapp.3)

Taskmanagementtoolsareessentialforeffectiveremoteprojectmanagementbyprioritizingtasksandtrackingprogress.1)UsetoolslikeTrelloandAsanatosetprioritieswithlabelsortags.2)EmploytoolslikeJiraandMonday.comforvisualtrackingwithGanttchartsandprogressbars.3)K

laravel10EnhancesperformAnceTheveralkeyfeatures.1)ItintroduceSquerybuilderCachinucedatedatabaseload.2)itoptimizeseLoquentModelloadingwithlazingproxies.3)itimprovesRoutingWithineSystem.4)itemproveStingwithingingSystem.4)

最高のフルスタックのLaravelアプリケーション展開戦略には、1。Zeroダウンタイム展開、2。ブルーグリーン展開、3。連続展開、4。Canaryリリースが含まれます。 1.ゼロダウンタイムデプロイメントは、EnvoyまたはDeployerを使用して展開プロセスを自動化して、更新時にアプリケーションを利用できるようにします。 2。ブルーとグリーンの展開により、2つの環境を維持し、迅速なロールバックを可能にすることにより、ダウンタイムの展開が可能になります。 3.継続的な展開GithubactionsまたはGitlabci/CDを使用して、展開プロセス全体を自動化します。 4。nginx構成を通じてカナリーがリリースされ、パフォーマンスの最適化と迅速なロールバックを確保するために、新しいバージョンをユーザーに徐々に宣伝します。

ToscalealAravelApplicationively、Focusondatabasesharding、Caching、Loadbalancing、andMicroservices.1)databaseShardingTodistributedataacrossMultipledatabase.2)uselaraval'scachingsmultedistestemedisemememememememedtededatedatab

ToovercomcomcommunicationbarriersindistributedTeams、使用:1)VideoCallsForface-to-faceInteraction、2)setClearResponsetimeExpectations、3)ChooseaprateCommunicationSoools、4)CreateAmCommunicationGuide、and5)

laravelbladeEnhancesFrontendTemplatinginfull stackprojectsbyofferingcleansyntaxandpowerfulfeatures.1)itallows foreasyvariabledisplayandcontrolstructures.2)bladeSupportscreating andReusing components、

laravelisidealforfull-stackapplicationsduetoitseLegantyntax、包括的なセコスシステム、およびパワーフルフィーチュア


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

SublimeText3 中国語版
中国語版、とても使いやすい

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ホットトピック









