直接new实例调用最常见,需确保类已加载且构造函数参数正确;静态方法用类名::调用,不可用$this;依赖注入更利于解耦和测试。

直接 new 一个实例再调用方法
最常见也最直观的方式:只要目标类已加载(比如通过 require、include 或自动加载机制),就用 new 实例化,然后调用其 public 方法。
注意点:
- 确保类定义已载入,否则会报
Fatal error: Class 'XXX' not found - 构造函数有参数时,必须传参,否则报
ArgumentCountError - 如果类是
final或方法被private/protected修饰,无法调用
示例:
// User.php
class User {
public function getName() {
return 'Alice';
}
}
// main.php require 'User.php'; $user = new User(); echo $user->getName(); // 输出 Alice
用 static 关键字调用静态方法
如果目标方法是 public static,不用实例化,直接用类名加作用域操作符 :: 调用。
常见场景:
- 工具类(如
StringUtils::trim()) - 单例的获取入口(如
DB::getInstance()) - 配置或常量相关方法(如
Config::get('db.host'))
注意:static 方法内部不能用 $this,也不能访问非静态属性或方法。
示例:
class MathHelper {
public static function add($a, $b) {
return $a + $b;
}
}
echo MathHelper::add(2, 3); // 输出 5
依赖注入方式获取对象并调用
在框架(如 Laravel、Symfony)或遵循 PSR-4 自动加载的项目中,更推荐通过容器或构造函数注入来获取依赖,而不是到处 new。
好处:
- 解耦:类不直接依赖具体实现,便于测试和替换
- 生命周期统一管理(比如单例复用)
- 避免循环依赖或重复实例化开销
示例(Laravel 风格):
class UserController {
protected $service;
public function __construct(UserService $service) {
$this->service = $service; // 框架自动注入
}
public function index() {
return $this->service->getAllUsers(); // 调用其他类的 public 方法
}
}
没用框架时,可手动传入:
$service = new UserService(); $controller = new UserController($service);
调用时遇到 “Call to undefined method” 怎么排查
这个错误说明 PHP 找不到你要调用的方法,不是语法错,而是运行时问题。
优先检查这几项:
- 拼写是否正确 ——
getUserInfo()写成getuserinfo()(PHP 方法名区分大小写) - 方法是否确实是
public——private或protected方法无法从外部调用 - 类是否真的加载了 —— 用
class_exists('ClassName')或method_exists($obj, 'methodName')快速验证 - 是否用了命名空间但没加完整限定名或没
use—— 比如\App\Services\UserService忘了反斜杠或别名
调试小技巧:
var_dump(method_exists($obj, 'getData')); // true / false var_dump(get_class_methods($obj)); // 列出所有可用 public 方法实际项目里,调用方式本身很简单,难的是搞清楚“该用哪种方式拿对象”——是 new?是 static?还是该让容器给?这取决于类的设计意图和所在上下文。静态方法适合无状态逻辑,new 适合需要独立状态的实例,而依赖注入更适合大型、可维护的结构。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











