php调用类方法主要有三种方式:一是直接new实例后调用public方法;二是通过依赖注入(如构造函数注入)提升可测试性与解耦;三是调用static方法需确保其为public且不依赖实例状态,同时注意命名空间与自动加载配置。

直接 new 一个实例再调用方法
PHP 中最常见、最直接的方式就是创建目标类的实例,然后调用其 public 方法。前提是目标类已定义且可自动加载(或已 require / include)。
比如类 UserService 里有个 getUserById() 方法,你想在 OrderController 里用它:
// OrderController.php
class OrderController {
public function handle() {
$userService = new UserService(); // 实例化
$user = $userService->getUserById(123); // 调用 public 方法
return $user;
}
}
注意:不能调用 private 或 protected 方法;若目标方法是 static,则用 UserService::getUserById(123),无需实例。
用依赖注入(推荐,尤其在 Laravel/Symfony 等框架中)
硬编码 new UserService() 会让测试困难、耦合度高。现代 PHP 项目更倾向把对象通过构造函数或方法参数传入。
- 构造函数注入示例:
class OrderController {
private $userService;
public function __construct(UserService $userService) {
$this->userService = $userService; // 依赖由容器/调用方提供
}
public function handle() {
return $this->userService->getUserById(123);
}
}
这样写的好处是:便于单元测试(可传入 Mock 对象)、支持类型提示、符合 SOLID 原则。PHP7.4 支持类类型声明,所以 UserService $userService 是安全且清晰的。
如果你没用 DI 容器,手动传参也行:$controller = new OrderController(new UserService());
调用静态方法要注意作用域和上下文
如果目标方法是 static,可以直接用类名加双冒号调用,但得确认它不是 private static,也不是依赖 $this 的实例状态。
-
UserService::formatName('john')可以 —— 如果formatName是public static -
UserService::getUserById(123)很可能不行 —— 如果该方法内部用了$this->db或其他实例属性 - 跨命名空间时别漏掉
\或use:比如\App\Services\UserService::xxx()或先use App\Services\UserService;
PHP7.4 不支持“静态代理”语法(如 Ruby 的 self:: 动态转发),所以不要试图用 static:: 在无关类里绕过访问控制。
常见错误:Fatal error: Uncaught Error: Call to undefined method
这个错误基本就三类原因,按优先级排查:
- 拼写错误:
$user->getUserId()写成$user->getUserIdS() - 方法不存在或未 public:
private function loadCache()无法被外部调用 - 类没加载:
Fatal error: Class 'UserService' not found—— 检查use语句、自动加载配置(Composer 的autoload)、或是否漏了require - PHP7.4 的严格模式下,返回类型声明不匹配也会报错(比如声明返回
array,实际返回null),但那是运行时逻辑错误,不是“找不到方法”
调试时加一句 var_dump(get_class_methods(UserService::class)); 能快速确认类里到底有哪些 public 方法可用。
真正容易被忽略的是自动加载路径和命名空间嵌套层级 —— 尤其当类文件放在 src/Services/V1/UserService.php 但命名空间写成 App\Services\UserService 时,UserService 就永远“找不到”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











