原文链接,猛击这里。

php中self与static的区别

通过一些示例,我们可以很容易看出self和static的区别。假定我们有class Car – 它有两个方法,model和getModel。注意,这里我们使用了关键字self。

class Car {

public static function model() {

self::getModel();

}

protected static function getModel() {

echo "I am a Car!";

}

}

调用静态方法

Car::model();

得到输出

I am a Car!

关键字self使得我们调用了class Car的getModel方法,输出了文本“I am a Car!”。

下面我们添加一个新的类,class Mercedes, 它继承自class Car,代码如下:

class Mercedes extends Car {

protected static function getModel() {

echo "I am a Mercedes!";

}

}

当我们调用Mercedes::model()时,猜猜结果是什么?

可能你觉得结果会是:

I am a Mercedes!

但实际输出是:

I am a Car!

这是为什么呢?

对于self的解释

关键字“self”的工作原理是:它会调用当前类(current class)的方法。因为model方法只在class Car中定义的,所以对它来说当前类就是class Car。model中的self::getModel(),调用的自然也就是class Car中的getModel方法。

这个行为似乎不是我们想要的,它不符合面向对象的设计原则。如何解决呢?可以使用关键字static。

static关键字和延迟静态绑定(late static binding)

在PHP5.3中,加入了一个新的特性,叫做延迟静态绑定。它可以帮我们实现多态,解决上面的问题。简单来说,延迟静态绑定意味着,当我们用static关键字调用一个继承方法时,它将在运行时绑定调用类(calling class)。在上面的例子中,如果我们使用延迟静态绑定(static),意味当我们调用“Mercedes::model();”时,class Mercedes中的getModel方法将会被调用。因为Mercedes是我们的调用类。

延迟绑定的例子

class Car {

public static function model() {

static::getModel();

}

protected static function getModel() {

echo "I am a Car!";

}

}

我们只是将class Car中的self替换成了static,并未对class Mercedes作修改。

现在我们调用

Mercedes::model();

得到输出

I am a Mercedes!

php 5.3以下的版本无法使用延迟静态绑定

注意,php 5.3之前的版本无法使用延迟静态绑定。如果尝试在php 5.3以下的版本运行上面的例子,将会报错。

php中的self和static

现在我们将例子中的self用static替换,可以看到,两者的区别在于:self引用的是当前类(current class)而static允许函数调用在运行时绑定调用类(calling class)。

PHP中self和static的区别,php中self与static的区别相关推荐

  1. Java中普通代码块,构造代码块,静态代码块区别

    Java中普通代码块,构造代码块,静态代码块区别及代码 示例 //执行顺序:(优先级从高到低.)静态代码块>mian方法 >构造代码块>构造方法. 其中静态代码块只执行一次.构造代码 ...

  2. “ static”关键字在课程中做什么?

    具体来说,我正在尝试以下代码: package hello;public class Hello {Clock clock = new Clock();public static void main( ...

  3. java中字符流 字节流_理解Java中字符流与字节流的区别

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个"流动的方向",通常可 ...

  4. java static调用吗_Java中的static的使用

    1.Java 中被static修饰的成员称为静态成员或类成员.它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享.且优先于对象存在.静态成员可以使用类名直接访问,也可以使用对象名进行访问.使 ...

  5. Java中抽象类和接口在概念、语法和应用上的区别和关系

    2019独角兽企业重金招聘Python工程师标准>>> 春招开始了,盆友们都忙着准备笔试.准备面试,复习学过的知识点,当然我也不例外,在这里祝每一个"有心人"心想 ...

  6. java null和 的区别_java中null和的区别

    null和""的区别 问题一: null和""的区别 String s=null; string.trim()就会抛出为空的exception String s ...

  7. C|C++中的静态全局变量,静态局部变量,全局变量,局部变量的区别

    static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. 面向过程设计中的static 全 ...

  8. C#中的数组和C++中数组的区别

    c#中的数组和c++中数组的区别 c#中数组是引用类型,c#定义整型数组方式是:int [] intarray = {1,2,3};或int [] intarray = new int[10];而c+ ...

  9. java循环do while_Java中for、while、do while三种循环语句的区别介绍

    这篇文章主要介绍了Java中for.while.do while三种循环语句的区别介绍的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 本文通过实例讲解给大家介绍Java中for.whil ...

  10. JAVA中几种循环结构的表示_本文通过实例讲解给大家介绍Java中for、while、do while三种循环语句的区别,具体详情如下所示:第一种:for循环 循环结构for语句的格式...

    本文通过实例讲解给大家介绍Java中for.while.do while三种循环语句的区别,具体详情如下所示: 第一种:for循环 循环结构for语句的格式: for(初始化表达式;条件表达式;循环后 ...

最新文章

  1. 制作嵌入式根文件系统(常见问题详解)
  2. AUTOSAR从入门到精通100讲(四十一)-基于AUTOSAR与Matlab开发应用层三部曲-应用层总体功能开发和集成
  3. 写给程序员的裁员防身指南
  4. in会让mysql索引失效吗_mysql的in会不会让索引失效?
  5. 53 FI配置-财务会计-固定资产-折旧-维护折旧码
  6. Windows Server Version 1709 管理之入门篇 1
  7. C#开发笔记之12-如何用C#统计子字符串出现的次数?
  8. C++ lock 加锁,解锁
  9. 【第152期】游戏策划:给@不五的简历分析
  10. 基于xxx的系统实现
  11. 麻瓜编程python_麻瓜编程 - 主页
  12. 巴特沃斯数字低通滤波器的设计步骤
  13. 主角把异能开发计算机,不容错过的超能力游戏,最厉害的甚至能操控时间!
  14. Linux du命令详解
  15. 算法图解第七章狄克斯特拉算法读书笔记
  16. php排行榜系统,cms排行_PHP CMS系统排行榜
  17. 【Matlab图像拼接】块匹配全景图像拼接【含源码 742期】
  18. 福建公共交易平台portal-sign
  19. 模式识别和机器学习有必要学么_【视觉】机器视觉表面缺陷检测综述(下)
  20. ubuntu16.04 x64 安装PPSSPP1.1.1

热门文章

  1. NLP.TM | GloVe模型及其Python实现
  2. PLsql连接centos7上的Oracle的连接超时的解决方发
  3. LeetCode简单题之字符的最短距离
  4. 面试高频!JVM必备教程~
  5. XLearning - 深度学习调度平台
  6. 物联网安全只有最薄弱的环节才有保障
  7. Android 如何防止用户同时点击多个控件问题
  8. Fragment 使用 show 和 hide 的方式实现切换 以及切换的时候Fragment 生命周期
  9. 微信小程序设置字体上下左右居中
  10. SQL Server中Identity标识列