我想知道爲什麼在php中沒有$parent->function();
語法,但是我們可以使用parent::function();
,它看起來像它在靜態類中使用。我錯過了一些PHP的OOP基礎知識?parent ::在實例化類
3
A
回答
2
我承認這似乎有些奇怪 - 你沒有手動^^
在錯過什麼,但:
- 一般來說,當子類重新定義的方法這已在父級中定義,您希望孩子的方法完全覆蓋父級的方法
- 除了
__construct
,我承認 - 這可能就是爲什麼在手冊中明確提到你必須親自調用父母的方法__construct
。
- 除了
- 一般來說,非靜態方法工作時,你就用
$this
調用無論是在兒童或父類的同一個實例的方法;不需要知道方法的實際位置。 - 使用
parent::
工作得很好,即使它看起來像一個靜態調用
而這裏的顯示parent::
代碼示例工作正常:
class Father {
public function method() {
var_dump($this->a);
}
}
class Son extends Father {
protected $a;
public function method() {
$this->a = 10;
parent::method();
}
}
$obj = new Son();
$obj->method();
你會得到這樣的輸出:
$ /usr/local/php-5.3/bin/php temp.php
int(10)
Wh ich顯示父類中的方法有權訪問$this
以及在子類中定義的屬性。
2
嗯,其實parent
引用靜態父類 - 沒有理由假設有一個實例$parent
只是因爲存在$child
,即使有,$child
就不必$parent
訪問。
最後,一個例子,其中通常的class dog extends animal
OOP解釋不起作用! :)
1
因爲使用$parent
假定您已實際實例化父類。
如果您的語法建議工作,這意味着每次您實例化一個對象,您實例化2個或更多對象。
在PHP中,每個變量都必須包含一個字符串,整數(或其他數字格式),數組,對象或資源。 $this
包含一個對象,它恰好是您當前所在的對象。
爲了創建$parent
,您必須在$parent
中放置一個對象。你的父類在技術上沒有實例化,所以它不能被分配給一個變量。
BTW parent::function();
可以訪問全部$this
。
因此,這個工程
class Test
{
public function test()
{
echo $this->testing_var;
}
}
class OtherTest
{
public function run()
{
$this->testing_var = "hi";
Test::test(); // echos hi
}
}
而如果是使用一類外,並會告訴你應該聲明爲static這會報錯。
Test::test();
相關問題
- 1. 從超類Java實例化子類Java
- 2. 在哪裏實例化類
- 3. 實例化單例類
- 4. 類的實例化
- 5. 實例化es6類
- 6. Java類實例化
- 7. C++實例化類
- 8. 類實例化Java
- 9. Java類實例化
- 10. 實例化參數化類
- 11. 替補完全實例化類與部分實例化祖先類
- 12. 從類內實例化類
- 13. 顯式實例化C++類模板實例化相關基類?
- 14. 類定義實例實例化問題
- 15. 接口實例與類實例化
- 16. AS3:實例化類的實例
- 17. 在類中初始化類實例
- 18. 已知類型的實例化類
- 19. 以下類不能被實例化:android.support.constraint.ConstraintLayout
- 20. 類不能實例化
- 21. Android:嘗試實例化類
- 22. TrueZip類無法實例化
- 23. 實例化對象的類
- 24. 實例化類不工作
- 25. 實例化一個類 - Python
- 26. 實例化的抽象類
- 27. PHP:問題實例化類
- 28. php:實例化類動態
- 29. Python實例化子類
- 30. 檢查類被實例化
我真的不覺得這很奇怪。因爲變量不能包含類,所以它們必須包含實例化類的對象。因此,爲了讓'$ parent'存在,你必須實例化父對象以及子對象。 – 2010-01-10 20:03:46