通过php 中的Route:: 的写法了解什么是静态类调用
结论 :Route:: 是静态类调用,不是普通实例方法调用。
1. 基础语法说明
类名::方法名 是 PHP 静态调用语法:
Route= 类名(通常是门面类 / Facade,Laravel 里最常见)::= 静态调用符号- 后面方法(
get/post/any等)必须是类里static静态方法
普通实例调用是 $对象->方法(),和它完全不同。
2. Laravel 里的 Route 本质(重点)
Laravel 中 Route 并不是直接路由核心类 ,而是门面(Facade) :
- 框架预先定义
Route门面类,内部用static方法转发调用 - 底层实际调用的是路由服务容器里的实例
- 对外统一用
Route::xxx静态写法,简化代码
php
// 定义静态类
class Route
{
public static function get($uri, $action)
{
// 底层再调用真正的路由实例
app('router')->get($uri, $action);
}
}
// 调用
Route::get('/', function () {});
3. 区分两种写法
php
// 1. 静态调用 Route::xxx(你问的这种)
Route::get('/test', 'TestController@index');
// 2. 实例调用 $router->xxx
$router = app('router');
$router->get('/test', 'TestController@index');
4. 补充小点
- 只要看到
类名::,一律是静态调用,和是否在类内 / 类外无关 - 可以在类内部 也可以在全局作用域 使用
Route:: - 非 Laravel 框架里如果出现
XXX::xxx,也都是标准 PHP 静态方法调用
简单总结:Route:: 就是 PHP 静态类调用,Laravel 中是门面模式的典型用法。
静态与实例有什么区别?
用通俗 + 代码对比,讲清 静态 (static) 和 实例 (对象) 的核心区别,结合你刚看的 Route:: 场景。
- 实例(对象) :先
new 类()造出专属对象 ,用->调用,每个对象独立数据。 - 静态 :不用
new,直接类名::调用,属于整个类,所有对象共享。
1. 调用方式(最直观区别)
实例调用(->)
必须先创建对象:
php
// 1. 实例化:造出一个对象
$user = new User();
// 2. 对象 -> 调用方法/属性
$user->name = "张三";
$user->say();
静态调用(::)
不用 new,直接类名调用
php
// 直接 类名:: 调用
User::type = "人类";
User::info();
2. 内存 & 数据(最大区别)
实例属性 / 方法:每个对象独立
每个 new 出来的对象,有自己独立的变量,互不干扰。
php
class User
{
public $name; // 实例属性
}
$u1 = new User();
$u1->name = "小明";
$u2 = new User();
$u2->name = "小红";
echo $u1->name; // 小明(自己的数据)
echo $u2->name; // 小红(互不影响)
静态属性 / 方法:全类共享,只有一份
整个类就一份静态数据,所有对象共用,一改全改。
php
class User
{
public static $type; // 静态属性
}
User::$type = "学生";
$u1 = new User();
$u2 = new User();
echo User::$type; // 学生
$u1::$type = "老师";
// 全部变了
echo User::$type; // 老师
echo $u2::$type; // 老师
3. 访问权限规则
1. 实例方法里
- 可以 正常访问实例属性 / 方法
- 也 可以访问静态属性 / 方法
2. 静态方法里(限制最多)
❌ 不能直接用 $this (静态不属于某个对象,没有 $this)
✅ 只能访问 静态属性、静态方法
示例报错演示:
php
class Demo
{
public $a = 1;
public static $b = 2;
// 静态方法
public static function test()
{
echo $this->a; // 报错!静态里没有 $this
echo self::$b; // 正常,访问静态
}
}
什么时候用哪个
👉 用 实例(->)
- 每个个体有独立数据(用户、订单、商品)
- 需要面向对象、封装、继承、多态
- 大部分业务逻辑、模型(Laravel Model)
👉 用 静态(::)
- 工具类、全局工具方法(辅助函数、路由、配置)
- 数据需要全局共享
- 不想频繁
new对象(Laravel 门面Route::/DB::就是典型) - 单例、全局状态