[**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