萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 關聯陣列注入物件屬性:建構子簡化多屬性初始化

當物件屬性增多,逐一呼叫 Setter 方法顯得冗長。利用關聯陣列搭配建構子,可一次性傳入多組屬性值,大幅簡化物件初始化程式碼,也是後續整合資料庫資料的基礎模式。

傳統方式:逐一呼叫 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;
    }
}
?>
💡 設計模式連結: 此模式是 Builder 模式 的簡化版,也是 Data Transfer Object (DTO) 與 Entity 轉換的基礎。現代框架(Laravel Eloquent、Doctrine)皆大量使用此模式將資料庫列映射為物件。
copyright © 萬盛學電腦網 all rights reserved