加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP Class self与static有什么不同?都怎么用?

发布时间:2022-08-03 16:03:04 所属栏目:PHP教程 来源:互联网
导读:PHP Class self 与 static 异同与使用详解 对于大多数 PHPer 来说,self 与 static 两个 PHP 关键词都不算陌生。我们学会通过self::xxxx这种方式来调用当前类的静态属性和方法。而 static 呢?想必很多人只知道它是用于定义一个静态方法和类属性关键词。 这
  PHP Class self 与 static 异同与使用详解
  对于大多数 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();
 
  <?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();
 
  <?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->test();
 
  关于 static 关键词的常见用法也在上面 3 个示例中得到综合体现。
  我深信上面的用法,任何一个入门的 PHPer 都是非常熟悉的。现在我要讲的是以下两种方式:
 
 
  new self() 与 new static() 的区别?
 
  我相信很多人都知道new self()创建一个当前类的对象,并不知道new static()也能创建一个当前类的对象。
 
  PHP 官方把这种方式称为:后期静态绑定。
 
  官方示例 1:
 
      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:
 
 
  class A {
 
      public static function who() {
 
          echo __CLASS__;
 
      }
 
      public static function test() {
 
          static::who(); // 后期静态绑定从这里开始
 
 
  }
 
   
 
  B::test();
 
  我们把 Class A 里面的test()方法体的self更改为static之后,static 代表的永远是指向调用类。也就是说虽然在 Class A 父类里面定义的方法与子类有同名冲突的情况。但是,当子类调用的时候,那么自动切换到子类的静态同名方法。取决于调用者。

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读