• 技术文章 >后端开发 >php教程

    PHP Class self与static有什么区别?都怎么用?

    藏色散人藏色散人2021-09-09 21:05:47转载599

    对于大多数 PHPer 来说,self 与 static 两个 PHP 关键词都不算陌生。我们学会通过self::xxxx这种方式来调用当前类的静态属性和方法。而 static 呢?想必很多人只知道它是用于定义一个静态方法和类属性关键词。

    这也是我之前的认知。

    现在我们来回顾一下这两个关键词的一些常见用法:

    // self 用法 1 :调用静态成员属性
    <?php
    class Person
    {
        protected static $maxAddressCount = 5; // 收获地址创建最大数量。
    
        public function test()
        {
            echo self::$maxAddressCount;
        }
    }
    
    $person = new Person();
    $person->test();
    // self 用法 2 :调用静态方法
    <?php
    class Person
    {
        protected static $maxAddressCount = 5; // 收获地址创建最大数量。
    
        protected static function getMaxAddressCount()
        {
            return self::$maxAddressCount;
        }
    
        public function test()
        {
            echo self::getMaxAddressCount();
        }
    }
    
    $person = new Person();
    $person->test();
    // self 用法 3 :创建一个当前对象
    <?php
    // 单例示例
    class Person
    {
        private static $instance = null;
    
        private function __construct() {}
    
        final public static function getInstance() 
        {
            if (self::$instance == null) {
                self::$instance = new self;
            }
            return self::$instance;
        }
    
        public function test()
        {
            echo "hello world!";
        }
    }
    
    $person = Person::getInstance();
    $person->test();
    关于 static 关键词的常见用法也在上面 3 个示例中得到综合体现。

    我深信上面的用法,任何一个入门的 PHPer 都是非常熟悉的。现在我要讲的是以下两种方式:

    new self() 与 new static() 的区别?

    我相信很多人都知道new self()创建一个当前类的对象,并不知道new static()也能创建一个当前类的对象。

    关于new static()这种用法呢,在官方文档有说明。地址:https://www.php.net/manual/zh/language.oop5.late-static-bindings.php

    PHP 官方把这种方式称为:后期静态绑定。

    官方示例 1:

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

    因为 Class B 继承了 Class A。 A 与 B 都有一个静态方法who()。此时通过B::test()的时候,调用的实际上是 Class A 的who()方法。

    因为子类 Class B 的静态方法who()属于在 Class A 之后的子类里面才定义的。而 PHP 的默认特性只允许调用最先定义的。

    就这引出了后期静态绑定的概念。

    官方示例 2:

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

    我们把 Class A 里面的test()方法体的self更改为static之后,static 代表的永远是指向调用类。也就是说虽然在 Class A 父类里面定义的方法与子类有同名冲突的情况。但是,当子类调用的时候,那么自动切换到子类的静态同名方法。取决于调用者。

    大家可以通过运行以上两个示例进行理解。

    之所以会有本篇小节内容。是因为我在实际运行当中要继承单例方法导致了这个问题。所以,才牵扯出这个特性。

    推荐学习:《PHP视频教程

    以上就是PHP Class self与static有什么区别?都怎么用?的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:segmentfault,如有侵犯,请联系admin@php.cn删除
    专题推荐:php 深度学习
    上一篇:深入了解PHP中的依赖注入,看看怎么应用 下一篇:浅谈PHP中如何操作区域语言标记信息?
    线上培训班

    相关文章推荐

    • php const和static变量的区别是什么• php中self和static的区别是什么• php static是什么意思• php中的__callStatic函数如何使用

    全部评论我要评论

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

    PHP中文网