写程序的人都喜欢偷懒,希望少打几行代码,并且让代码看起来很酷。

所以很多人写程序都会选择三元运算取代if..else...。

而用过JS的人应该都见识过js中的链式方法。

如 somevars.func().func2().func3()...funcN();

这样的写法使得代码更简练,并且作用关系一目了然。

那么在php中可以这么做么,显然也是可以的,但是php与js的差别是,在js中变量本身具有对象的性质,但是php的变量却不是。

所以解决方法就是让php的变量变成一个对象。

代码如下:

  1. <?php
  2. error_reporting(E_ALL | E_STRICT);
  3. /**
  4. * PHP-OOP_VAR 让php的变量变成一个对象
  5. *
  6. *
  7. * @version 0.0.1
  8. * @author momodev
  9. * @website http://momodev.blog.51cto.com
  10. * @license GPL v3 - http://vork.us/go/mvz5
  11. */
  12. Abstract Class Base_OOP_VAR{
  13. /**
  14. * 追溯数据,用来进行调试
  15. * @var array
  16. */
  17. private $_trace_data = array();
  18. /**
  19. * 保存可用的方法列表
  20. * @var array
  21. */
  22. protected $_methods = array(
  23. );
  24. /**
  25. * 数据本身
  26. * @var null
  27. */
  28. protected $data;
  29. /**
  30. * 初始化变量
  31. * @param var
  32. * @return void
  33. */
  34. public function __construct($data){
  35. $this->data = $data;
  36. $this->_trace_data['__construct'] = $data;
  37. return $this->data;
  38. }
  39. /**
  40. * 魔术方法,当试图对对象进行打印如 echo 或print的时候,调用这个方法
  41. *
  42. * 比如:
  43. * $a = new stdClass;
  44. * echo $a;
  45. * 等价于 echo $a->__toString();
  46. *
  47. * @return $data
  48. */
  49. public function __toString(){
  50. if(is_int($this->data) || is_float($this->data))
  51. $this->data = (string)$this->data;
  52. return $this->data;
  53. }
  54. /**
  55. * 魔术方法,当试图调用一个不存在的方法时,这个函数会接管这个请求
  56. *
  57. * 比如
  58. * $a= new stdClass;
  59. * $a->output();
  60. * 等价于
  61. * $a->__call("output");
  62. *
  63. * @return object
  64. */
  65. public function __call($name,$args){
  66. $this->vaild_func($name);
  67. if(!$args) $args = $this->data;
  68. $this->data =  call_user_func($name,$args);
  69. $this->_trace_data[$name] = $this->data;
  70. return $this;
  71. }
  72. /**
  73. * 检查方法是否是有效的
  74. * @params string $name
  75. * @return void
  76. */
  77. private function vaild_func($name){
  78. if(!in_array($name,$this->_methods)){
  79. throw new Exception("invaild method");
  80. }
  81. }
  82. /**
  83. * 对数据进行追溯
  84. * 比如
  85. * $a = new String(" Hello World");
  86. * $a->trim()->strlen();
  87. * 在调用trim的时候,实际上把前后的空格给去掉了,所以数据是
  88. * Hello World
  89. * 在调用strlen的时候
  90. * 得到了一个字符串长度的值
  91. * 追溯数据方便检查在哪个环节数据出现了问题
  92. *
  93. * @return string
  94. */
  95. public function trace(){
  96. echo "<pre>";
  97. var_dump($this->_trace_data);
  98. echo "</pre>";
  99. }
  100. }
  101. /**
  102. * ex. 怎么来使用这个抽象类
  103. *
  104. * 声明一个字符串对象
  105. * class String extends Base_OOP_VAR{
  106. *  //添加可用的方法
  107. *  protected $_methods = array(
  108. *      'trim',
  109. *      'strlen',
  110. *      'gettype'
  111. *  );
  112. *
  113. * }
  114. * //使用这个对象
  115. * $a = new String(" Hello world");
  116. * echo $a->trim()->strlen()->gettype();
  117. * $a->trace();
  118. * //调试的数据类似这样
  119. * array(4) {
  120. *      //初始化时的数据
  121. *      ["__construct"]=> string(12) " Hello world"
  122. *      //去除前后空格的数据
  123. *      ["trim"]=> string(11) "Hello world"
  124. *      //代表字符串长度的数据
  125. *      ["strlen"]=> int(11)
  126. *      //代表字符串类型的数据
  127. *      ["gettype"]=> string(7) "integer"
  128. *  }
  129. *
  130. *
  131. *
  132. *
  133. **/

