PHP中静态属性和方法究竟有何奥秘?

2026-04-05 16:031阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1590个文字,预计阅读时间需要7分钟。

PHP中静态属性和方法究竟有何奥秘?

本章节带大家了解PHP中的静态属性和方法,介绍静态的本质、静态变量和普通变量的区别,希望对大家有所帮助。

静态是什么?

静态,顾名思义,是静态的、不变的意思。在PHP中,静态主要用来修饰成员变量和方法,使其属于类本身,而不是类的实例。

我们之前讲到的成员变量和方法,都是属于类的实例的。也就是说,每个实例都有自己的成员变量和方法。而静态成员变量和方法,则是属于类的本身,无论创建多少个实例,这些静态成员变量和方法都是共享的。

静态变量和普通变量的区别

静态变量和普通变量的主要区别在于它们的作用域和生命周期。

1. 作用域:静态变量在类的作用域内都是可访问的,而普通变量只在类的实例作用域内可访问。

2. 生命周期:静态变量的生命周期是整个脚本执行期间,而普通变量的生命周期是类的实例生命周期。

希望对大家有所帮助。

本篇文章带大家了解一下PHP中的静态属性和静态方法,介绍一下静态的本质、静态变量和普通变量的区别,希望对大家有所帮助。

静态是什么?

我们之前讲到, 调用成员变量和方法, 都需要用到对象. 但如果我们不想实例化, 直接访问变量和方法呢? 这就用到了静态static功能.

在定义变量和方法的时候, 在前面加上static关键词, 就转化为了静态, 就可以通过类名::双引号直接进行访问.

我们继续将上面的例子改写为静态变量和静态方法:

class Classname //定义一个类, 类名不区分大小写 { static public $name; //定义静态成员变量; static public $height=180; //初始化赋值 static public $weight, $nationality; //可以一个语句定义多个变量 static protected $age; static public function player($name,$height, $weight, $age, $sex) { //定义静态成员方法, 以及方法形参 self::$name=$name; //为成员变量赋值, 使用了代词self:: self::$weight=$weight; self::$height=$height; if (self::$height<185 && self::$weight<=85){ return self::$name.',符合要求'; }else{ return self::$name.',不太行'; } } } echo Classname::$height; //180, 通过类名::访问静态变量 echo Classname::player('xiaoming',180,80,22, 'Male'); //通过类名::访问静态方法;

上面的例子可以注意到, 我将所有的$this都换成了self. 因为$this指代的是调用对象, 而self指代的方法所在的类本身. 静态方法可以通过类名::直接调用, 这里没有对象, \$this指代的就为空, 系统就会报错. 所以静态方法内调用变量, 不能通过$this.

注意self::后面的变量要有$符号.

静态的本质

不要小瞧这个static, 加上了它, 其实不只是可以直接调用这么简单, 成员变量和方法的意义发生了本质上的变化:

在静态方法中只能调用静态变量, 而不能调用普通变量, 普通方法则可以调用静态变量. 这是由静态方法的属性决定的, 因为普通的成员变量是与"对象"绑定的, 而静态变量是与"类"绑定的.

我再详细解释一下静态变量和普通变量的区别:

  • 普通的成员变量与对象绑定, 不同的对象都有一套属于自己的成员变量. 不同对象的成员变量都有各自的赋值, 虽然有可能相同, 但你的就是你的.

  • 静态变量是和类绑定的. 如果静态变量改变了, 那么这个类所有的对象中, 这个值都会发生改变.

  • 静态变量也可以通过对象::来进行访问, 但其实同一个类的对象访问的其实都是同一个静态变量值. 可以理解为静态变量是整个类共享的, 包括它的子类.

    PHP中静态属性和方法究竟有何奥秘?

  • 所以即便其中一个对象被销毁了, 静态变量值还会保留.

  • 子类也可以重写父类的静态成员变量, 但父类的静态变量依然存在, 这两个静态成员变量是独立的. 会根据调用的类名分别进行访问.

我们举个例子:

class Shouji { static public $test; //定义一个静态变量 static function test5() //定义静态方法来操作并输出静态变量 { self::$test++; echo self::$test; } } class Shouji2 extends Shouji //定义一个子类 { static function test5() //定义子类的静态方法 { self::$test++; //访问并操作父类的静态变量 echo self::$test; } } $shouji1=new Shouji; //新建父类对象 $shouji1->test5(); //1, 通过对象调用静态方法 $shouji2=new Shouji; //新建另一个父类对象 $shouji2->test5(); //2, 在前一次操作基础上继续+1 $shouji3=new Shouji2; //新建子类对象 $shouji3->test5(); //3, 调用子类同名静态方法, 继续+1 echo Shouji::$test; //3, 通过父类::直接访问静态成员变量 echo $shouji1::$test; //3, 通过对象名::可以直接访问静态成员变量

通过上面这个例子, 我们还能有以下几点总结:

  • 子类可以重写父类的静态方法.

  • 方法内访问静态变量需要用::符号. 不能用$this;

  • 静态方法和静态变量都会被子类继承.

  • 静态变量不能由->访问, 而是由 ::(双冒号)进行访问

