2021年11月20日

寫給 PHP 新手的物件導向教學(二):建構子、方法及屬性

 

在上一回《寫給 PHP 新手的物件導向教學(一):建立類別與物件》

我們講到了如何建立類別,

那這一回我們會接續著講解一個重要的概念:建構子,

不過在進入建構子之前,我想優先提一下「方法」及「屬性」。

 

方法 (method)

平常我們在 PHP 定義函式要透過 function 關鍵字,像是這樣:

function helloWorld() 
{
	echo 'Hello World!';
}

那在前一回的部份我們有提到,類別指的是資料行為的結合,

資料的部分,就是前一回已經稍微提到的屬性,而行為的部分,指的就是方法。

某一個類別所擁有的函式(member function),就是這個類別的的方法 (method)。

在大部分的情況中,類別方法跟一般函式的用法是一樣的,

只是在物件導向中,會習慣用不同的名稱來稍微區分一下。

 

那麼要怎麼在類別中定義方法呢?

簡單來說,只要把函式放到類別裡面,就可以了。

讓我們來稍微修改一下之前的 Student 類別,

只要把 function hello() 放進去,我們就成功撰寫了第一個成員方法了。

class Student { 
	public function hello() {
        echo 'Hello Student!';
    }
}

眼尖的朋友可能看到 function 前面多了一個 public

這也是一個保留字,但我們可以先暫時忽略它。

 

定義好成員方法後,當然要來使用一下,

使用的方法也是透過 -> 的方式,創建出一個新物件後,

在對著物件使用箭頭呼叫方法的名稱,後面在加上括號,就可以執行囉:

$student = new Student();
$student->hello(); // output: Hello Student!

 

屬性 (property)

在前面一回,我們已經有提到,透過 -> 可以把資料放入物件中,

但其實一般來說是不建議這樣做的:

$student = new Student();
$student->name = 'Jack';

比較正確的做法是,在定義類別的時候,

同時定義該類別的成員變數 (member variable),也就是屬性 (property)。

 

作法依樣很簡單,只要把變數定義放到類別裡面去就可以了。

class Student { 
    public $name = "Jack";
}

這邊一樣也有個 public 關鍵字,雖然很重要,

但我們目前一樣可以先忽略它,只要記得在定義變數前要加上 public

 

接著我們可以把 $name 印出來看看:

$student = new Student();
echo $student->name; // output: Jack

$student->name = 'Tom';
echo $student->name; // output: Tom

像一般變數一樣,我們也可以覆蓋屬性的值。

 

另外,並沒有限制一個類別有多少屬性哦,可以依需求自行新增所需的屬性。

 

建構子 (constructor)

所謂的建構子,就是物件成立的當下,會被呼叫的方法,

呼叫建構子的目的是幫物件做初始化,

$student = new Student();

所以當我們執行上面這句話的時候,PHP 其實會自動去呼叫 Student 的建構子,

當然我們目前還沒定義自己的建構子,所以基本上不會發生什麼事情。

 

而建構子的定義方式其實就跟前面提到的類別方法一樣,

只是它必須要叫做 __construct ,而且一個類別只能有一個建構子。

這樣 PHP 才有辦法識別建構子,並自動呼叫它,

 

實際使用建構子就像這樣:

class Student { 
    public function __construct() {
		echo "Hello!";
    }
}

當我們成功創立物件的時候,就會自動執行建構子中的程式。

$student = new Student(); // output: Hello!

 

當然,既然建構子也是一般的方法,

我們也可以使用參數,這邊我們稍微結合一下屬性的用法。

 

class Student { 
    public $name;
    
    public function __construct($studentName) {
		$this->name = $studentName;
    }
}

我們把 $studentName 作為參數,丟入建構子中。

這邊又出現了一個新東西 $this

這邊先初淺的解釋的話,$this 指的就是自己,

所以 $this->name = $studentName; 就是把傳進來的 $studentName 指派給類別的屬性 name

 

用法是這樣:

$student = new Student('Jack');
echo $student->name; // output: Jack

我們使用 new 建立一個 Student 物件,並且把 Jack 作為 $studentName 傳入,

建構子自動執行,將 Jack 指派給屬性 name

所以接著我們可以透過->印出 name 的值 Jack

 

目錄:寫給 PHP 新手的物件導向教學

下一回:寫給 PHP 新手的物件導向教學(三):封裝,可見度與繼承