【转】PHP中的后期静态绑定(Late Static Bindings )

php5.3版本新增的静态绑定的静态绑定语法,也成为PHP的后期静态绑定,如下


class A{
    public static function func1(){
        echo __CLASS__.PHP_EOL;
    }

    public static function test(){
        self::func1();
    }
}

class B extend A{
    public static function func1(){
        echo __CLASS__.PHP_EOL;  //__CLASS__是当前类的名称
    }
}

B::test();

结果:A

但是,既然B继承了A,并重写了A的func1,那么如果想让test中执行的是B中的func1要怎么做呢?于是,php5.3使用了预留的static关键字,将上述代码中的test函数改成这样:

public static function test(){
        static::func1();
} 
结果:B

也就是说:static::实现了后期静态绑定,static::对应的变量不再是当前类的变量,而是由最终运算时动态决定的(也可以说从堆里面提取出来的关键字)。

同时,在这个学习的过程中,我还发现另外一个用法:new static() 和 new self(), 同样的,new static 就是实例化最终继承的类,而new self就是实例化当前类, new parent就是实现当前类的父类了。

好了,顺便提一下形如这种格式的用法有三种: “self::”、”parent::”、”static::”;

原文地址:https://www.cnblogs.com/cfYu/p/9520689.html

时间: 2024-09-29 08:28:30

【转】PHP中的后期静态绑定(Late Static Bindings )的相关文章

php Late Static Bindings延迟静态绑定

官网说道: As of PHP 5.3.0, PHP implements a feature called late static bindings which can be used to reference the called class in a context of static inheritance. More precisely, late static bindings work by storing the class named in the last "non-forw

PHP中的后期静态绑定

<?php class A { public static function foo() { static::who(); } public static function who() { echo __CLASS__."\n"; } } class B extends A { public static function test() { /*A::foo(); A::foo(); B::foo();*/ A::foo(); parent::foo(); self::foo()

PHP 中 parent、self、static、$this 的区别 &amp; 后期静态绑定详解

自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类. 虽然也可以调用非静态方法,但是不会在运行时绑定. static 不再只是简单的静态修饰关键字.而是还可以调用类的静态方法,非静态方法,为什么静态非静态要分开说呢,因为调用的效果是不一样的. 实例 1 class A { 2 3 protected $name = 'A'; 4 static $alias = 'a'; 5 const HASH = 'md5'; 6 7 public func

get_called_class--后期静态绑定(&quot;Late Static Binding&quot;)类的名称

get_called_class--后期静态绑定("Late Static Binding")类的名称 string get_called_class ( void ) 获取静态方法调用的类名. 返回类的名称,如果不是在类中调用则返回 FALSE. <?php class Person{    public $username;    public $age;    public $height;    public $weight;    static public $numb

php面向对象编程笔记static的后期静态绑定

最近在看laravel的源码,开始的时候static关键字的用法让我读完一头雾水, static不应该是用来定义静态变量方法和属性的么? 在方法中 static::setInstance($this); 是什么? 查了手册才明白,这是static关键字的另一种用法,"后期静态绑定",也可以称为"静态绑定" http://php.net/manual/zh/language.oop5.late-static-bindings.php 官方的介绍: 该功能从语言内部角度

PHP的后期静态绑定

self 是个孝子 不管后来 谁是它的领导(调用它)  谁生了它  它就听谁的 子类调用父类的方法 self 的生存空间是父类 不管是不是子类调用 我生在哪 我就在哪个类里面找属性/方法 static  就是所谓的后期静态绑定 static 一切听命令  是谁调用的它  它就听谁的 子类调用的 我就找子类的属性/方法 我不管我(代码) 是不是写在父类里面

【原】iOS 设计中 图片后期简单处理的完美组合

iOS 设计中 图片后期简单处理的完美组合 四张图+.DS_Store (3张alpha通道“是”,1张没有alpha通道) 5,909,971 字节(磁盘上的 5.9 MB),共 5 项 第一步:转非alpha通道,工具 Alpha-Channel-Remover https://github.com/bpolat/Alpha-Channel-Remover  这个地址就哦了 http://alphachannelremover.blogspot.com 这个墙内墙外都试过没打开 转完后:变小

Java和Android中,代码块、static静态代码块的执行顺序

Java和Android中,代码块.static静态代码块的执行顺序有没有什么区别呢. Java 先来个简单的例子 Main.java: public class Main { static int a = 1; static { System.out.println(a); } static { a = 2; } public static void main(String[] args) { System.out.println("Hello World!"); System.ou

PHP中new self()和new static()的区别探究

1.new static()是在PHP5.3版本中引入的新特性. 2.无论是new static()还是new self(),都是new了一个新的对象. 3.这两个方法new出来的对象有什么区别呢,说白了就是new出来的到底是同一个类实例还是不同的类实例呢? 为了探究上面的问题,我们先上一段简单的代码: class Father { public function getNewFather() { return new self(); } public function getNewCaller