當物件屬性增多,逐一呼叫 Setter 方法顯得冗長。利用關聯陣列搭配建構子,可一次性傳入多組屬性值,大幅簡化物件初始化程式碼,也是後續整合資料庫資料的基礎模式。
<?php
$user = new User();
$user->setName('Kirupa');
$user->setJob('Engineer');
$user->setSchool('MIT');
$user->setHomeTown('Spanish Fort');
$user->setHomeState('Alabama');
// 5 個方法呼叫,程式碼冗長
?>
<?php
$attribs = [
'name' => 'Kirupa',
'job' => 'Engineer',
'school' => 'MIT',
'homeTown' => 'Spanish Fort',
'homeState' => 'Alabama',
];
$kirupa = new User($attribs);
echo 'Name: ' . $kirupa->getName() . '<br />';
echo 'Job: ' . $kirupa->getJob() . '<br />';
echo 'School: ' . $kirupa->getSchool() . '<br />';
echo 'Home Town: ' . $kirupa->getHomeTown() . '<br />';
echo 'Home State: ' . $kirupa->getHomeState() . '<br />';
class User {
private string $name = '';
private string $job = '';
private string $school = '';
private string $homeTown = '';
private string $homeState = '';
// 建構子接收關聯陣列
public function __construct(array $attribs = []) {
$this->name = $attribs['name'] ?? '';
$this->job = $attribs['job'] ?? '';
$this->school = $attribs['school'] ?? '';
$this->homeTown = $attribs['homeTown'] ?? '';
$this->homeState = $attribs['homeState'] ?? '';
}
// Getter/Setter 略...
}
?>
PDO::FETCH_ASSOC 直接回傳關聯陣列,可直接傳給建構子?? null 聯合運算子提供預設值物件內部方法可互相呼叫,實作衍生邏輯(如州名轉縮寫):
<?php
$attribs = [
'name' => 'Kirupa',
'homeState' => 'Alabama',
];
$kirupa = new User($attribs);
echo 'Name: ' . $kirupa->getName() . '<br />';
echo 'Home State: ' . $kirupa->getHomeState() . '<br />';
echo 'State Abbr.: ' . $kirupa->getHomeStateAbbr() . '<br />'; // AL
class User {
private string $name = '';
private string $homeState = '';
public function __construct(array $attribs = []) {
$this->name = $attribs['name'] ?? '';
$this->homeState = $attribs['homeState'] ?? '';
}
public function getName(): string { return $this->name; }
public function getHomeState(): string { return $this->homeState; }
// 衍生方法:呼叫自身其他方法
public function getHomeStateAbbr(): string {
$abbr = States::$ABBRS[$this->getHomeState()] ?? 'Unknown';
return $abbr;
}
}
// 靜態類別儲存常態對照表
class States {
public static array $ABBRS = [
'Alabama' => 'AL',
'Michigan' => 'MI',
'New York' => 'NY',
// 更多...
];
}
?>
static 成員屬於類別而非實例,所有實例共享ClassName::$staticProp、ClassName::staticMethod()$ABBRS、$DB_CONFIG)<?php
class User {
private string $email = '';
private \DateTime $birthDate;
public function __construct(array $data = []) {
// 建構子處理資料轉換與驗證
$this->email = $data['email'] ?? '';
if (isset($data['birth_date'])) {
$this->birthDate = new \DateTime($data['birth_date']);
}
}
public function getAge(): int {
return $this->birthDate->diff(new \DateTime())->y;
}
}
?>