实例属性与静态属性
本课属于 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 来引用静态属性。
关键点:当每个对象都需要自己的值时,使用实例属性。当你需要在类的所有对象之间共享数据时,例如统计实例数量或存储配置,请使用静态属性。
挑战
简单让我们构建一个访客跟踪系统,用来演示实例属性(每位访客独有)和静态属性(所有访客共享)的区别。
你将创建两个文件来组织代码:
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 打印访客总数
?>这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: PHP 在线编译器