PHP內建自動載入autoload方式跟常誤會一些觀念
最近有計畫學 Laravel
不過想趁機會把 PHP Namespace
搞清楚
我在想autoload
自動載入是甚麼機制的
最近小小的玩了一下,才知道這個自動載入
是怎麼用的
其實我覺得也不是完全自動載入阿~~終究還是手動需做載入一段程式
PHP 原有 autoload 方式
include, include_once, require , require_once
都是載入功能。
比較特別注意 include 當載入失敗會跳出警告,但是不會停止程式
require 載入失敗會跳出錯誤,不會繼續執行下面程式
常常忘記哪個會載入錯誤 orz
順便記載這邊
PHP Autoload
前面兩個是比較早期的自動載入方式。簡單來講就是自動載入xxx.php
方法
後面 namespace 可搭配composer
實作
- __autoload
- spl_autoload
- autoload 與 namespace
PHP 系列 - Autoload 自動載入 « Eric G. Huang 不像樣工程師 備份圖
上面連結介紹太清楚了。
我這邊仔細記錄我實務的問題
常常搞錯的觀念
我是有學過 Java,所以對 Java Namespace 不是很陌生
但當初看 PHP 的 Namespace 有看沒有懂
學得他們很像,但又不是很像
但說 Java Namespace 定義很清楚
PHP 並沒有那麼清楚(畢竟是腳本語言….)
還是需要放置載入程式
首先來看看 Laravel 的 Controller.php
|
|
看到這個我整個高潮了
其實我以為 PHP 已經完完整整可以自動載入
不過我自己實作卻是不能…
最終爬文還是找到答案
下面那篇 PO 文跟我一樣 HI XD
php 的 use 明顯比 require 高端大氣上檔次 - 開源中國 備份圖
為什麼 Laravel 的 Controller.php 可以自動載入
關鍵還是 index.php 的require __DIR__.'/../vendor/autoload.php';
所以我才說也不是真正的自動載入
不過方法真的已經比以前好很多
發現我自己寫的 PHP 沒辦法 use 使用到
當以為你以為require 'vendor/autoload.php';
可以載入所有 php 檔案內容
你可能就大錯特錯了!!!
composer.json 有一個 classmap 自動載入
|
|
~~但不能設定.
~~可以設定.
發現我寫錯了,應該要用陣列才對
上面能跑純屬意外
|
|
發現新增檔案跟修改 class 名稱沒有自動載入到
當我發現這件事,還以為我哪裡寫錯了
其實有看到這篇php – composer.json 設定 classmap 指定自動讀取的檔案或路徑 | jsnWork
vendor/composer/autoload_classmap.php
|
|
看到原來自動載入原來不是真的跑每一層資料夾
是透過暫存方式載入
之前一直還在想有什麼辦法看到目前會自動載入哪些
看來還是有辦法知道的
PSR0 , PSR4
看了一下好像都是自動載入
PSR0 命名規則跟 JAVA 很像
但是 PSR4 規則也不一定要跟 JAVA 擺放位置一樣
我也沒看很詳細,有空再仔細吸收….
psr-0 和 psr-4 的区别 - shuizhuniurou - SegmentFault 思否
Namespace 一些事
Namespace 是不分大小寫的,跟 class、function 一樣沒有分
但是在 use 引用變數(ex:$a)
想說 class 會不會跟 function 一樣不能共用一樣名字
但測試結果是可以的
我還滿驚呆
|
|
結果
|
|
那同時去做 use A 不知道會
但用在 use 呢?!
經過小小實驗(未確任是否正確,自己得出的結論)
function 要用通常是要用
use function xxxx
但是做 classmap 跟 psr-4 都載入不到(不知道為什麼)
但有找到Composer/PSR - How to autoload functions? - Stack Overflow
深入 Composer autoload | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区
要選files
不過沒有什麼事情還是不要用 function 吧 XD
這我就沒實作確認
感覺 composer,psr0,psr4 之後還是需要好好了解
先記錄到這邊
參考來源:
- 有人用过 PHP 的 use function 吗? | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区
- PHP 系列 - Autoload 自動載入 « Eric G. Huang 不像樣工程師
- [PHP]require 和 include @ Jonas’s Blog :: 痞客邦 ::
- PHP Sandbox, test PHP online, PHP tester
- Composer 進階原理:PHP 命名空間與 PSR-0 | 轉個彎日誌 備份圖
- Composer 設計原理與基本用法 | 轉個彎日誌 備份圖
- php – composer.json 設定 classmap 指定自動讀取的檔案或路徑 | jsnWork
- composer 自动载入 autoload 的使用详解 psr0/psr4/classmap/files - big_cat - 开源中国
- php – Compoer – 非常簡單的使用 psr-4 來建立自動讀取類別 | jsnWork
- php – composer.json 設定 classmap 指定自動讀取的檔案或路徑 | jsnWork
- psr-0 和 psr-4 的区别 - shuizhuniurou - SegmentFault 思否
- php - What Are the Differences Between PSR-0 and PSR-4? - Stack Overflow
- PSR-0/PSR-4 命名标准 · php 笔记 · 看云
- PHP PSR-4 与 PSR-0 规范 - zHHHe 的专栏 - CSDN 博客
- php 的 use 明顯比 require 高端大氣上檔次 - 開源中國
- php 使用命名空间:导入导出之疑问 - 开源中国
- 深入 Composer autoload | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区
- 如何使用 Namespace? | 點燈坊
- PHP Tutorial: Getting Started with Composer | Codementor