Php 简明教程

PHP – Static Methods

PHP 中的 "static" 关键字用于在 PHP 类中定义静态属性和静态方法。需要注意的是,static 关键字也用于定义静态变量和静态匿名函数。本章讨论 PHP 类中的静态方法。

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

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

您无需创建类的实例即可调用该类的静态方法。通过作用域解析运算符,根据类名称来调用该静态方法。静态方法调用的语法为 −

myclass::myStaticMethod();

由于无需创建类的实例即可调用静态方法,因此伪变量 $this 在静态方法内部不可用。允许由对象调用一个静态方法,尽管将一个实例方法作为静态方法调用会引发错误。

Example

请看以下示例:

<?php
   class myclass {

      /* Member variables */
      static int $var1 = 0;
      public static function mystaticmethod() {
         echo "This is a static method".  PHP_EOL;
      }
      public function myinstancemethod() {
         echo "This is an instance method".  PHP_EOL;
      }
   }

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

它将生成以下 output

This is a static method
This is an instance method
This is a static method
PHP Fatal error:  Uncaught Error: Non-static method
myclass::myinstancemethod() cannot be called statically

The "self" Keyword in Static Method

如果您需要从在同一类中定义的实例方法内部调用静态方法,那么必须使用引用类名称的 self 关键字,然后是作用域解析运算符(如 self::mystaticmethod)

<?php
   class myclass {

      /* Member variables */
      static int $var1 = 0;
      public static function mystaticmethod() {
         echo "This is a static method".  PHP_EOL;
      }
      public function myinstancemethod() {
         echo "This is an instance method".  PHP_EOL;
         echo "calling static method from instance method" . PHP_EOL;
         self::mystaticmethod();
      }
   }

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

它将生成以下 output

This is an instance method
calling static method from instance method
This is a static method

Using the "parent" Keyword

在继承的情况下,通过引用“parent”关键字,可以根据派生类的对象或从派生类的实例方法内部调用在基类中定义的静态方法。

Example

请看以下示例:

<?php
   class myclass {

      /* Member variables */
      static int $var1 = 0;
      public static function mystaticmethod() {
         echo "This is a static method".  PHP_EOL;
      }
      public function myinstancemethod() {
         echo "This is an instance method".  PHP_EOL;
         echo "calling static method from instance method" . PHP_EOL;
         self::mystaticmethod();
      }
   }

   class mynewclass extends myclass {
      public function myfunction() {
         echo "This an instance method of the derived class" . PHP_EOL;
         echo "Calling static method of the parent class" . PHP_EOL;
         parent::mystaticmethod();
      }
   }
   $obj = new mynewclass;
   mynewclass::mystaticmethod();
   $obj->myfunction();
?>

它将生成以下 output

This is a static method
This an instance method of the derived class
Calling static method of the parent class
This is a static method

Static Method Inside Another Class

完全可以从一个类中调用另一个类中的静态方法。您必须用其类名称和作用域解析运算符限定其名称。

Example

请看以下示例:

<?php
   class myclass {

      /* Member variables */
      static int $var1 = 0;
      public static function mystaticmethod() {
         echo "This is a static method".  PHP_EOL;
      }
   }

   #this is not a derived class
   class mynewclass {
      public function myfunction() {
         echo "This an instance method" . PHP_EOL;
         echo "Calling static method of the another class" . PHP_EOL;
         myclass::mystaticmethod();
      }
   }
   $obj = new mynewclass;
   $obj->myfunction();
?>

它将生成以下 output

This an instance method
Calling static method of another class
This is a static method

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

Example

请看以下示例:

<?php
   class myclass {

      /* Member variables */
      static int $var1 = 0;
      function __construct() {
         self::$var1++;
         echo "object number ". self::$var1 . PHP_EOL;
      }
      public static function mystaticmethod() {
         echo "Number of objects available: " . self::$var1 . PHP_EOL;
      }
   }

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

它将生成以下 output

object number 1
object number 2
object number 3
Number of objects available: 3