在上一回《寫給 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
。