PHP – 静态方法 (static methods)


PHP 的 static 关键字用于定义 PHP 类的 静态(static)属性 和 静态(static)方法 。可以注意到,static 关键字还用于定义 static 变量和 static 匿名函数。本章讨论 PHP 类中的静态方法。

在类定义中,使用 static 限定符声明的函数成为其 静态方法


class myclass {
   public static function myStaticMethod() {
      // ...
}

无需创建类的实例即可调用其 static 方法。static 方法由类名通过范围解析运算符调用。静态方法调用的语法是 −


 myclass::myStaticMethod();

由于静态方法可以在不创建类实例的情况下调用,因此伪变量 $this 在静态方法中不可用。允许对象调用静态方法,尽管将实例方法作为静态方法调用会引发错误。

示例

请看下面的例子 -


<?php
   class myclass {
   
      /* 成员变量 */
      static int $var1 = 0;
      public static function mystaticmethod() {
         echo "这是一种静态方法".  PHP_EOL;
      }
      public function myinstancemethod() {
         echo "这是一个实例方法".  PHP_EOL;
      }
   }

   myclass::mystaticmethod();
   $obj = new myclass;
   $obj->myinstancemethod();
   $obj->mystaticmethod();
   myclass::myinstancemethod();
?>

它将产生以下输出 -

这是一种静态方法
这是一个实例方法
这是一种静态方法
PHP Fatal error:  Uncaught Error: Non-static method 
myclass::myinstancemethod() cannot be called statically

static 方法中的 self 关键字

如果需要从同一类中定义的实例方法内部调用静态方法,则必须使用 self 关键字引用类的名称,后跟范围解析运算符(例如 self::mystaticmethod


<?php
   class myclass {
   
      /* 成员变量 */
      static int $var1 = 0;
      public static function mystaticmethod() {
         echo "这是一种静态方法".  PHP_EOL;
      }
      public function myinstancemethod() {
         echo "这是一个实例方法".  PHP_EOL;  
         echo "从实例方法调用静态方法" . PHP_EOL;
         self::mystaticmethod();
      }
   }

   $obj = new myclass;
   $obj->myinstancemethod();
?>

它将产生以下输出 -

这是一个实例方法
从实例方法调用静态方法
这是一种静态方法

使用 “parent” 关键字

在继承的情况下,在基类中定义的静态方法可以由派生类的对象调用,也可以由派生类的实例方法内部调用,方法是使用 “parent” 关键字引用它。

示例

请看下面的例子 -


<?php
   class myclass {
   
      /* 成员变量 */
      static int $var1 = 0;
      public static function mystaticmethod() {
         echo "这是一种静态方法".  PHP_EOL;
      }
      public function myinstancemethod() {
         echo "这是一个实例方法".  PHP_EOL;
         echo "从实例方法调用静态方法" . PHP_EOL;
         self::mystaticmethod();
      }
   }

   class mynewclass extends myclass {
      public function myfunction() {
         echo "这是派生类的一个实例方法" . PHP_EOL;
         echo "调用父类的静态方法" . PHP_EOL;
         parent::mystaticmethod();
      }
   }
   $obj = new mynewclass;
   mynewclass::mystaticmethod();
   $obj->myfunction();
?>

它将产生以下输出 -

这是一种静态方法
这是派生类的一个实例方法
调用父类的静态方法
这是一种静态方法

另一个类中的 static 方法

完全可以从另一个类中的一个类调用 static 方法。您必须使用其类名后跟范围解析运算符来限定其名称。

示例

请看下面的例子 -


<?php
   class myclass {
   
      /* 成员变量 */
      static int $var1 = 0;
      public static function mystaticmethod() {
         echo "这是一种静态方法".  PHP_EOL;
      }
   }
   
   #this is not a derived class
   class mynewclass {
      public function myfunction() {
         echo "这是一个实例方法" . PHP_EOL;
         echo "调用另一个类的静态方法" . PHP_EOL;
         myclass::mystaticmethod();
      }
   }
   $obj = new mynewclass;
   $obj->myfunction();
?>

它将产生以下输出 -

这是一个实例方法
调用另一个类的静态方法
这是一种静态方法

由于 $this 伪变量不可用于静态方法,因此无法在静态方法中访问对象的实例变量。它只能处理类的 static 属性。

示例

请看下面的例子 -


<?php
   class myclass {
   
      /* 成员变量 */
      static int $var1 = 0;
      function __construct() {
         self::$var1++;
         echo "对象编号". self::$var1 . PHP_EOL;      
      }
      public static function mystaticmethod() {
         echo "可用对象数量: " . self::$var1 . PHP_EOL;
      }
   }

   for ($i=1; $i<=3; $i++) {
      $obj = new myclass;
   }
   myclass::mystaticmethod();
?>

它将产生以下输出 -

对象编号1
对象编号2
对象编号3
可用对象数量:3