[**include**](https://www.php.net/manual/zh/function.include.php) 和 [**require**](https://www.php.net/manual/zh/function.require.php) 是 PHP 中引入文件的兩個基本方法。小規模開發中可直接使用,但在大型項目中會造成大量的 `include` 和 `require` 堆積,這樣的代碼執行效率低、維護困難。
為了解決這個問題,部分框架會給出一個引入文件的配置清單,在對象初始化的時候把需要的文件引入。但這只是讓代碼變得更簡潔了一些,引入的效果仍然是差強人意。PHP5 之后,隨著 PHP 面向對象支持的完善,[**__autoload**](https://www.php.net/manual/zh/function.autoload.php) 函數才真正使得自動加載成為可能。
- `include `和 `require `功能一樣,不同點在于 `include `出錯時只會產生警告,而 `require `會拋出錯誤終止腳本
- `include_once `和 `include `唯一的區別在于 `include_once `會檢查文件是否已經引入,如果是則不會重復引入
## 自動加載
實現自動加載最簡單的方式就是使用 `__autoload` 魔術方法。當需要使用的類沒有被引入時,這個函數會在 PHP 報錯前被觸發,未定義的類名會被當作參數傳入。
簡單測試:
~~~php
<?php
// 使用未定義的類時,系統自動調用
function __autoload($calss){
echo $calss, PHP_EOL;
}
new Test();
/**
* 輸出:
* Test
* PHP Fatal error: Class 'HelloWorld' not found in …………
*/
~~~
> ps:`__autoload()` 函數已自 PHP 7.2.0 起被*廢棄*,并自 PHP 8.0.0 起被*移除*。使用 [spl_autoload_register()](https://www.php.net/manual/zh/function.spl-autoload-register.php) 函數替代
實現一個簡單自動加載:
test.php
~~~php
<?php
class Test
{
function __construct(){
echo '自動加載:', __CLASS__;
}
}
~~~
~~~php
<?php
function autoload($class){
$file = $class . '.php';
if (file_exists($file)) {
// 引入PHP文件
include $file;
}
}
spl_autoload_redister('autoload');
new Test();
/**
* 輸出:自動加載:Test
*/
~~~
## 命名空間
一種標識,它的主要目的是解決命名沖突的問題。
命名空間通過關鍵字 `namespace `來聲明。如果一個文件中包含命名空間,它必須在其它所有代碼之前聲明命名空間
~~~php
<?php
namespace Test1;
class HelloWord
{
public function __construct()
{
echo ‘Test1 下的 HelloWord’, PHP_EOL;
}
}
?>
-----------------------------------------------
<?php
namespace Test2;
class HelloWord
{
public function __construct()
{
echo ‘Test2 下的 HelloWord’, PHP_EOL;
}
}
?>
-------------------------------------------------
<?php
new Test1/HelloWord();
new Test2/HelloWord();
~~~
## PSR-4 自動加載規范
https://learnku.com/docs/psr/psr-4-autoloader/1608
- PHP
- PHP 核心架構
- PHP 生命周期
- PHP-FPM 詳解
- PHP-FPM 配置優化
- PHP 命名空間和自動加載
- PHP 運行模式
- PHP 的 Buffer(緩沖區)
- php.ini 配置文件參數優化
- 常見面試題
- 常用函數
- 幾種排序算法
- PHP - 框架
- Laravel
- Laravel 生命周期
- ThinkPHP
- MySQL
- 常見問題
- MySQL 索引
- 事務
- 鎖機制
- Explain 使用分析
- MySQL 高性能優化規范
- UNION 與 UNION ALL
- MySQL報錯:sql_mode=only_full_group_by
- MySQL 默認的 sql_mode 詳解
- 正則表達式
- Redis
- Redis 知識
- 持久化
- 主從復制、哨兵、集群
- Redis 緩存擊穿、穿透、雪崩
- Redis 分布式鎖
- RedisBloom
- 網絡
- 計算機網絡模型
- TCP
- UDP
- HTTP
- HTTPS
- WebSocket
- 常見幾種網絡攻擊方式
- Nginx
- 狀態碼
- 配置文件
- Nginx 代理+負載均衡
- Nginx 緩存
- Nginx 優化
- Nginx 配置 SSL 證書
- Linux
- 常用命令
- Vim 常用操作命令
- Supervisor 進程管理
- CentOS與Ubuntu系統區別
- Java
- 消息隊列
- 運維
- RAID 磁盤陣列
- 邏輯分區管理 LVM
- 業務
- 標準通信接口設計
- 業務邏輯開發套路的三板斧
- 微信小程序登錄流程
- 7種Web實時消息推送方案
- 用戶簽到
- 用戶注冊-短信驗證碼
- SQLServer 刪除同一天用戶重復簽到
- 軟件研發完整流程
- 前端
- Redux
- 其他
- 百度云盤大文件下載
- 日常報錯記錄
- GIT
- SSL certificate problem: unable to get local issuer certificate
- NPM
- reason: connect ECONNREFUSED 127.0.0.1:31181
- SVN
- SVN客戶端無法連接SVN服務器,主機積極拒絕
- Python
- 基礎
- pyecharts圖表
- 對象
- 數據庫
- PySpark
- 多線程
- 正則
- Hadoop
- 概述
- HDFS