延迟静态绑定——static

起因

乍听之下这名词很新鲜,各位听众继续往下走就知道其实你们是见过的。最近在看《PHP面向对象实践与设计》中讲到了延迟静态绑定static 的用法,特此来和大家分享,应该是比较简单的内容吧。

直接上代码

/**
 * 功能:子类(学生类,老师类)实例化自己的类
 *
 */
abstract class People
{

}

class Student extends People {

    public static function create()
    {
        return new self();
    }
}

class Teacher extends People {

    public static function create()
    {
        return new self();
    }
}

var_dump(Student::create());

一般情况下,咱们首先想到的是上面的写法,可以我们程序员是“懒惰”的,不可以可以在父类的只写一个create()方法呢,那么大家会首先想到的self()关键字吧(嘿嘿,至少我当时是这么想的),那我们是实现一下看看:

 /**
 * 功能:子类实例化自己的类
 *
 */
abstract class People
{
    public static function create()
    {
        return new self();
    }
}

class Student extends People {

}

class Teacher extends People {

}

var_dump(Student::create());

结果:Fatal error: Uncaught Error: Cannot instantiate abstract class People

这个时候就是我们的主角static登场的时候,修改代码如下:

/**
 * 功能:子类实例化自己的类
 *
 */
abstract class People
{
    public static function create()
    {
        return new static();
    }
}

class Student extends People {

}

class Teacher extends People {

}

var_dump(Student::create());

结果: 很完美的输出了Student类。

结论

哦,原来如此,是因为self关键字指向是当前类(即所在的类)的指针,它所在的People是抽象类,不能实例化的,他并没有想咱们所想的那样,指向调用者本身(即Student类)。而static 关键字,延迟静态绑定,它所指向的即使调用者本身 (即Student类)。

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 5年前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 7

php 的类要搞这么多关键字,估计学java学得吧。我真不知道静态方法和非静态方法的区别

5年前 评论

Eloquent 优雅的 User::where() 就是用 new static 实现的

5年前 评论

@xuanjiang1985 ,我是这样理解的:

  1. 面向对象的产生是为了解决当一个项目变大的时候,程序设计如何实现功能之间的解耦,代码最优等等问题。每一个关键字产生都是为了解决一类问题的。文中举的例子让你实现你会如何实现呢?

  2. 静态方法与非静态的方法的区别我理解的不深,无法解答你。
5年前 评论
ruke

laravel中的Facade就是用static实现的. 实现了类的方法静态调用

5年前 评论
ruke
5年前 评论
yufatang 4年前
ruke (作者) 4年前

当我第一眼看到标题的时候我就在我的脑海里不断回忆 诶 这么巧我最近刚刚看了延迟静态绑定

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!