[英]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類的公共方法。
盡管如此,至少可以說它返回“測試”的事實很有意思。 而且我看到它在哪里放棄了繼承的想法。
如果您找不到合適的答案,我會將您的代碼作為錯誤提交。
雖然你靜態引用了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%。
這打破了OO的這么多規則我對這是如何通過測試感到困惑。 好吧,找不到它!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.