静态属性和方法

到目前为止,所有的属性和方法都与特定的实例相关联;因此,两个不同的实例可以对同一属性使用两个不同的值。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();