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

最近在看laravel的源码,开始的时候static关键字的用法让我读完一头雾水,

static不应该是用来定义静态变量方法和属性的么?

在方法中

static::setInstance($this);

是什么?

查了手册才明白,这是static关键字的另一种用法,“后期静态绑定”,也可以称为“静态绑定”

http://php.net/manual/zh/language.oop5.late-static-bindings.php

官方的介绍:

该功能从语言内部角度考虑被命名为“后期静态绑定”。“后期绑定”的意思是说,static:: 
不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。

官方的几个例子很好的说明了后期静态绑定的意思

self::的限制

使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类:

Example #1 self:: 用法

<?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

后期静态绑定的用法

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

Example #2 static:: 简单用法

<?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();
?>

输出:B

在这里static相当于self,parent一样的关键字,用来调用方法,不过与self不同,static调用的类并不一定是静态属性和静态方法,这点上看更接近于parent这个关键字的用法。

but,在下面的例子了还看到这样一种用法

<?php
class Model
{
    public static function find()
    {
        echo static::$name;
    }
}
class Product extends Model
{
    protected static $name = ‘Product‘;
}
Product::find();
?>

在父类里并未定义$name这个属性,这时候在子类里必须

static $name

不过一般程序应该不会出现这种父类没定义属性而直接使用的情况吧。

-----------------------------------------------------------------------------------------------------------

另外,测试例子的时候想到这么一个情况

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

非静态方法可以调用静态方法,反之则不行


laravel设计模式中大量使用了这种静态绑定的方法,尤其是核心功能Facades。

php面向对象编程还有很多东西需要了解。。。

时间: 2024-10-06 05:56:49

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

面向对象编程笔记--static

通过static方法,提供静态的不需要实例化即可访问的方法或属性.所有的调用者可以使用同一个类(不实例化)或对象(只实例化一次),可以应用的场景: 1)各个调用者共享数据,协同工作. 2)对象只可以实例化一次. 3)被调用对象的生命周期 与调用者无关.或者说,该对象有全局的生命周期,持续工作,提供给调用者的只是一个接口. 类的实例由类自己来维护,对外提供一个 取实例的一个方法. 典型代码: public class TestClass { //维护的实例 private static TestC

JavaScript面向对象编程笔记

<!DOCTYPE html> <html> <head> <title>面向对象编程</title> <script type="text/javascript"> var person = {};//或者这样:var person = new Object(); person.name = "张三"; person.age = 20; //函数充当属性,属性变方法了! person.info

【python】python 面向对象编程笔记

1. 类的创建 类是一种数据结构,我们可以用它来定义对象,后者把数据值和行为特性融合在一起.类是现实世界的抽象的实体以编程形式出现.实例是这些对象的具体化. 类名通常由大写字母打头.这是标准惯例 class First(): pass if __name__ == '__main__': f = First() f.x = 3 f.y = 5 print(f.x + f.y ) 2. 方法 self 参数,它在所有的方法声明中都存在.这个参数代表实例对象本身,当你用实例调用方法时,由解释器悄悄地

面向对象编程(七)——Static关键字

Static变量 ◆在类中,用static声明的成员变量为静态变量,或者叫:类属性.类变量. (注意:静态变量是从属于类,在对象里面是没有这个属性的:成员变量是从属于对象的,有了对象才有那个属性) 它为该类的公用变量,属于类,被该类的所有实例共享,在类被载入时被显示初始化. 对于该类所有对象来说,static成员变量只有一份.被该类的所有对象共享!! 可以使用“对象.类属性”来调用.不过,一般都是用"类名.类属性”. static变量置于方法区中. 在静态的方法里面不可以调用非静态的方法或变量:

js面向对象编程笔记

1. 基础 面向对象实例 function Lecture(name, teacher) { this.name = name; this.teacher = teacher; } Lecture.prototype.display = function () { return this.teacher + ' is teaching ' + this.name; } //var le = new Lecture('数学', '李四'); //console.log(le.display());

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

PHP面向对象编程 对象的基本概念

再次梳理一下面向对象编程的要点. 此文是以php为例,但思想是通用的. 总结的PHP面向对象编程笔记 对象的基本概念 对象的基本构成 对象包含两部分 一.对象的组成元素 是对象的数据模型,用于描述对象的数据. 又被称为对象的属性,或对象的成员变量. 二.对象的行为 是对象的行为模型,用于描述对象能够做什么. 又被称为对象的方法. 对象的特点 1 每个对象都是独一无二的 2 对象是一个特定事物,他的职能是完成特定功能 3 对象是可以重复利用的 面向对象的基本概念 面向对象就是在编程的时候数据结构形

面向对象编程(十二)——final关键字

阅读目录 final关键字final修饰变量final修饰方法final修饰类Final && Static 总结 final关键字 Java关键字final有"这是无法改变的"或者"终态的"含义,它可以修饰非抽象类.非抽象类成员方法和变量. 在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量). 回到顶部 final修饰变量 final修饰变量:该变量变成常量 对于一个final变量,如果是基本数据类型的变量,则其数值

C++ Primer 学习笔记_35_面向对象编程(6)--虚函数与多态(三):虚函数表指针(vptr)及虚基类表指针(bptr)、C++对象模型

C++ Primer 学习笔记_35_面向对象编程(6)--虚函数与多态(三):虚函数表指针(vptr)及虚基类表指针(bptr).C++对象模型 一.虚函数表指针(vptr)及虚基类表指针(bptr) C++在布局以及存取时间上主要的额外负担是由virtual引起的,包括: virtual function机制:用以支持一个有效率的"执行期绑定": virtual base class:用以实现多次在继承体系中的基类,有一个单一而被共享的实体. 1.虚函数表指针 C++中,有两种数据