php类不能直接运行,必须先通过require/include加载、再用new实例化、最后调用public或static方法;否则将静默失败或报错。

PHP 类不能直接运行,必须实例化后调用方法
PHP 类本身不是可执行单元,class 定义只是蓝图。你写完 class User,直接双击 PHP 文件或命令行执行它,什么都不会发生——连报错都没有,因为语法合法但没触发任何行为。
- 常见错误现象:
php user.php运行后无输出、无报错、进程秒退 - 必须通过
new User()创建对象,再调用其方法(如$user->login())才真正执行逻辑 - 如果类里有
__construct(),实例化时自动触发;没调用实例,构造函数也不会跑 - 命令行执行类文件时,建议末尾加一句测试调用,比如
(new User())->sayHello();,否则等于白跑
require / include 是加载类的前提,路径写错就 Class 'X' not found
类定义在单独文件里(如 User.php),当前脚本想用它,必须先加载。不引入,PHP 根本不知道这个类存在。
- 错误信息典型是:
Fatal error: Uncaught Error: Class 'User' not found -
require 'User.php'和include 'User.php'都可以,但推荐require:加载失败直接中止,避免静默出错 - 路径必须准确:
require './lib/User.php'和require 'lib/User.php'在不同工作目录下行为不同;建议用__DIR__ . '/lib/User.php'消除歧义 - 使用 Composer 后,应改用
require_once 'vendor/autoload.php',不再手动 require 类文件
public 方法才能从外部调用,private/protected 会报 Call to undefined method
类里定义的方法默认是 public,但显式写了 private function init() 或 protected function validate(),外部对象就调用不了。
- 错误信息示例:
Fatal error: Uncaught Error: Call to private method User::init() - 只在类内部可用:
private;子类可用但外部不行:protected;完全开放:public - CLI 脚本中调试时,别在
new User()后直接写->init(),先确认访问控制修饰符 - 静态方法需用
User::doSomething()调用,且静态方法里不能用$this;非静态方法必须先实例化
__autoload 已废弃,PHP 7.2+ 必须用 spl_autoload_register 或 Composer
老教程里写的 function __autoload($class) { require $class . '.php'; } 在 PHP 7.2+ 直接报 Deprecated,而且不生效。
立即学习“PHP免费学习笔记(深入)”;
- 替代方案只有两个靠谱选择:
spl_autoload_register()或 Composer 的自动加载 - 手写自动加载示例:
spl_autoload_register(function($class) { require __DIR__ . '/classes/' . $class . '.php'; }); - Composer 方式更稳:定义
"autoload": {"psr-4": {"App\": "src/"}},然后composer dump-autoload - 注意大小写:Linux 下
User.php里定义class user会导致加载失败;类名和文件名大小写要严格一致











