通过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. 单例、全局状态
相关推荐
小蒜学长1 分钟前
基于Spring Boot+Vue3的在线医疗咨询系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·在线问诊·在线医疗咨询系统
Deng桑8 分钟前
SpringAI写第一个Agent-把工单循环跑起来
java·agent·工具调用·spring ai
yunlaodacom2 小时前
腾讯云国际站服务代理商:CVM连接TencentDB失败排查指南
云计算·php·腾讯云
步行cgn2 小时前
@ResponseBody 详解:Spring MVC 中把返回值直接写入响应体
java·spring·mvc
脏脏a3 小时前
延迟与画质:远程控制的生命线
开发语言·php
jason成都3 小时前
RTKLIB 的 Java 移植版来了:rtklib-java v3.3.0 功能全景
java·gnss·rtklib·rtklib_java
一条破秋裤3 小时前
SDIO Wi‑Fi 设备的驱动向insmod + 反向rmmod
开发语言·php
LazyHunter93 小时前
JDK 28:Java 下一步方向解析与新特性展望
java·jdk
m0_639906943 小时前
Java 重写 Override 与重载 Overload 区别、访问修饰符、static 关键字
java·开发语言
GIS数据转换器3 小时前
基于CIM的城市智慧供热监管服务平台
java·大数据·开发语言·人工智能·后端·物联网·struts