找到了一個原因 PHP 為什麼用下劃線命名欄位

liaosp發表於2020-03-27

有時前端問我,為什麼你們php 的引數都是下劃線的,感覺很不規範啊,你看(Java)其他人的都是駝峰命名。

我不管,php 是世界上最好的語言

其實這個問題好像,入行以來都是用下劃線的,但是說出一個原因我也說不出來, 今天我遇到了一個比較好解釋這種命名的一種,如果有更清楚的小夥伴歡迎留言。

laravel getXXXAttribute 修改器無效

場景是我爬取亞馬遜介面,亞馬遜的命名都是駝峰命名,比如:ProductDetail

於是我資料中的欄位 為:ProductDetail

然後我想用修改器對這個欄位進行修改,在相應的model設定:

    public function getProductDetailAttribute($extra)
    {
        return json_decode($extra, true);
    }

但是我無論怎麼試,就是不行。於是我好好看了一下原始碼的修改器

laravel getXXXAttribute 對於資料庫欄位全駝峰命名無效

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 協議》,轉載必須註明作者和本文連結

相關文章