توی دنیای php ما دو نوع متفاوت از دسترسی به داده ها رو در آرایه ها و آبجکت ها تجربه می کنیم.
نحوه دسترسی به المان های آرایه معروف هست به array notation و در آبجکت ها هم با dot notation شناخته میشه
$course = [
'id' => 1,
'title' => 'laraplus laravel crash course',
'price' => 250000
];
// array notation
echo $course['title']
$post = (object) [
'id' => 2,
'title' => 'how to become fluent in laravel - Laraplus',
'author' => 'sirvan monfared'
];
// dot notation
echo $post->author
در کد بالا ما متغیر course$ رو از نوع آرایه در نظر گرفتیم و زیر اون نحوه دسترسی به المان های اون با استفاده از array notation رو نشون دادیم. همینطور متغیر post$ رو از نوع آبجکت (stdClass) تعریف کردیم و نحوه دسترسی به المان این آبجکت با استفاده از dot notation رو توضیح دادیم.
مشکل اینجاست که اگه برای آرایه یا آبجکت اگر بخوایم به المانی که وجود نداره دسترسی پیدا کنیم یا از notation اشتباه برای دسترسی به المان های استفاده کنیم به ارور برخورد میکنیم. مثلا برای کدهای بالا:
echo $course['name'];
// undefined array key 'name'
echo $post['author']
// can not use object of type stdClass as array
همونطور که میبینی کارکردن با آرایه ها یا میکس کردن آبجکت ها و آرایه ها گاهی اوقات میتونه پرریسک باشه. بهتر نیست یک روش یکسان برای دسترسی به المان های آرایه ها و آبجکت ها داشته باشیم بدون اینکه نگران استفاده از نوتیشن اشتباه یا ارورها باشیم؟
خب کلاس Fluent دقیقا برای همین کار خلق شده.
استفاده از کلاس Fluent در بعضی مواقع میتونه نسبت به استفاده از آرایه ها برتری داشته باشه. چون به شما اجازه میده برای دسترسی به المان ها، از dot notation استفاده کنید
کلاس Fluent در نیم اسپیس Illuminate\Support تعریف شده و همونطور که در کدهای زیر میبینید، از اینترفیس های Arrayable, ArrayAccess, Jsonable و JsonSerializable استفاده میکنه
<?php
namespace Illuminate\Support;
use ArrayAccess;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Contracts\Support\Jsonable;
use JsonSerializable;
class Fluent implements Arrayable, ArrayAccess, Jsonable, JsonSerializable
{
}
وقتی از کلاس Fluent استفاده میکنی بهت اجازه میده که برای دسترسی به المان ها از هر دو حالت array notation و dot notation استفاده کنی. بذار چند تا مثال از نحوه استفاده از کلاس Fluent در لاراول رو ببینیم:
برای اینکه یک آبجکت جدید از کلاس Fluent بسازی میتونی از متد make استفاده کنی
$course = new Fluent::make([
'id' => 1,
'title' => 'laraplus laravel crash course',
'price' => 250000
]);
حالا میتونی با هر دو روش، به پراپرتی های اون دسترسی پیدا کنی:
echo $course->title;
// laraplus laravel crash course
echo $course['title'];
// laraplus laravel crash course
حتی میتونی آرایه ها و آبجکت هایی که از قبل داشتی رو هم با روش زیر به Fluent تبدیل کنی:
$params = [
'id' => 1,
'title' => 'laraplus laravel crash course',
'price' => 250000
];
$course = new Fluent($params);
$params2 = (object) [
'id' => 2,
'title' => 'how to become fluent in laravel - Laraplus',
'author' => 'sirvan monfared'
];
$post = new Fluent($params2);
echo $product['title'];
// or
echo $post['title'];
حالا به نظرت اگر بخوایم در Fluent ها، به یک پراپرتی که وجود نداره دسترسی پیدا کنیم چه اتفاقی میفته؟ برخلاف آرایه و آبجکت های عادی، اینجا دیگه خبری از ارور و Exception نیست و در صورت وجود نداشتن پراپرتی، مقدار null برگردونده میشه
$course->duration
// null
با کلاس نه تنها میتونی به پراپرتی ها دسترسی پیدا کنی، بلکه میتونی مقدار اونها رو تغییر بدی یا حذفشون کنی و این کار هم با هر دو حالت array notation و dot notation امکان پذیره:
$params = [
'id' => 1,
'title' => 'laraplus laravel crash course',
'price' => 250000
];
$course = new Fluent($params);
$course['price'] = 12000;
// or
$course->title = 'a new course by sirvan';
برای حذف پرارتی ها هم میتونی از دستور unset استفاده کنی
unset($post['author']);
// or
unset($post->author);
یک روش دیگه هم برای ساخت آبجکت Fluent وجود داره و اون هم استفاده از Fluent Api هست. اینطوری:
$course = (new Fluent)
->id(1)
->name('laravel crash course')
->price(150000);
در مجموع میشه گفت کلاس Fluent یکی از ابزارهای پرکاربرد لاراول هست که در قسمت های مختلفی از کدهای خود فریمورک هم استفاده شده و میتونه برای روان تر شدن و خواناتر شدن کدهاتون خیلی کمک کننده باشه.
ممنون میشم که نظرت رو در مورد این مطلب در بخش دیدگاه ها بهم بگی