在CodeIgniter内部的所有类实际上都是以”服务”的形式呈现的。这意味着,所有的类都是以定义在一个简单的配置文件里,而非硬编码所需要加载的类名,来进行加载的。

该配置文件实际上扮演了一种为所需类创建新的实例的工厂的角色。

一个简单的例子可能会讲得更清楚,比如请设想你需要获得一个 Timer (计时器)类的实例,最简单的方法就是为该类创建一个新的实例:

$timer = new \CodeIgniter\Debug\Timer();

这种方式运行得相当不错,直到你决定需要在该位置上使用另一个计时器类时。可能这个类比起默认的计时器类提供了更高级的报告方法。

为了实现这一目标,你可能会查找应用中的所有位置来定位哪些地方使用了定时器类。由于你可能在很多地方都设置了该类的实例,以获取应用日常运行的性能日志,

这种查找-替换的工作可能会变得相当的耗时并且错误频发。这就是服务的用武之地。

取代了手动创建实例的操作,我们保留了一个中央控制类来为我们新建实例。该类的结构相当简单,仅仅包含了一个方法用于调度我们需要用作服务的每个类。

该方法只是返回了指定类的一个共享实例,用于所有依赖该类的地方以服务的形式来调用。从而我们可以用以下代码来取代每次都新建一个实例的方式:

$timer = \Config\Services::timer();

当你想要更改这一实现时,只需要更改服务的配置文件,从而在应用中就可以自动地进行变更替换,不需要任何其他操作。

现在你所需要的只是使用新的替换上来的类的特性,非常地简单且不易出错。

注解

我们推荐只在控制器里创建服务。在其他文件例如模型和库,应当依赖于构造函数或者 setter 方法的传参来实例化。

有两个方法被用于获取一个服务,这些方法都非常的方便。

第一个就是 service() 方法,该方法返回了指定服务的新的实例。唯一需要的参数就是服务名。

该方法与服务文件内部返回共享实例的方式是一样的,因此对该方法的多次调用总是会返回一个相同的实例:

$logger = service('logger');

如果创建的方法需要额外的参数,那么这些参数就应该在服务名后传递:

$renderer = service('renderer', APPPATH.'views/');

第二个方法 single_service() ,和 service() 一样调用,不过每次都会返回一个指定类的新的实例:

$logger = single_service('logger');

php4.0中文手册,服务 — CodeIgniter 4.0.0 中文手册|用户手册|用户指南|中文文档相关推荐

  1. php框架中uri路由机制,URI 路由 — CodeIgniter 3.1.5 中文手册|用户手册|用户指南|中文文档...

    URI 路由¶ 一般情况下,一个 URL 字符串和它对应的控制器中类和方法是一一对应的关系. URL 中的每一段通常遵循下面的规则: example.com/class/function/id/ 但是 ...

  2. php ci 表单校验,表单验证 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档

    表单验证详解 CodeIgniter 提供了一个全面的表单验证和数据预处理类以帮助缩减你所写的代码. 概述 在解释 CodeIgniter 的数据验证处理之前,让我们先描述一下一般的情况: 一个表单显 ...

  3. WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发

    继WSE3.0构建Web服务安全(1):WSE3.0安全机制与实例开发和WSE3.0构建Web服务安全(2):非对称加密.公钥.密钥.证书.签名的区别和联系以及X.509 证书的获得和管理之后,今天我 ...

  4. lavaral中文手册_Laravel-mix 中文文档

    概览 基本示例 larave-mix 是位于webpack顶层的一个简洁的配置层,在 80% 的情况下使用 laravel mix 会使操作变的非常简单.尽管 webpack 非常的强大,但大部分人都 ...

  5. Django2.0中文文档

    title: Django2.0中文文档 tags: Python,Django,入沐三分 grammar_cjkRuby: true --- Django2.0版本已经发布了,我们先来看一个图片 从 ...

  6. socket.io 中文手册 socket.io 中文文档

    socket.io 中文手册,socket.io 中文文档转载于:http://www.cnblogs.com/xiezhengcai/p/3956401.html 服务端 io.on('connec ...

  7. kafka中文文档(0.10.0)

    kafka中文文档(0.10.0) 作者:链上研发-老杨叔叔 时间:2016-07-22 版本:Apache Kafka 0.10.0 (2016年5月底发布) .目录 kafka中文文档0100 目 ...

  8. Solidity 最新 0.5.8 中文文档发布

    本文首发于深入浅出区块链社区 热烈祝贺 Solidity 最新 0.5.8 中文文档发布, 这不单是一份 Solidity 速查手册,更是一份深入以太坊智能合约开发宝典. 翻译说明 Solidity ...

  9. Apache Spark 2.2.0 中文文档 翻译活动

    为什么80%的码农都做不了架构师?>>>    Spark 2.2.0 已然发布(2017-07-11 发布) 5 天了,更新了一些新套路吧! 此版本从 Structured Str ...

最新文章

  1. 文本每行都应该换行——vi文件末尾自动换行,不会导致php输出空行
  2. winscp linux中文文件夹名称乱码,解决windows传送到linux下中文文件名及文件内容乱码问题...
  3. MySQL 语法问题:You can‘t specify target table ‘xxx‘ for update in FROM clause. 原因及解决方法
  4. Android Studio-目录结构
  5. linux不重启换root密码是什么原因,在Linux下修改和重置root密码的方法(超简单)
  6. Github排序(转载)
  7. java day38【Servlet 、HTTP协议 、Request】
  8. 微信好友只有昵称没有微信号_没微信号能找到人吗 只有微信昵称怎么找人
  9. R 语言数据分析/数据挖掘常用包
  10. JAVA操作docx文档
  11. 共轭先验分布及其应用
  12. 2019区块链将走向何方?硅谷知名投资大咖如是说
  13. 计算机专业面试银行的自我介绍,银行面试自我介绍1分钟
  14. Samsung Bada程序介绍——CurrencyShow
  15. java 中文分割_在java中只分割中文字符
  16. react 中样式写法
  17. “双一流”哈尔滨工程大学成立人工智能有关学院,打造一流学科群!
  18. Word文档封面填写打字时字体下方出现空格如何解决
  19. 怎么在手机上赚钱?分享5个赚钱方法,生活费是足够了!
  20. 20年9月wust招新赛writeup

热门文章

  1. 高德地图+Serverless 护航你的假日出行
  2. linux java sqlldr_oracle在linux如何安装sqlldr
  3. 从入门到入土:Python实现爬取某站视频|根据视频编号|支持通过视频名称和创作者名称寻找编号|以及python moviepy合并音频视频
  4. SQL注入学习part06:(结合sqli-libs学习:51-61关)
  5. 新年第一份“欧气”,“中国开发者大调查”第五批中奖名单出炉啦
  6. 编程网站 Perl.com 被劫,售价 19 万美元
  7. 马斯克火箭 SpaceX-API、程序员优雅赚钱项目……GitHub 热点速览
  8. 如何构建一个交互式数据分析 Web 应用?
  9. 详实!DevOps 最新现状研究报告解读 | 原力计划
  10. 连登 GitHub TOP 榜,中国开发者在行动!