静态属性和方法
到目前为止,所有的属性和方法都与特定的实例相关联;因此,两个不同的实例可以对同一属性使用两个不同的值。PHP 允许将属性和方法链接到类本身而不是对象。这些属性和方法用关键字 static
来定义。
private static $lastId = 0;
在 Customer
类中添加前一个属性。该属性显示上次分配给用户的 ID,有助于了解应分配给新用户的 ID。让我们对类的构造函数作如下修改:
public function __construct(
int $id,
string $name,
string $surname,
string $email
) {
if ($id == null) {
$this->id = ++self::$lastId;
} else {
$this->id = $id;
if ($id > self::$lastId) {
self::$lastId = $id;
}
}
$this->name = $name;
$this->surname = $surname;
$this->email = $email;
}
请注意,在引用静态属性时,我们不使用变量 $this
。取而代之的是 self::
,它并不与任何实例绑定,而是与类本身绑定。在最后一个构造函数中,我们有两种选择。要么提供一个非空的 ID 值,要么发送一个空值。当收到的 ID 值为空时,我们会使用静态属性 $lastId
来了解上次使用的 ID 值,将其增加一个,并将其赋值给属性 $id
。如果我们插入的最后一个 ID 是 5,则会将静态属性更新为 6,然后将其赋值给实例属性。下次我们创建新客户时,静态属性 $lastId
将变为 6。相反,如果我们从参数中得到一个有效的 ID,我们就会将其赋值,并检查赋值的 $id
是否大于静态的 $lastId
。如果大于,我们就更新它。让我们看看如何使用它:
$customer1 = new Customer(3, 'John', 'Doe', 'johndoe@mail.com');
$customer2 = new Customer(null, 'Mary', 'Poppins', 'mp@mail.com');
$customer3 = new Customer(7, 'James', 'Bond', '007@mail.com');
在上例中,$customer1
指定他的 ID 为 3,这可能是因为他是现有客户,希望保持相同的 ID。在创建第二个客户时,我们没有指定 ID,因此构造函数会将最后一个 ID 增加 1,并将其赋值给该客户。因此,$customer2
的 ID 将是 4,而最新的 ID 也将是 4。最后,我们的秘密特工知道自己想要什么,所以他强制系统将 ID 设为 7,最新的 ID 也将更新为 7。
静态属性和方法的另一个好处是,我们不需要一个对象来使用它们。您可以通过指定类名、后面的 ::
和属性/方法的名称来引用静态属性或方法。当然,前提是可见性规则允许这样做,而在本例中,由于属性是私有的,所以可见性规则不允许这样做。让我们添加一个公共静态方法来获取最后一个 ID:
public static function getLastId(): int {
return self::$lastId;
}
您可以使用类名或现有实例从代码中的任何位置引用它:
Customer::getLastId();
$customer1::getLastId();