簡體   English   中英

從父類訪問子類靜態變量?

[英]Access child class static variables from parent class?

我有一個基類,我需要在子類中引用的類上調用函數。

很容易,

class base_class {

    public function doSomethingWithReference(){
        $this->reference->doSomething();
    }
}

class extended_class extends base_class{

    protected $reference;

    public function __construct($ref){
        $this->reference = $ref;
    }
}

現在這顯然很好,

但是,當我調試時,我不關心$this->reference的值

但是, $this->reference的對象是巨大的!

所以,當我執行print_r($instanceOfExtendedClass)我得到了該對象的打印輸出。

現在,對於擴展base_class每個類,引用是不同的。

我想要做的只是將reference設置為extended_class類的靜態屬性。

但是,然后將doSomethingWithReference更改為self::$reference會拋出一個未定義的變量錯誤。

相反,在base_class設置靜態變量並從extended_class修改它不起作用,因為它改變了從該類擴展的所有內容的變量。

有沒有辦法做到這一點,所以我沒有得到$this->reference的打印?

因為您使用的是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起有效。

為父級提供訪問子級靜態成員的方法:

<?php

abstract class base_class {
    abstract protected function reference();
    // If you want to be able to instanciate base class directly, use the following 2 lines in place of the previous 2 lines:
//class base_class {
    //protected function reference() {}

    public function doSomethingWithReference(){
        $this->reference()->doSomething();
    }
}

class extended_class extends base_class{
    protected static $reference;

    public function __construct($ref){
        self::$reference = $ref;
    }

    protected function reference(){
        return self::$reference;
    }
}

class ref {
    public function doSomething(){
        echo __METHOD__;
    }
}

$ref = new ref();
$ec = new extended_class($ref);
$ec->doSomethingWithReference();

print_r($ec);
?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM