PHP延迟静态绑定的深入讲解

 更新时间:2018年04月02日 11:41:34   作者:JellyThink  
这篇文章主要给大家介绍了关于PHP延迟静态绑定的相关资料,这是最近工作中遇到的一个功能,通过查找相关的资料整理了这篇文章,分享出来供大家参考学习,需要的朋友们下面随着小编来一起学习学习吧。

前言

所谓延迟静态绑定,顾名思义,静态调用时::符号左侧的部分的的绑定是延迟,也就是说不再被解析为定义当前方法所在的类,而是在实际运行时计算的。本文主要介绍了关于PHP延迟静态绑定的相关内容,下面话不多说了,来一起看看详细的介绍吧。

嗅到了坏的味道

这段时间看项目后台的PHP代码,看到了类似于以下的一段代码,我把它抽出来:

<?php
 class DBHandler {
  function get() {}
 }

 class MySQLHandler extends DBHandler {
  // 这里一个create
  public static function create() {
   echo "MySQL";
   return new self();
  }
  public function get() {
   echo "MySQL get()";
  }
 }

 class MemcachedHandler extends DBHandler {
  // 这里又有一个create
  public static function create() {
   echo "Memcached";
   return new self();
  }
  public function get() {
   echo "Memcached get";
  }
 }

 function get(DBHandler $handler) {
  $handler->get();
 }
 $dbHandler = MySQLHandler::create();
 get($dbHandler);
?>

有没有嗅到坏代码的味道?可以看到,在MySQLHandler和MemcachedHandler类中,都有一个create函数,除掉我的输出语句,发现它们一模一样,这就是代码冗余。是的,需要进行代码重构。

进行简单的重构

代码重构无处不在,只要你想,你觉的有改进,就需要敲起键盘开始干活。来吧,对上面的代码进行重构,如下:

<?php
 class DBHandler {
  public static function create() {
   echo "create";
   return new self();
  }
  function get() {}
 }

 class MySQLHandler extends DBHandler {
  public function get() {
   echo "MySQL get()";
  }
 }

 class MemcachedHandler extends DBHandler {
  public function get() {
   echo "Memcached get";
  }
 }

 function get(DBHandler $handler) {
  $handler->get();
 }
 $dbHandler = MySQLHandler::create();
 get($dbHandler);
?>

将create函数移到DBHandler类中,看起来还不错,至少少了一坨那糟糕的代码。

貌似是错的

运行一下,却发现,并没有打印出我们期望的 MySQL get()  。什么情况?这说明,并没有调用MySQLHandler的get函数,但是代码明明调用了啊,这说明, new self() 这句代码有问题。这有什么问题?这就需要说到今天总结的重点了————延迟静态绑定。

延迟静态绑定

在PHP5.3以后引入了延迟静态绑定。再看下面这段代码:

<?php
 class A {
  public static function who() {
   echo __CLASS__;
  }
  public static function test() {
   self::who();
  }
 }

 class B extends A {
  public static function who() {
   echo __CLASS__;
  }
 }
 B::test();
?>

上面的代码输出了A,但是我希望它输出B,这就是问题的所在。这也是 self 和 __CLASS__ 的限制。使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类。所以,这就很好的解释了为什么上面的代码输出了A。但是,如果我们需要输出B呢?可以这么干:

<?php
 class A {
  public static function who() {
   echo __CLASS__;
  }
  public static function test() {
   static::who(); // 这里有变化,后期静态绑定从这里开始
  }
 }

 class B extends A {
  public static function who() {
   echo __CLASS__;
  }
 }
 B::test();
?>

后期静态绑定本想通过引入一个新的关键字表示运行时最初调用的类来绕过限制。简单地说,这个关键字能够让你在上述例子中调用 test() 时引用的类是 B 而不是 A。最终决定不引入新的关键字,而是使用已经预留的 static 关键字。

这就是后期静态绑定的根本————static关键字的另类用法。对于文章一开始的例子,可以这么改:

return new static(); // 改变这里,后期静态绑定

这种使用后期静态绑定,在使用PHP实现23中设计模式的时候,你会感到很轻松的。

总结

就是一个很简单的知识点,但是却非常有用,总结起来,还是查了一些资料,补充一下知识点。温故而知新。好了,希望对大家有帮助。如果大家有什么建议,让我的文章写的更好,尽管提出来,我需要大家的帮助。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • PHP数组内存耗用太多问题的解决方法

    PHP数组内存耗用太多问题的解决方法

    一般来说,PHP数组的内存利用率只有 1/10, 也就是说,一个在C语言里面100M 内存的数组,在PHP里面就要1G。特别是在PHP作为后台服务器的系统中,经常会出现内存耗费太大的问题。
    2010-04-04
  • php 判断服务器操作系统的类型

    php 判断服务器操作系统的类型

    本篇文章主要是对php判断服务器的操作系统类型方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-02-02
  • 如何使用PHP对象POPO来优化你的代码

    如何使用PHP对象POPO来优化你的代码

    如果您熟悉Java,可能您已经知道POJO(普通Java类). 因为POJO这个词最早是由Martin Fowler、Rebecca Parsons 和 Josh MacKenzie 于 2000 年在 Java 编程语言上创造的。 POJO 使我们更容易理解类对象中的数据结构类型。本文将详细介绍如何使用PHP对象POPO来优化你的代码。
    2021-05-05
  • php header 详细使用说明与使用心得

    php header 详细使用说明与使用心得

    下面是关于header函数的详细使用说明
    2009-11-11
  • php array_map()函数实例用法

    php array_map()函数实例用法

    在本篇文章里小编给大家分享了一篇关于php array_map()函数实例用法,有兴趣的朋友们可以学习下。
    2021-03-03
  • php基础字符串与数组知识点讲解

    php基础字符串与数组知识点讲解

    通过老师的授课,发现JS的字符串与数组的操作与PHP的非常类似,可以相互借鉴学习,一方面是可以快速理解函数用法,另一个是相互印证相互提高了
    2022-11-11
  • 从Web查询数据库之PHP与MySQL篇

    从Web查询数据库之PHP与MySQL篇

    PHP+MySQL的组合是构建网站的一个常见搭配,不过如何使用PHP通过Web访问MySQL数据库呢?下面从Web数据库架构的工作原理讲起。
    2009-09-09
  • 详解WordPress开发中get_header()获取头部函数的用法

    详解WordPress开发中get_header()获取头部函数的用法

    这篇文章主要介绍了详解WordPress开发中get_header()获取头部的用法,get_header()函数在WordPress主题的制作中一定会用到,需要的朋友可以参考下
    2016-01-01
  • php实现zip文件解压操作

    php实现zip文件解压操作

    这篇文章主要介绍了php实现zip文件解压操作的函数代码,每一条函数代码都有对应的文字注释,需要的朋友可以参考下
    2015-11-11
  • php常用表单验证类用法实例

    php常用表单验证类用法实例

    这篇文章主要介绍了php常用表单验证类用法,实例分析了php针对表单元素常用验证技巧,需要的朋友可以参考下
    2015-06-06

最新评论