有時前端問我,為什麼你們php 的引數都是下劃線的,感覺很不規範啊,你看(Java)其他人的都是駝峰命名。
我不管,php 是世界上最好的語言
其實這個問題好像,入行以來都是用下劃線的,但是說出一個原因我也說不出來, 今天我遇到了一個比較好解釋這種命名的一種,如果有更清楚的小夥伴歡迎留言。
laravel getXXXAttribute 修改器無效
場景是我爬取亞馬遜介面,亞馬遜的命名都是駝峰命名,比如:ProductDetail
於是我資料中的欄位 為:ProductDetail
然後我想用修改器對這個欄位進行修改,在相應的model設定:
public function getProductDetailAttribute($extra)
{
return json_decode($extra, true);
}
但是我無論怎麼試,就是不行。於是我好好看了一下原始碼的修改器
HasAttributes.php
是修改器的核心,透過正則篩選,當前模型中有多少個符合修改器的條件。
protected static function getMutatorMethods($class)
{
preg_match_all('/(?<=^|;)get([^;]+?)Attribute(;|$)/', implode(';', get_class_methods($class)), $matches);
return $matches[1];
}
匹配出了ProductDetai欄位,符合修改器條件的。
接著,看到一個操作,至關重要
public static function cacheMutatedAttributes($class)
{
static::$mutatorCache[$class] = collect(static::getMutatorMethods($class))->map(function ($match) {
return lcfirst(static::$snakeAttributes ? Str::snake($match) : $match);
})->all();
}
也就是把 ProductDetai 轉化成了 product_detail
然後再從attributes 去匹配相應的欄位,結果沒有找到,故不會走上面定義的方法。
就這樣被屈服了,然後我把資料庫的欄位,轉為product_detail解決問題。
所以命名規範,還是很重要的。
laravel 用的人多,這個算一個php 為什麼用下劃線命名的原因嗎?
本作品採用《CC 協議》,轉載必須註明作者和本文連結