saman
4 سال پیش توسط saman مطرح شد
9 پاسخ

تفاوت نوشتن کلاس لاراول در تابع و پارامتر

سلام

بعضی وقت ها دیدم که کلاسی که میخوان از شی اون استفاده کنن توی پارامتر های تابع می نویسن

publuc function store(Request $request, User $user)

و بعضی وقت ها هم این شی داخل تابع تعریف میشه

publuc function store(Request $request) {
$user = new User;
}

این دو تا با هم چه تفاوت هایی دارن ؟


ثبت پرسش جدید
حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
2

شی user که پارامتر هست یک شی پخته هست که فیلدهاش مقدار دهی شده و داره به یک کاربر که وجود داره اشاره میکنه و این کاربر قبلا ساخته شده و الان تو برنامه میشه ازش استفاده کرد.
اما شی دوم که داخل متد تعریف شده یک شعی خام هست که فیلدهاش هیچ مقداری ندارند و به هیچ کاربری هم اشاره نمی کند و امادست تا مقادیر یه شخص رو تو فیلدهاش قرار بدیم تا به عنوان یک یوز در برنامه شناخته شده باشد.


حسین شیری نژاد
تخصص : programmer
@hosseinshirinegad98 4 سال پیش مطرح شد
1

ضمنادر user اولی که پارامتر است ما یک یوز رو به تابع ارسال کردیم تا داخل تابع بتونیم از یوزر استفاده کنیم روش ارسال و دریافت شی در php به همین صورت است که مشاهده میکنید ابتدانام کلاس و بعد اسم شعی از کلاس میاد


saman
@saman1111 4 سال پیش مطرح شد
0

@hosseinshirinegad98
بله شما کاملا درست میفرمایید.
این رو میدونم که اون رو میشه از جای دیگه پاس داد ولی توی لاراول این امکان وجود داره که اینجوری نوشته بشه و داخل تابع از اون شی به عنوان یک شی خام استفاده بشه.

یا اگر کلاسی نوشتیم و میخوایم یک شی ازش بسازیم میتونیم توی پارامتر ها اون رو بنویسیم.


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
1

ببینید وقتی که ما اسم کلاسی رو قبل از یک پارامتر متد قرار میدیم... مثلا:

publuc function store(Request $request)

در واقع داریم کلاس Request رو Type-hint می‌کنیم
به این معنا که ما متغیری داریم به نام request$
و این متغیر باید Instance ی از کلاس Request باشه..

همونطور که میشه مشخص کرد یه پارامتر باید Integer باشه:

publuc function method(int $value)

در اینجا value$ حتما باید یک عدد باشه


در این بین لاراول مکانیزمی داره به نام Automatic Resolution

اگر شما از PHP خام استفاده کنید.. , و مثال بالا رو درش قرار بدید... کدتون در ۱ صورت اجرا میشه
در صورتی که شما خودت Instance از کلاس Request بسازی و اون رو به عنوان پارامتر به متد پاس بدی.

حالا Automatic Resolution در لاراول کارش اینه که چک میکنه ببینه آیا شما کلاسی به نام Request رو دارید و اگر دارید خودش اون کلاس رو Instantiate میکنه و به داخل بدنه متد پاس میده.

روش دوم که خودتون کلاس رو نمونه سازی کنید (با کلیدواژه new) برای ساخت یک آبجکت هست و کاربردهای مختلفی میتونه داشته باشه.


saman
@saman1111 4 سال پیش مطرح شد
0

@ali.bayat
خیلی ممنونم. بله سوالم دقیقا همین بود.
خب این که اگه ما مقداری بهش پاس ندیم خودش یه instance از اون کلاس رو برای ما میسازه با این که خودمون با new بسازیم تفاوتی نداره ؟ ( توی این یک مورد خاص. در بقیه موارد new کاربرد های بیشتری هم داره ).

منظورم اینه وقتی یه شی خالی از کلاس مورد نظر بخوایم میشه هر دو جورش رو نوشت ؟


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
0

خیر شئ خالی رو شما باید با کلیدواژه new بسازید. کلاسی که از طریق Type-Hinting پاس داده میشه معمولا شامل یه سری داده ها هست


حسین حسین نژاد
تخصص : توسعه دهنده وب - سطح Mid-Level
@toofan1404 2 سال پیش آپدیت شد
0

@ali.bayat
سلام
یعنی برای استفاده کردن از روش func(classname $varname) حتما باید اول یه شئ از کلاسمون بسازیم و متدها و پراپرتی هاشو مقداردهی کنیم و بعد این شئ رو بعنوان پارامتر به شکل func(classname $varname) ارسال کنیم. درست متوجه شدم؟


فرید عقیلی
تخصص : طراح و توسعه دهنده وب
@faridaghili 2 سال پیش مطرح شد
0

تو کدهایی که دیدین و به این شکل شی رو پاس می‌دادن داره از Dependency Injection لاراول انجام می‌شه. این کلیدواژه رو سرچ و مطالعه کن.


حسین حسین نژاد
تخصص : توسعه دهنده وب - سطح Mid-Level
@toofan1404 2 سال پیش مطرح شد
0

الان مطمئن شدم. فقط یه چیزی. چرا از کلمه گلوبال یا متغیر گلوبالز برای فراخوان کردن متغیر شئ توی تابع استفاده نمیکنیم؟بالاخره شئ هم یه نوع متغیره که میتونه محلی یا سراسری باشه.


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام