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
这是一个实例方法
这是一种静态方法
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
对象编号2
对象编号3
可用对象数量:3