Menu
CoddyTech

实例属性与静态属性

本课属于 Coddy PHP 学习旅程的“面向对象编程”单元。第 15 课,共 91 课。

在类中创建属性时,你需要决定它属于每个对象,还是属于类本身。这一区别就是实例属性和静态属性的区别。

实例属性是默认属性。每个对象都有自己的属性副本,在一个对象中修改属性不会影响其他对象:

<?php
class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo $alice->name . "\n";
echo $bob->name . "\n";

输出:

Alice
Bob

静态属性属于类,而不属于任何特定对象。你可以使用 static 关键字声明静态属性,并使用类名和 :: 访问,而不是使用对象和 ->:

<?php
class User {
    public static $count = 0;
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
        self::$count++;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo User::$count;

输出:

2

注意,$count 在所有实例之间共享。每次创建一个新的 User 时,同一个 $count 变量都会递增。在类内部,我们使用 self::$count 来引用静态属性。

关键点:当每个对象都需要自己的值时,使用实例属性。当你需要在类的所有对象之间共享数据时,例如统计实例数量或存储配置,请使用静态属性。

challenge icon

挑战

简单

让我们构建一个访客跟踪系统,用来演示实例属性(每位访客独有)和静态属性(所有访客共享)的区别。

你将创建两个文件来组织代码:

  • Visitor.php:定义一个跟踪每位访客并持续统计访客总数的 Visitor 类。每位访客都应有自己的 $name 属性(实例属性),而 $totalVisitors 属性应由所有实例共享(静态属性)。构造函数接收一个姓名,设置该姓名,并增加访客总数。添加一个 getInfo() 方法,返回 "[name] is visitor #[totalVisitors]"。
  • main.php:引入 Visitor 类文件,然后按顺序创建三位访客,姓名分别为 "Alice"、"Bob" 和 "Charlie"。全部创建完成后,打印对每位访客调用 getInfo() 的结果(每个结果单独占一行),然后通过 Visitor::$totalVisitors 直接从类访问静态属性,打印访客总数。

请记住,在类内部,使用 self::$propertyName 访问静态属性;在类外部,使用 ClassName::$propertyName。实例属性则像往常一样通过 $this->propertyName 访问。

输出应显示每位访客及其分配的编号,最后一行显示访客总数。

亲手试试

<?php
// 引入 Visitor 类
require_once 'Visitor.php';

// TODO: 按顺序创建 3 个访客,名字分别为 "Alice"、"Bob" 和 "Charlie"

// TODO: 打印每个访客的 getInfo() 结果,每个结果单独占一行

// TODO: 使用 Visitor::$totalVisitors 打印访客总数
?>
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: PHP 在线编译器