后期静态绑定

在 PHP 5.3 及更高版本中,你可以利用后期静态绑定来控制调用静态属性或方法的类。添加它是为了克服 self::范围解析器固有的问题。请使用以下代码

class Horse {
    public static function whatToSay() {
         echo 'Neigh!';
    }

    public static function speak() {
         self::whatToSay();
    }
}

class MrEd extends Horse {
    public static function whatToSay() {
         echo 'Hello Wilbur!';
    }
}

你会期望 MrEd 类会覆盖父 whatToSay() 函数。但是当我们运行这个时,我们会得到一些意外

Horse::speak(); // Neigh!
MrEd::speak(); // Neigh!

问题是 self::whatToSay(); 只能引用 Horse 类,这意味着它不服从 MrEd。如果我们切换到 static::范围的 resolutor,我们没有这个问题。这个更新的方法告诉类遵循调用它的实例。因此,我们得到了我们期待的继承

class Horse {
    public static function whatToSay() {
         echo 'Neigh!';
    }

    public static function speak() {
         static::whatToSay(); // Late Static Binding
    }
}

Horse::speak(); // Neigh!
MrEd::speak(); // Hello Wilbur!