簡體   English   中英

這里有什么PHP課程?

[英]What is going on here in PHP with classes?

如果我有這個代碼,則回顯字符串“test”。 這是在PHP 5.3中。 這是一些不應該依賴的疏忽,還是在PHP中實現多重繼承的某種方式?

class Test1
{
    function getName()
    {
        return $this->name;
    }
}

class Test2
{
    public $name = 'test';

    function getName()
    {
        return Test1::getName();
    }
}

$test = new Test2;
echo $test->getName();

編輯:

正如已經指出GZipp的評論,這實際上是記錄在案的行為。 參見本頁: http//us2.php.net/manual/en/language.oop5.basic.php和標題“Example#2 $ this偽變量的一些例子”。

類A和B與我上面的兩個測試類和行有類似的關系

$b = new B();
$b->bar();

顯示與我的示例相同或多或少的結果。

要明確一點 - 這不是繼承。 Test2不擴展Test1。 您靜態引用了Test1類的公共方法。

盡管如此,至少可以說它返回“測試”的事實很有意思。 而且我看到它在哪里放棄了繼承的想法。

如果您找不到合適的答案,我會將您的代碼作為錯誤提交。

UPDATE

雖然你靜態引用了Test1的一個方法,但它仍然被稱為Test2。 最后,這是未定義的行為,並且上面提到的問題確實會發出嚴格的警告。 仍然非常奇怪,我個人同意這不應該奏效。 但只是為了更多地了解它所使用的對象。

class Test1 {
    function getName() {
        echo get_class($this);
        return $this->name;
    }
}
// ...
$test = new Test2;
echo $test->getName();

// echoes 'Test2 test'

PHP允許調用非靜態方法,就像它們是靜態的一樣 - 這是一個特性。 PHP將$this作為隱式參數傳遞給此類調用。 就像以正常方式調用方法時一樣。

但顯然PHP不會檢查靜態調用的類是否繼承當前類 - 這就是錯誤。

這就是你如何看待PHP的作用:

function Test1->getName($this = null) {
    return $this->name;
}

function Test2->getName($this = null) {
    return Test1->getName($this);
}

$test = new Test2;
echo $test->getName($test);

這種行為是錯誤的。 正確的Test2->getName將是:

function Test2->getName($this = null) {
    return $this instanceof Test1 ? Test1->getName($this) : Test1->getName();
}

這必須是一個錯誤。 100%。

  1. 這不是繼承。
  2. 您應該無法調用Test1 :: getName(),因為Test1中的getName()不是靜態的
  3. 即使您可以調用它,$ this-> name也不應該訪問Test2中的值。

這打破了OO的這么多規則我對這是如何通過測試感到困惑。 好吧,找不到它!

暫無
暫無

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

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