<?php class A { public static $instance; public static function getInstance() { if(null === static::$instance){ static::$instance = new static(); } return static::$instance; } } class A1 extends A {} class A2 extends A {}
/*************************************************/ class B { public static function getInstance() { static $instance; if(null === $instance){ $instance = new static(); } return $instance; } } class B1 extends B{} class B2 extends B{}
A 的子类没有重定义父类的$instance 变量,因此 static::$instance 只返回父类中的变量,因为 A1 先调用了 getInstance ,同时由于后期绑定的原因, getInstance 总会返回 A1 的实例。 B 方法中 static 关键字和 A 中的是两个概念, A static variable exists only in a local function scope, but it does not lose its value when program execution leaves this scope 。见 http://php.net/manual/en/language.variables.scope.php 在下拙见,不正确之处还望纠正。