سلام
بعضی وقت ها دیدم که کلاسی که میخوان از شی اون استفاده کنن توی پارامتر های تابع می نویسن
publuc function store(Request $request, User $user)
و بعضی وقت ها هم این شی داخل تابع تعریف میشه
publuc function store(Request $request) {
$user = new User;
}
این دو تا با هم چه تفاوت هایی دارن ؟
شی user که پارامتر هست یک شی پخته هست که فیلدهاش مقدار دهی شده و داره به یک کاربر که وجود داره اشاره میکنه و این کاربر قبلا ساخته شده و الان تو برنامه میشه ازش استفاده کرد.
اما شی دوم که داخل متد تعریف شده یک شعی خام هست که فیلدهاش هیچ مقداری ندارند و به هیچ کاربری هم اشاره نمی کند و امادست تا مقادیر یه شخص رو تو فیلدهاش قرار بدیم تا به عنوان یک یوز در برنامه شناخته شده باشد.
ضمنادر user اولی که پارامتر است ما یک یوز رو به تابع ارسال کردیم تا داخل تابع بتونیم از یوزر استفاده کنیم روش ارسال و دریافت شی در php به همین صورت است که مشاهده میکنید ابتدانام کلاس و بعد اسم شعی از کلاس میاد
@hosseinshirinegad98
بله شما کاملا درست میفرمایید.
این رو میدونم که اون رو میشه از جای دیگه پاس داد ولی توی لاراول این امکان وجود داره که اینجوری نوشته بشه و داخل تابع از اون شی به عنوان یک شی خام استفاده بشه.
یا اگر کلاسی نوشتیم و میخوایم یک شی ازش بسازیم میتونیم توی پارامتر ها اون رو بنویسیم.
ببینید وقتی که ما اسم کلاسی رو قبل از یک پارامتر متد قرار میدیم... مثلا:
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) برای ساخت یک آبجکت هست و کاربردهای مختلفی میتونه داشته باشه.
@ali.bayat
خیلی ممنونم. بله سوالم دقیقا همین بود.
خب این که اگه ما مقداری بهش پاس ندیم خودش یه instance از اون کلاس رو برای ما میسازه با این که خودمون با new بسازیم تفاوتی نداره ؟ ( توی این یک مورد خاص. در بقیه موارد new کاربرد های بیشتری هم داره ).
منظورم اینه وقتی یه شی خالی از کلاس مورد نظر بخوایم میشه هر دو جورش رو نوشت ؟
خیر شئ خالی رو شما باید با کلیدواژه new بسازید. کلاسی که از طریق Type-Hinting پاس داده میشه معمولا شامل یه سری داده ها هست
@ali.bayat
سلام
یعنی برای استفاده کردن از روش func(classname $varname) حتما باید اول یه شئ از کلاسمون بسازیم و متدها و پراپرتی هاشو مقداردهی کنیم و بعد این شئ رو بعنوان پارامتر به شکل func(classname $varname) ارسال کنیم. درست متوجه شدم؟
تو کدهایی که دیدین و به این شکل شی رو پاس میدادن داره از Dependency Injection لاراول انجام میشه. این کلیدواژه رو سرچ و مطالعه کن.
الان مطمئن شدم. فقط یه چیزی. چرا از کلمه گلوبال یا متغیر گلوبالز برای فراخوان کردن متغیر شئ توی تابع استفاده نمیکنیم؟بالاخره شئ هم یه نوع متغیره که میتونه محلی یا سراسری باشه.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