  • 对象可以通过对象名->来直接调用静态成员方法, 这个和调用普通方法是一样的.

本文转载自:juejin.cn/post/6977200691919978510

作者:传达室老大爷

本文共计1590个文字,预计阅读时间需要7分钟。

PHP中静态属性和方法究竟有何奥秘?

本章节带大家了解PHP中的静态属性和方法,介绍静态的本质、静态变量和普通变量的区别,希望对大家有所帮助。

静态是什么?

静态,顾名思义,是静态的、不变的意思。在PHP中,静态主要用来修饰成员变量和方法,使其属于类本身,而不是类的实例。

我们之前讲到的成员变量和方法,都是属于类的实例的。也就是说,每个实例都有自己的成员变量和方法。而静态成员变量和方法,则是属于类的本身,无论创建多少个实例,这些静态成员变量和方法都是共享的。

静态变量和普通变量的区别

静态变量和普通变量的主要区别在于它们的作用域和生命周期。

1. 作用域:静态变量在类的作用域内都是可访问的,而普通变量只在类的实例作用域内可访问。

2. 生命周期:静态变量的生命周期是整个脚本执行期间,而普通变量的生命周期是类的实例生命周期。

希望对大家有所帮助。

本篇文章带大家了解一下PHP中的静态属性和静态方法,介绍一下静态的本质、静态变量和普通变量的区别,希望对大家有所帮助。

静态是什么?

我们之前讲到, 调用成员变量和方法, 都需要用到对象. 但如果我们不想实例化, 直接访问变量和方法呢? 这就用到了静态static功能.

在定义变量和方法的时候, 在前面加上static关键词, 就转化为了静态, 就可以通过类名::双引号直接进行访问.

我们继续将上面的例子改写为静态变量和静态方法:

class Classname //定义一个类, 类名不区分大小写 { static public $name; //定义静态成员变量; static public $height=180; //初始化赋值 static public $weight, $nationality; //可以一个语句定义多个变量 static protected $age; static public function player($name,$height, $weight, $age, $sex) { //定义静态成员方法, 以及方法形参 self::$name=$name; //为成员变量赋值, 使用了代词self:: self::$weight=$weight; self::$height=$height; if (self::$height<185 && self::$weight<=85){ return self::$name.',符合要求'; }else{ return self::$name.',不太行'; } } } echo Classname::$height; //180, 通过类名::访问静态变量 echo Classname::player('xiaoming',180,80,22, 'Male'); //通过类名::访问静态方法;

上面的例子可以注意到, 我将所有的$this都换成了self. 因为$this指代的是调用对象, 而self指代的方法所在的类本身. 静态方法可以通过类名::直接调用, 这里没有对象, \$this指代的就为空, 系统就会报错. 所以静态方法内调用变量, 不能通过$this.

注意self::后面的变量要有$符号.

静态的本质

不要小瞧这个static, 加上了它, 其实不只是可以直接调用这么简单, 成员变量和方法的意义发生了本质上的变化:

在静态方法中只能调用静态变量, 而不能调用普通变量, 普通方法则可以调用静态变量. 这是由静态方法的属性决定的, 因为普通的成员变量是与"对象"绑定的, 而静态变量是与"类"绑定的.

我再详细解释一下静态变量和普通变量的区别:

  • 普通的成员变量与对象绑定, 不同的对象都有一套属于自己的成员变量. 不同对象的成员变量都有各自的赋值, 虽然有可能相同, 但你的就是你的.

  • 静态变量是和类绑定的. 如果静态变量改变了, 那么这个类所有的对象中, 这个值都会发生改变.

  • 静态变量也可以通过对象::来进行访问, 但其实同一个类的对象访问的其实都是同一个静态变量值. 可以理解为静态变量是整个类共享的, 包括它的子类.

    PHP中静态属性和方法究竟有何奥秘?

  • 所以即便其中一个对象被销毁了, 静态变量值还会保留.

  • 子类也可以重写父类的静态成员变量, 但父类的静态变量依然存在, 这两个静态成员变量是独立的. 会根据调用的类名分别进行访问.

我们举个例子:

class Shouji { static public $test; //定义一个静态变量 static function test5() //定义静态方法来操作并输出静态变量 { self::$test++; echo self::$test; } } class Shouji2 extends Shouji //定义一个子类 { static function test5() //定义子类的静态方法 { self::$test++; //访问并操作父类的静态变量 echo self::$test; } } $shouji1=new Shouji; //新建父类对象 $shouji1->test5(); //1, 通过对象调用静态方法 $shouji2=new Shouji; //新建另一个父类对象 $shouji2->test5(); //2, 在前一次操作基础上继续+1 $shouji3=new Shouji2; //新建子类对象 $shouji3->test5(); //3, 调用子类同名静态方法, 继续+1 echo Shouji::$test; //3, 通过父类::直接访问静态成员变量 echo $shouji1::$test; //3, 通过对象名::可以直接访问静态成员变量

通过上面这个例子, 我们还能有以下几点总结:

  • 子类可以重写父类的静态方法.

  • 方法内访问静态变量需要用::符号. 不能用$this;

  • 静态方法和静态变量都会被子类继承.

  • 静态变量不能由->访问, 而是由 ::(双冒号)进行访问

  • 对象可以通过对象名->来直接调用静态成员方法, 这个和调用普通方法是一样的.

本文转载自:juejin.cn/post/6977200691919978510

作者:传达室老大爷