• 技术文章 >后端开发 >PHP问题

    php中self和static的区别是什么

    青灯夜游青灯夜游2021-05-08 18:31:49原创254

    php中self和static的区别:self只能引用当前类(current class)中的方法,而static允许函数调用在运行时绑定调用类(calling class)中的方法。

    本教程操作环境:windows7系统、PHP7.1版,DELL G3电脑

    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视频教程

    以上就是php中self和static的区别是什么的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:php self static
    上一篇:wamp怎么去除index.php 下一篇:php怎么将string转为double浮点类型
    第16期线上培训班

    相关文章推荐

    • php数组怎么增加值• php数组怎么删除头尾• php数组怎么取前几个元素• php中数字转字符串的函数有哪些• 详解PHP如何高效导出Excel(CSV)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网