同时我已经把这个文件放在了github上,欢迎童鞋们fork

https://github.com/momodev/PHP-OOP_VAR

转载于:https://blog.51cto.com/momodev/843999

如何在PHP中实现链式方法调用相关推荐

  1. 链表list(链式存储结构实现)_VOL.2 如何在python中实现链式存储结构

    一.前言 链式存储作为一种重要的数据存储方式有着极强的数据组织能力.灵活型和动态性,在众多数据结构中应用非常广泛.所谓链式存储结构,就是采用分散的存储空间分别存储每一组数据再通过地址链接的形式将全部数 ...

  2. idea java代码格式化_intellij Idea中的Java代码格式化(链式方法调用)

    我对Intellij Idea 14.1.4中的 java代码格式有一个小问题. 我有一段由我手动格式化的代码,对我来说很好看: public class Test { private static ...

  3. C#中扩展StringBuilder支持链式方法

    本篇体验扩展StringBuilder使之支持链式方法. 这里有一个根据键值集合生成select元素的方法. private static string BuilderSelectBox(IDicti ...

  4. java链式编程_Java 中的链式编程

    前言 ​在写项目的时候,有一个实体类有好多个属性,new 出来之后需要不停的使用setXXX( )方法,效率低而且代码可读性差,查询了下发现可以实现实体类的链式编程. public class Use ...

  5. java 内联调用深度_Java中内联虚拟方法调用的性能

    java 内联调用深度 总览 动态编译的好处之一是它能够支持在虚拟方法代码上的广泛方法内联. 内联代码可提高性能时,代码仍必须检查类型(以防由于优化而更改了类型)或在多个可能的实现之间进行选择. 这导 ...

  6. React中MUI初始化和方法调用

    React中MUI初始化和方法调用 step1:引用 npm install @mui/material @emotion/react @emotion/styled step2:D:\vue\unt ...

  7. 如何在 C# 中使用隐式和显式操作符

    C# 有一个鲜为人知的特性是通过定义 显式和隐式操作符 实现类型之间的转换,这篇文章我们将会讨论如何使用这些 显式 和 隐式 操作符. 什么是显式,什么是隐式 隐式类型转换 它是运行时自动帮你完成的, ...

  8. 基于mybatis-generator代码生成工具改(链式方法实体版)

    概述 一直以来使用原生mybatis-generator的我发现有一个地方很不方便,即它生成的实体类的set方法返回值是void,而目前比较流行的则是链式set的写法,即set方法返回值不再是void ...

  9. python列出所有方法_如何在python中列出所有Faker方法

    如何以编程方式列出Faker生成器对象中的所有可用方法? Faker文档显示了如何创建faker生成器并生成数据: from faker import Faker fake = Faker() fak ...

最新文章

  1. 深度学习笔记之《解析卷积神经网络》附下载地址
  2. windows2003时间同步更新脚本
  3. Spring Boot 应用监控:Actuator与 Admin
  4. 面试必会:HashMap 实现原理解读
  5. leetcode453. 最小操作次数使数组元素相等(贼难的简单题)
  6. 高性能缓存服务器Varnish架构配置
  7. 将packages/apps/下的app导入eclipse
  8. Android 11正式版发布!
  9. Python操作MySQL(二) ORM篇
  10. 磁盘不见了只剩一个c盘_极简后,我家只剩一个垃圾桶
  11. 检测网络端口和刷新本地DNS
  12. 【爬虫】python爬取微信公众号
  13. 2020全国各地男女身高排行出炉,从数据看南北差异到底有多大?
  14. 达梦数据库(DM8)初次使用及DCA考试体会
  15. 小水智能-智能楼宇智慧建筑3D可视化系统,实现对实时数据的整合处理
  16. 编写类的步骤编写测试类
  17. 浅谈计算机领域及职业憧憬
  18. NVIDIA Jetson: GStreamer 和 openMAX(gst-omx) 插件
  19. 计算机组成原理DROM,最新版 计算机组成原理试题及答案a
  20. delphi 验证码图片

热门文章

  1. 网页修改iPhone13在线源码 – 无需SVIP
  2. MeEdu - 开源在线教育点播系统。
  3. SpringBoot FK-关联表查询(二)
  4. ASP.NET MVC实用技术:开篇
  5. 网站安全之XSS漏洞攻击以及防范措施
  6. 清除浮动的最佳方案:clearfix
  7. 如何使用HTML5嵌入视频
  8. UILabel使用自定义字体
  9. Magento 安装教程
  10. C——printf和scanf返回值问题