前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >php中self与static的区别

php中self与static的区别

作者头像
跑马溜溜的球
发布2022-03-07 15:07:41
5340
发布2022-03-07 15:07:41
举报
文章被收录于专栏:日积月累1024日积月累1024

原文链接,猛击这里

php中self与static的区别

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

代码语言:javascript
复制
class Car
{
    public static function model()
    {
         self::getModel();
    }

    protected static function getModel()
    {
        echo "I am a Car!";
    }

}

调用静态方法

代码语言:javascript
复制
Car::model();

得到输出

代码语言:javascript
复制
I am a Car!

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

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

代码语言:javascript
复制
class Mercedes extends Car
{

    protected static function getModel()
    {
        echo "I am a Mercedes!";
    }

}

当我们调用Mercedes::model()时,猜猜结果是什么? 可能你觉得结果会是:

代码语言:javascript
复制
I am a Mercedes!

但实际输出是:

代码语言:javascript
复制
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是我们的调用类

延迟绑定的例子

代码语言:javascript
复制
class Car
{
    public static function model()
    {
         static::getModel();
    }

    protected static function getModel()
    {
        echo "I am a Car!";
    }

}

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

现在我们调用

代码语言:javascript
复制
Mercedes::model();

得到输出

代码语言:javascript
复制
I am a Mercedes!

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

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

php中的self和static

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • php中self与static的区别
  • 对于self的解释
  • static关键字和延迟静态绑定(late static binding)
  • 延迟绑定的例子
  • php 5.3以下的版本无法使用延迟静态绑定
  • php中的self和static
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档