Laravel源码阅读 发布于 2026 年 3 月 24 日 全文约 1,181 字 · 预计阅读 4 分钟 #### **Illuminate\Foundation\Application ==extends Container== 中的 singleton 和 instance** ##### **绑定** 在 Laravel 的 `Illuminate\Foundation\Application` 类中,`singleton` 和 `instance` 方法都与服务容器(Service Container)相关,但它们的用途和行为略有不同。 1. **`singleton` 方法:** * `singleton` 方法用于将抽象绑定到具体实例,并确保每次解析该抽象时都返回相同的实例(单例模式)。 * 这意味着只会在第一次解析时创建实例,并在后续的解析中重复使用该实例。 * 示例: ```php $app->singleton('example', function () { return new ExampleClass(); }); ``` 2. **`instance` 方法:** * `instance` 方法用于将一个现有的实例绑定到服务容器。这样,在后续解析该抽象时,将始终返回指定的实例。 * 这与 `singleton` 不同,`instance` 并不会在第一次解析时创建实例,而是使用预先存在的实例。 * 示例: ```php $exampleInstance = new ExampleClass(); $app->instance('example', $exampleInstance); ``` 在总体上,主要区别在于: * `singleton` 创建并维护一个单例实例,确保在每次解析时都返回相同的实例。 * `instance` 使用预先存在的实例,而不是创建新的实例。这对于在服务容器中插入已有的对象或实例非常有用。 在实际应用中,选择使用 `singleton` 还是 `instance` 取决于具体的需求。通常情况下,如果你希望在应用程序的生命周期内只有一个实例,你会使用 `singleton`。如果你已经有一个实例,并且想在服务容器中使用它,你会使用 `instance`。 ##### **获取对象** 在 Laravel 的服务容器中,无论是使用 `singleton` 还是 `instance` 方法绑定抽象到实例,都可以使用 `make` 方法来获取对象。这是因为这两种方法都将抽象绑定到实例,而在服务容器中,`make` 方法用于解析给定抽象的实例。 以下是示例: 1. **使用 `singleton` 创建的示例:** ```php $app->singleton('example', function () { return new ExampleClass(); }); $example = $app->make('example'); ``` 在这里,`make('example')` 将返回 `ExampleClass` 的单例实例。 2. **使用 `instance` 创建的示例:** ```php $exampleInstance = new ExampleClass(); $app->instance('example', $exampleInstance); $example = $app->make('example'); ``` 在这里,`make('example')` 将返回预先存在的 `ExampleClass` 实例。 总的来说,无论是使用 `singleton` 还是 `instance`,都可以通过 `make` 方法获取对象。这是 Laravel 服务容器的一个关键特性,它允许你使用依赖注入或手动解析的方式获取你需要的实例。 #### **\$app 中的 bindings 属性** 在 Laravel 框架中,Illuminate\Foundation\Application 类的 `$bindings 属性是用于存储服务容器(Service Container)中绑定的类或接口与具体实现之间的映射关系。服务容器是 Laravel 中的一个强大的工具,用于解决依赖注入、依赖解析等问题,以提供可扩展和可测试的应用程序架构。 具体来说,$`bindings 属性是一个关联数组,其中的键是类或接口的标识符(标识 Binding),而值是与这些标识符相关联的类名或闭包。当应用程序需要解析这些标识符时,服务容器会根据这些映射关系来提供正确的实例。 下面是一个简单的示例,演示了如何使用 \$bindings 属性: $app->singleton( 'NB', App\Http\Kernel::class ); $test = $app->make('NB'); dd($test); // 打印的是 App\Http\Kernel 类的对象 `$bindings 属性的作用在于为 Laravel 服务容器中的类或接口提供绑定关系,从而实现依赖注入和依赖解析。 以下是 $`bindings 属性的一些主要作用: 1. 依赖注入 Laravel 的服务容器负责解析类的依赖关系,确保在需要使用某个类或接口实例时,能够自动地创建并注入相关依赖。通过 \$bindings 属性,你可以在容器中注册这些依赖关系,以便容器在需要时能够正确地解析它们。 2. 接口绑定 当应用程序中使用接口时,你可能希望将接口与具体实现类绑定在一起。这样,当容器需要解析接口时,它会返回与之绑定的实现类的实例。这种绑定关系可以在 \$bindings 属性中定义。 3. 单例绑定 有时你可能想要确保容器只返回某个类的一个实例,而不是每次解析时都创建一个新实例。通过在 \$bindings 中使用 singleton 方法,你可以实现单例绑定。 \`\` // 在 \$bindings 中使用 singleton 方法 \$app->singleton('MyInterface', 'MyConcreteImplementation'); \`\` 4. 动态绑定 \$bindings 允许你使用闭包来动态地绑定类。这可以在运行时根据需要确定实际的绑定关系。 \`\` // 在 \$bindings 中使用闭包进行动态绑定 \$app->bind('MyInterface', function (\$app) { return new MyDynamicImplementation(\$app\['some\_dependency']); }); \`\` Laravel源码阅读 https://blog.gamehomexx.asia/index.php/archives/8/ 无责任编辑 joewang 发布时间 2026 年 3 月 24 日 最后编辑时间 2026 年 3 月 24 日 版权协议 CC BY-NC-SA 4.0 Laravel 广告 广告位招租 联系站长投放广告 了解更多 → 分享 文章目录 × Laravel源码阅读 ← 上一篇二叉树的中序遍历 下一篇 →什么是NOSQL 发表评论 取消回复 提交评论 评论 暂无评论
#### **Illuminate\Foundation\Application ==extends Container== 中的 singleton 和 instance** ##### **绑定** 在 Laravel 的 `Illuminate\Foundation\Application` 类中,`singleton` 和 `instance` 方法都与服务容器(Service Container)相关,但它们的用途和行为略有不同。 1. **`singleton` 方法:** * `singleton` 方法用于将抽象绑定到具体实例,并确保每次解析该抽象时都返回相同的实例(单例模式)。 * 这意味着只会在第一次解析时创建实例,并在后续的解析中重复使用该实例。 * 示例: ```php $app->singleton('example', function () { return new ExampleClass(); }); ``` 2. **`instance` 方法:** * `instance` 方法用于将一个现有的实例绑定到服务容器。这样,在后续解析该抽象时,将始终返回指定的实例。 * 这与 `singleton` 不同,`instance` 并不会在第一次解析时创建实例,而是使用预先存在的实例。 * 示例: ```php $exampleInstance = new ExampleClass(); $app->instance('example', $exampleInstance); ``` 在总体上,主要区别在于: * `singleton` 创建并维护一个单例实例,确保在每次解析时都返回相同的实例。 * `instance` 使用预先存在的实例,而不是创建新的实例。这对于在服务容器中插入已有的对象或实例非常有用。 在实际应用中,选择使用 `singleton` 还是 `instance` 取决于具体的需求。通常情况下,如果你希望在应用程序的生命周期内只有一个实例,你会使用 `singleton`。如果你已经有一个实例,并且想在服务容器中使用它,你会使用 `instance`。 ##### **获取对象** 在 Laravel 的服务容器中,无论是使用 `singleton` 还是 `instance` 方法绑定抽象到实例,都可以使用 `make` 方法来获取对象。这是因为这两种方法都将抽象绑定到实例,而在服务容器中,`make` 方法用于解析给定抽象的实例。 以下是示例: 1. **使用 `singleton` 创建的示例:** ```php $app->singleton('example', function () { return new ExampleClass(); }); $example = $app->make('example'); ``` 在这里,`make('example')` 将返回 `ExampleClass` 的单例实例。 2. **使用 `instance` 创建的示例:** ```php $exampleInstance = new ExampleClass(); $app->instance('example', $exampleInstance); $example = $app->make('example'); ``` 在这里,`make('example')` 将返回预先存在的 `ExampleClass` 实例。 总的来说,无论是使用 `singleton` 还是 `instance`,都可以通过 `make` 方法获取对象。这是 Laravel 服务容器的一个关键特性,它允许你使用依赖注入或手动解析的方式获取你需要的实例。 #### **\$app 中的 bindings 属性** 在 Laravel 框架中,Illuminate\Foundation\Application 类的 `$bindings 属性是用于存储服务容器(Service Container)中绑定的类或接口与具体实现之间的映射关系。服务容器是 Laravel 中的一个强大的工具,用于解决依赖注入、依赖解析等问题,以提供可扩展和可测试的应用程序架构。 具体来说,$`bindings 属性是一个关联数组,其中的键是类或接口的标识符(标识 Binding),而值是与这些标识符相关联的类名或闭包。当应用程序需要解析这些标识符时,服务容器会根据这些映射关系来提供正确的实例。 下面是一个简单的示例,演示了如何使用 \$bindings 属性: $app->singleton( 'NB', App\Http\Kernel::class ); $test = $app->make('NB'); dd($test); // 打印的是 App\Http\Kernel 类的对象 `$bindings 属性的作用在于为 Laravel 服务容器中的类或接口提供绑定关系,从而实现依赖注入和依赖解析。 以下是 $`bindings 属性的一些主要作用: 1. 依赖注入 Laravel 的服务容器负责解析类的依赖关系,确保在需要使用某个类或接口实例时,能够自动地创建并注入相关依赖。通过 \$bindings 属性,你可以在容器中注册这些依赖关系,以便容器在需要时能够正确地解析它们。 2. 接口绑定 当应用程序中使用接口时,你可能希望将接口与具体实现类绑定在一起。这样,当容器需要解析接口时,它会返回与之绑定的实现类的实例。这种绑定关系可以在 \$bindings 属性中定义。 3. 单例绑定 有时你可能想要确保容器只返回某个类的一个实例,而不是每次解析时都创建一个新实例。通过在 \$bindings 中使用 singleton 方法,你可以实现单例绑定。 \`\` // 在 \$bindings 中使用 singleton 方法 \$app->singleton('MyInterface', 'MyConcreteImplementation'); \`\` 4. 动态绑定 \$bindings 允许你使用闭包来动态地绑定类。这可以在运行时根据需要确定实际的绑定关系。 \`\` // 在 \$bindings 中使用闭包进行动态绑定 \$app->bind('MyInterface', function (\$app) { return new MyDynamicImplementation(\$app\['some\_dependency']); }); \`\`
评论 暂无评论