PHP的'静态延迟绑定'

今天,几个朋友在一起吹牛逼,一个朋友问我什么是静态绑定,我当时懵逼了,后面回来一查,这玩意儿不就是以前写代码的时候用到过的吗,不废话了,遇到了就总结一次吧。

先看下面的代码:

class MainSearch{
        const LENGTH = 1000;
        public function get(){
                echo slef::LENGTH;
        }
}

class SpSearch extends MainSearch{
        const LENGTH = 200;
}

$spSearch = new SpSearch();
$spSearch->get();
//注意这个时候我们理想是输出200,但是实际是输出1000;
//Chen@DESKTOP-02BVSM6 MINGW64 /d/php
//$ php static.php
//1000

这个时候我们怎么才能输出初始化的类中的LENGTH=200呢,我们用static关键字,static这个关键字是从php5.3开始后支持这样操作(静态延迟绑定),看下面代码。

class MainSearch{
        const LENGTH = 1000;
        public function get(){
                echo static::LENGTH;
        }  
}

class SpSearch extends MainSearch{
        const LENGTH = 200;
}

$spSearch = new SpSearch();
$spSearch->get();
//这个时候就输出了200
//Chen@DESKTOP-02BVSM6 MINGW64 /d/php
//$ php static.php
//200

如果我们把get()方法放到SpSearch这个类中又是怎么样的呢,让我们看下面的代码:

class MainSearch{
        const LENGTH = 1000;
}
class SpSearch extends MainSearch{
        const LENGTH = 200;
        public function get(){
                echo self::LENGTH;
        }
}

$spSearch = new SpSearch();
$spSearch->get();
//最后结果输出200,我们把self换为static结果也输出200.

自己的总结:

  • 针对类中的self调用,无论是实例化该类的子类,还是本身,都是调用存在self类中的数据,如果存在self的类中没有,则依次向上取父类中的对应的self调用,如果没有,则报错。
  • 针对类中的static调用,无论是实例化该类的子类还是该类,都是调用实例化类中对应的static调用的值,如果实例化的类中没有,则向上取父类中对应的static调用,如果没有,则报错。

理解有什么错误望大家指出。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,758评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,869评论 18 139
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,762评论 0 9
  • 一:java概述: 1,JDK:Java Development Kit,java的开发和运行环境,java的开发...
    慕容小伟阅读 1,830评论 0 10
  • 原创 2017-07-23 Jane 看美剧学英语 We belong to nobody, and nobody...
    看美剧学英语阅读 955评论 0 0