基本上,只要你嘗試從模型訪問屬性,該__get
magic method被調用,它是類似如下:
public function __get($key)
{
return $this->getAttribute($key);
}
正如你所看到的是,__get
魔術方法調用中定義的另一個用戶方法(getAttribute
),它是類似如下:
public function getAttribute($key)
{
if (! $key) {
return;
}
// If the attribute exists in the attribute array or has a "get" mutator we will
// get the attribute's value. Otherwise, we will proceed as if the developers
// are asking for a relationship's value. This covers both types of values.
if (array_key_exists($key, $this->attributes) ||
$this->hasGetMutator($key)) {
return $this->getAttributeValue($key);
}
// Here we will determine if the model base class itself contains this given key
// since we do not want to treat any of those methods are relationships since
// they are all intended as helper methods and none of these are relations.
if (method_exists(self::class, $key)) {
return;
}
return $this->getRelationValue($key);
}
在這種情況下(關係),最後一行return $this->getRelationValue($key);
負責檢索一段關係。繼續閱讀源代碼,跟蹤每個函數調用,你就會明白。從Illuminate\Database\Eloquent\Model.php::__get
開始的方法。順便說一下,這個代碼取自Laravel
的最新版本,但最終過程是相同的。
簡短摘要:Laravel在首先檢查屬性/ $kay
被訪問是一個模型的屬性或如果它在模型本身則只是簡單地返回該屬性否則它保持進一步的檢查,並且如果所定義的存取方法它在模型中使用該名稱創建了一個方法(property/$kay
),然後它只是返回關係。
非常廣泛,但總之,它是通過'Model_php'的__get()'訪問器來解析的。檢查源代碼。 –
是的。 Laravel的源代碼是開源的。你可以自己看看這個:https://github.com/laravel/framework/blob/5.4/src/Illuminate/Database/Eloquent/Model.php#L1260 –
它的魔力(功能)。 – apokryfos