類別的定義:
以關鍵字 class 開頭,後面跟著類別名稱,可以是任何非 PHP 保留字的名字。後面跟著一對花括號,裡麵包含有類別成員和方法的定義。
偽變數$this
可以在當一個方法在物件內部呼叫時使用。 $this 是一個到呼叫對象(通常是方法所屬於的對象,但也可以是另一個對象,如果該方法是從第二個對象內靜態調用的話)的引用。
//??靜態呼叫的內部到底是怎樣的?
看個例子:
class A
{
function foo( )
{
if (isset($this)) {
> echo ")n";
} else {
echo "$this is not defined.n";
unction bar()
{
A::foo();
}
}
$a = new A();
$a->foo();
A::foo();
$b = new B();
$b->bar();
B::bar();
輸出結果為:
$this is defined (a)
$this is not defined.
$this is defined (b)
$this is not defined.
/*我希望知道這個例子的內存等的具體實現,我暫時無法理解。如果有人可以講清楚,可以告訴我。我們宿舍牛頭現在正在冬眠,等他醒來,我會問。 */
new
要建立一個物件的實例,必須建立一個新物件並將其賦給一個變數。當建立新物件時該物件總是被賦值,除非該物件定義了建構函式並且在出錯時拋出了一個異常。 當把一個物件已經建立的實例賦給一個新變數時,新變數會存取同一個實例,就和用該物件賦值一樣。此行為和傳遞給函數進入實例時一樣。可以用克隆給一個已建立的物件建立一個新實例。
(這幾句話雖然很短,但是未必容易理解。)
例子如下:
class SimpleClass{
//成員聲明 public $var = 'a default value';
// 方法宣告
public function displayVar() {
echo $this->var; )
$instance = new SimpleClass();
//3>將指標$assigned指向heap中的實例化物件
$ assigned = $instance;
//4>將$instance的引用(地址)賦值給$reference
$reference =& $instance;
$ instance->var = '$assigned will have this value';
$instance = null; // 5>間斷$instance與heap中實例的連接。
var_dump($instance);var_dump($reference);
var_dump($assigned);
輸出:
N
輸出:
NULLobject(SimpleClass)#1 (1) {
["var"]=>
string(30) "$assigned will have this value"
}
圖示整個過程:
類別繼承extends
一個類別可以在宣告中用extends 關鍵字繼承另一個類別的方法和成員。不能擴展多個類,只能繼承一個基類。
被繼承的方法和成員可以透過用相同的名字重新宣告被覆寫,除非在父類別定義方法時使用了 final 關鍵字。可以透過 parent:: 來存取被覆蓋的方法或成員。
(繼承的機製到底怎樣的?)
原始碼如下:
{ // Redefine the parent method > function displayVar() { echo "Extending classn"; 🎜> $extended->displayVar();
輸出:
Extending class
a default value