You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:01:57