php 中 private ?string ?Model 的 ? 語法說明

在 PHP 中,private ?string $roleClass 是一個 類型聲明(Type Declaration) 的屬性定義,具體含義如下:

分解說明:

程式一

class Example {
    private ?string $roleClass;

    public function setRoleClass(?string $role): void {
        $this->roleClass = $role;
    }

    public function getRoleClass(): ?string {
        return $this->roleClass;
    }
}

$obj = new Example();
$obj->setRoleClass("Admin");  // 合法
$obj->setRoleClass(null);     // 也合法
  1. private
    • 表示該屬性是 私有的,只能在定義它的類別內部訪問,外部和子類別無法直接存取。
  2. ?string
    • string 表示該屬性必須是字串類型。
    • ? 表示這個屬性可以是 string 或 null(即可為空的字串)。這是 PHP 7.1 引入的 nullable 類型(可為空的類型)。
  3. $roleClass
    • 屬性的變數名稱。

完整含義:

  • 定義一個私有屬性 $roleClass,它的值可以是:
    • 一個字串(string
    • 或者 null(表示未設定或無效值)。

程式二

public function createCategory(array $data): ?Model
{
	// 驗證資料
	$validator = Validator::make($data, [
		'name' => 'required',
		'order' => 'required',
		'enabled' => 'required',
	]);
	if ($validator->fails()) {
		throw new \InvalidArgumentException($validator->errors()->first());
	}
	$category = BlogCategory::create($data);
	return $category;
}

函式功能

public function createCategory(array $data): ?Model
  • 輸入:接受一個陣列 $data,包含分類的相關資訊
  • 輸出:回傳建立的 Model 實例(成功時)或 null(失敗時)

執行流程

1. 資料驗證
使用 Laravel 的驗證器檢查必要欄位:

$validator = Validator::make($data, [
    'name' => 'required',     // 分類名稱(必填)
    'order' => 'required',    // 排序權重(必填)
    'enabled' => 'required',  // 啟用狀態(必填)
]);

若驗證失敗,拋出異常並回傳第一個錯誤訊息

throw new \InvalidArgumentException($validator->errors()->first());

建立分類

通過驗證後,直接建立 BlogCategory 記錄:

$category = BlogCategory::create($data);
return $category;

可改進之處

  1. 驗證規則不夠嚴謹
    • 建議加入格式限制(例如 name 限制長度、order 必須是數字)。
    • 檢查 name 是否重複(避免重複分類)。
  2. 缺乏資料庫事務(Transaction)
    在複雜操作中,建議用 DB::transaction 確保資料一致性。
  3. 輸入值未過濾
    直接使用 $data 可能有安全風險,建議過濾或明確指定欄位。
  4. 回傳型別提示
    可具體標註回傳 BlogCategory 而非泛用的 Model

改進程式範例

public function createCategory(array $data): BlogCategory
{
    // 更嚴格的驗證規則
    $validator = Validator::make($data, [
        'name' => 'required|string|max:255|unique:blog_categories',
        'order' => 'required|integer|min:0',
        'enabled' => 'required|boolean',
    ]);
    
    if ($validator->fails()) {
        throw new \InvalidArgumentException($validator->errors()->first());
    }
    
    // 使用事務與明確欄位
    return DB::transaction(function () use ($data) {
        return BlogCategory::create([
            'name' => htmlspecialchars($data['name']), // 過濾特殊字元
            'order' => $data['order'],
            'enabled' => $data['enabled'],
        ]);
    });
}

其他相關說明:

  • 如果沒有 ?(例如 private string $roleClass),則屬性必須是 string 且不能為 null(除非有預設值)。
  • 這種語法廣泛用於現代 PHP 程式碼(尤其是 PHP 7.4+ 的屬性類型聲明),能提高程式碼的可讀性和安全性。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


內容索引