通过php 中的Route:: 的写法了解什么是静态类调用

通过php 中的Route:: 的写法了解什么是静态类调用

结论Route::静态类调用,不是普通实例方法调用。

1. 基础语法说明

类名::方法名 是 PHP 静态调用语法:

  • Route = 类名(通常是门面类 / Facade,Laravel 里最常见)
  • :: = 静态调用符号
  • 后面方法(get/post/any 等)必须是类里 static 静态方法

普通实例调用是 $对象->方法(),和它完全不同。

2. Laravel 里的 Route 本质(重点)

Laravel 中 Route 并不是直接路由核心类 ,而是门面(Facade)

  1. 框架预先定义 Route 门面类,内部用 static 方法转发调用
  2. 底层实际调用的是路由服务容器里的实例
  3. 对外统一用 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; // 正常,访问静态
    }
}

什么时候用哪个

👉 用 实例(->)

  1. 每个个体有独立数据(用户、订单、商品)
  2. 需要面向对象、封装、继承、多态
  3. 大部分业务逻辑、模型(Laravel Model)

👉 用 静态(::)

  1. 工具类、全局工具方法(辅助函数、路由、配置)
  2. 数据需要全局共享
  3. 不想频繁 new 对象(Laravel 门面 Route::/DB:: 就是典型)
  4. 单例、全局状态
相关推荐
JS菌1 小时前
AI Agent 沙箱双层防护体系:从权限过滤到内核隔离的完整实现
前端·人工智能·后端
Aphasia3111 小时前
从输入URL到页面展示全流程
前端·面试
2601_961845422 小时前
高考真题试卷电子版|2025高考全科试卷分类下载
考研·面试·蓝桥杯·远程工作·程序员创富·高考
我叫黑大帅2 小时前
前端如何竖屏固定视口背景
前端·javascript·面试
折哥的程序人生 · 物流技术专研2 小时前
《Java 100 天进阶之路》第95篇:消息队列基础(RocketMQ/Kafka)(2026版)
java·面试·kafka·rocketmq·java-rocketmq·求职招聘
IT空门:门主2 小时前
Spring 注入三剑客:@Resource、@Autowired、@RequiredArgsConstructor 到底该用哪个?
java·后端·spring
ServBay2 小时前
云端 AI 蜜月期宣告结束,为什么 2026 年开发者转向本地优先架构
后端·ai编程
不会敲代码12 小时前
我花了三天时间,终于把 Cookie、XSS、CSRF 和浏览器存储给整明白了
javascript·面试
IT_陈寒2 小时前
Vite这个坑我帮你踩了,动态导入居然这样才生效
前端·人工智能·后端