因为您使用的是 PHP 5.3,所以可以使用后期静态绑定在运行时解析对正确类的静态调用。
class base_class {
public function doSomethingWithReference(){
static::$reference->doSomething();
}
}
class extended_class extends base_class{
protected static $reference;
public function __construct($ref){
static::$reference = $ref;
}
}
大胖提醒:extended_class::$reference
将在所有extended_class
实例之间共享一个。如果这不是你想要的,这将行不通。
您似乎实际上担心内存或资源使用。在 PHP 中,所有对象都是通过引用传递的。这意味着将对象作为参数传递或创建它的副本等不会消耗额外的内存。如果需要在多个其他对象中引用一个对象,这样做不会消耗额外的内存。
如果我有extended_class 和另一个相同的类(比如extended_class1),它们也会共享参考吗?还是所有extended_class' 实例共享一个引用,而所有extended_class1' 实例将共享另一个(理想情况)?
看起来共享是基于静态变量的定义位置。两个示例,均来自 PHP 交互式提示:
php > class Shared { public $me; public function __construct($me) { $this->me = $me; } }
php > class Base { protected static $ref; public function foo() { echo static::$ref->me, "\n"; } }
php > class Inherit_1 extends Base { public function __construct($ref) { static::$ref = $ref; } }
php > class Inherit_2 extends Base { public function __construct($ref) { static::$ref = $ref; } }
php > class Inherit_3 extends Inherit_1 {}
php > $shared_1 = new Shared(1)
php > ;
php > $shared_2 = new Shared(2);
php > $shared_3 = new Shared(3);
php >
php > $in_1 = new Inherit_1($shared_1);
php > $in_2 = new Inherit_2($shared_2);
php > $in_3 = new Inherit_3($shared_3);
php >
php > $in_1->foo();
3
php > $in_2->foo();
3
php > $in_3->foo();
3
在这种情况下,因为引用存在于基类中,所以每个人看到的都是同一个。我想这有点道理。
当我们声明每个子类的引用时会发生什么......大多数时候?
php > class Shared { public $me; public function __construct($me) { $this->me = $me; } }
php > class Base { public function foo() { echo static::$ref->me, "\n"; } }
php > class Inherit_1 extends Base { protected static $ref; public function __construct($ref) { static::$ref = $ref; } }
php > class Inherit_2 extends Base { protected static $ref; public function __construct($ref) { static::$ref = $ref; } }
php > class Inherit_3 extends Inherit_1 {}
php > class Inherit_4 extends Inherit_1 { protected static $ref; }
php > $shared_1 = new Shared(1);
php > $shared_2 = new Shared(2);
php > $shared_3 = new Shared(3);
php > $shared_4 = new Shared(4);
php > $in_1 = new Inherit_1($shared_1);
php > $in_2 = new Inherit_2($shared_2);
php > $in_3 = new Inherit_3($shared_3);
php > $in_4 = new Inherit_4($shared_4);
php > $in_1->foo();
3
php > $in_2->foo();
2
php > $in_3->foo();
3
php > $in_4->foo();
4
因为 3 从 1 继承而没有声明它自己的静态属性,所以它继承了 1。当我们将 3 设置为 Shared(3) 时,它会覆盖 1 的现有 Shared(1)。
结论:为此,需要在需要单个唯一引用的每个类中声明该属性。请注意,此代码自 5.4.x 起有效。