PHP技术疑问:使用require_once会触发被引入类的__construct方法吗?
类构造函数(
__construct)不会在引入文件时自动执行 嘿,这个问题问到点子上了——自己搭PHP框架的时候,搞清楚类的加载和构造函数执行时机是基础中的基础!直接给你结论:仅仅引入类文件(比如用require/include),类的__construct方法绝对不会自动执行。
为什么不会?
PHP加载类文件的过程,只是把类的"定义"读取到内存里,相当于告诉PHP:"喏,有这么一个类,它长这样"。而__construct是构造函数,它的作用是在你创建这个类的实例对象的时候,初始化这个对象——只有当你用new 类名()语法实例化类的时候,它才会被触发执行。
举个直观的例子
比如你的Globals.php内容是这样:
// Globals.php class Globals { public function __construct() { echo "Globals构造函数启动啦!"; } }
在你的前端控制器index.php里引入它:
// index.php require 'Globals.php'; // 这里啥输出都没有,因为只是加载了类定义,没创建对象 // 只有当你实例化类的时候,构造函数才会跑 $myGlobals = new Globals(); // 这时候才会输出:Globals构造函数启动啦!
结合你的框架场景补充
比如你提到的BaseController.php,假设它的构造函数里做了一些通用初始化(比如加载配置、处理请求参数):
// BaseController.php class BaseController { public function __construct() { $this->loadConfig(); $this->handleRequest(); } private function loadConfig() { // 加载配置文件的逻辑 } private function handleRequest() { // 处理请求参数的逻辑 } }
在前端控制器里,你需要先加载这个类,然后创建控制器实例的时候,构造函数才会执行:
// index.php require 'BaseController.php'; // 假设路由匹配到了HomeController class HomeController extends BaseController { // 你的控制器逻辑 } // 创建控制器实例——这时候BaseController的__construct会自动执行 $controller = new HomeController();
别搞混:静态代码块才会在类加载时执行
这里要提个容易混淆的点:如果类里有静态代码块(PHP用static { ... }定义),那在类被加载(引入)的时候会自动执行,但这和构造函数完全是两回事。比如:
class Globals { static { echo "类被加载啦!这行代码会在require时直接输出"; } public function __construct() { echo "只有new的时候才会执行我!"; } }
这时候你require 'Globals.php'就会输出静态代码块的内容,但构造函数还是要等new的时候才跑。
给你搭框架的小建议
在前端控制器模式里,通常的流程是:
- 加载核心类(或者用自动加载机制,比如
spl_autoload_register,不用手动一个个require) - 解析请求路由,确定要实例化哪个控制器
- 创建控制器实例——这时候控制器(包括父类)的构造函数启动,做初始化工作
- 调用控制器对应的方法处理请求
这样整个流程就顺啦~
内容的提问来源于stack exchange,提问作者user8749260
相关产品推荐
相关产品推荐

