راکت

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

9 پاسخ

سلام

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

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

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

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

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

ثبت پرسش جدید

پاسخ‌ها

9
حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

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

حسین شیری نژاد
حسین شیری نژاد
@hosseinshirinegad98

تخصص: programmer

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

شاید پاسخ شما همین‌جا باشد

saman
saman
@saman1111

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

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

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

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

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
saman
@saman1111

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

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

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

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

حسین حسین نژاد
حسین حسین نژاد
@toofan1404

تخصص: توسعه دهنده وب - سطح Mid-Level

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

فرید عقیلی
فرید عقیلی
@faridaghili

تخصص: طراح و توسعه دهنده وب

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

حسین حسین نژاد
حسین حسین نژاد
@toofan1404

تخصص: توسعه دهنده وب - سطح Mid-Level

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

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

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