PHP 5 起完整支援物件導向程式設計 (OOP),類別是物件的藍圖,封裝屬性 (成員變數) 與方法 (成員函式)。掌握定義語法、實例化、存取控制、建構子/解構子與 $this 機制,是進入現代 PHP 框架 (Laravel, Symfony) 的基石。
<?php
class 類別名 { // 命名慣例:PascalCase (首字大寫)
// 成員屬性 (變數)
存取修飾符 $屬性名 [= 預設值];
// 成員方法 (函式)
存取修飾符 function 方法名(參數列表) : 回傳型別 {
// 方法主體
}
}
?>
類別名.class.php 或 類別名.php (PSR-4 自動載入)。<?php
$物件名 = new 類別名(); // 括號可省略:new 類別名;
$物件名->屬性名 = 值; // 寫入 (需 public)
$值 = $物件名->屬性名; // 讀取 (需 public/protected 視情況)
?>
<?php
class Cat {
public $name;
public $age;
public $color;
}
$cat1 = new Cat();
$cat1->name = '小白';
$cat1->age = 3;
$cat1->color = 'yellow';
$cat2 = new Cat();
$cat2->name = '小花';
$cat2->age = 10;
$cat2->color = 'white';
if ($cat1->name === '小白') {
echo $cat1->name . '<br />' . $cat1->age . '<br />' . $cat1->color;
}
?>
<?php
class Person {
public $name;
public $age;
}
$p1 = new Person();
$p1->name = 'www.bianceng.cn';
$p1->age = '10';
function test1($p) { // 參數預設傳值,但物件變數本身是「參考控制代碼」
$p->name = '小李'; // 修改「同一個物件」的屬性
}
test1($p1);
echo $p1->name; // 輸出:小李 (原物件被修改)
?>
$p = new Person() 重新指派,則區域變數指向新物件,外部原物件不受影響。| 型別 | 預設傳遞 | 函式內修改影響外部? | 強制傳參考語法 |
|---|---|---|---|
| 基本型別 (int, float, bool, string) | 傳值 (複製) | 否 | function foo(&$x) |
| 陣列 | 傳值 (複製整個陣列) | 否 (複製品) | function foo(&$arr) |
| 物件 | 傳參考控制代碼 | 是 (同一物件) | 無需 (已是參考語意) |
<?php
$a = 90; $b = 90.8; $c = true; $d = 'www.bianceng.cn';
function test1($a, $b, $c, $d) {
$a = 78; $b = 55.3; $c = false; $d = 'good';
}
test1($a, $b, $c, $d);
echo "$a||$b||$c||$d"; // 輸出:90||90.8||1||www.bianceng.cn (外部未變)
?>
<?php
$arr = [1,2,3];
function byVal($a) { $a[] = 4; }
function byRef(&$a) { $a[] = 4; }
byVal($arr); print_r($arr); // [1,2,3] 未變
byRef($arr); print_r($arr); // [1,2,3,4] 被修改
?>
__construct() (雙底線) 與 同類別名() (PHP 4 風格);同時存在時優先呼叫 __construct()。public。<?php
class Person {
public $name;
public $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
}
$p1 = new Person('www.bianceng.cn', 16);
$p2 = new Person('李四', 14);
?>
$this 就指向哪個物件。$p1->name)。<?php
class Person {
public $name;
public $age;
public function __construct() {
$this->name = 'www.bianceng.cn';
$this->age = 10;
}
}
$p1 = new Person();
echo "$p1->name is $p1->age years old!"; // www.bianceng.cn is 10 years old!
?>
unset()、GC 回收)。<?php
class Person {
public $name;
public $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
function __destruct() {
echo $this->name . ' 銷毀資源,關閉資料庫<br />';
}
}
$p1 = new Person('www.bianceng.cn', 16);
$p2 = new Person('李四', 14);
// 程式結束時輸出順序:
// 李四 銷毀資源,關閉資料庫
// www.bianceng.cn 銷毀資源,關閉資料庫
?>
__destruct()。gc_collect_cycles() 強制)。unset($obj) 移除變數參考,若為最後一個參考則觸發銷毀。精通類別定義、物件生命週期、傳遞語意與 $this 機制,能寫出記憶體安全、效能優異、易於擴充的 PHP OOP 程式碼。