توابع ناشناس – anonymous
توابع ناشناخته که اصطلاحا به آنها تابع روی هوا (on the fly) گفته می شود، به طور ساده تابعی است بدوننام. مانند مثال زیر:
-
توابع Lambada
یک Lambada تابع ناشناختهای است که به یک متغیر انتساب داده می شود و یا به عنوان پارامتر به تابع دیگر انتساب داده میشود.
-
استفاده از Lambada
از آن جا که این مدل از تابعها نام ندارند، پس شما نمیتوانید مثل تابعهای معمولی آنها را صدا بزنید. بلکه باید همینطور که قبلا به آن اشاره شد، تابع را به یک متغیر انتساب بدهید و یا به عنوان پارامتر به تابع دیگری ارسال کنید.
نکته:همینطور که در کد بالا هم مشاهده می کنید، سمی کالن (;) را بعد از اتمام تابع قرار میدهیم.
نکته:همینطور که در کد بالا هم مشاهده می کنید، میتوانیم پارامتر به صورت دلخواه به تابع بدهیم (world$).
به منظور استفاده از تابع ناشناخته، ما این تابع را به یک متغیر انتساب میدهیم و سپس متغیر را به عنوان یک تابع، Call یا صدا میزنیم.
شما همچنین میتوانید Lambadaایی که تعریف کردهاید را به عنوان پارامتر به تابع دیگر بفرستید:
شاید الان با خودتان گفتید که این تابع بدون اسم چه زمانی کارایی دارد؟
Lambada از تعریف تابع هایی که معمولا کد کوچک و مختصری دارند و ممکن است شما در طول اجرای برنامه، مثلا، فقط یکبار صدا بزنید، خودداری می کند. اغلب شما، به تابعی نیاز دارید که کاری را برای شما انجام دهد، اما این نیاز را پیدا نمی کنید که آن را داخل global scope برنامه یا حتی به عنوان بخشی از بقیه کدها اضافه کنید.
به جای اینکه تابعی داشته باشید که یک بار استفاده و بعد هم رها شود، میتوانید از Lambada استفاده کنید.
یک مورد پر استفاده دیگر توابع ناشناخته درfunction callbackها است.
اگر مفهوم توابع callback در PHP را نمیدانید، یک جستجو راجع به آن انجام دهید، چرا که شرح کامل آن در این بحث نمی گنجد. اما یک نگاه سطحی با یک مثال به آن میاندازیم تا بحث بیشتر برایتان روشن شود.
Callback هر تابعی که صدا زده شده است توسط تابع دیگری که البته آن تابع دیگر، تابع اول را به عنوان پارامتر میگیرد و Call میکند. معمولا callback تابعی است که زمانی صدا زده میشود که اتفاقی رخ داده باشد، که در دنیای برنامه نویسی به آن اتفاق، رویداد یا event گفته میشود.
مثال زیر یک مثال پایهایی از تابعهای callback است:
شما میتوانید تابعی که نامش در یک متغیر ذخیره شده است را call کنید. فقط کافیست به انتهای نام متغیر، پرانتز باز و بسته () اضافه کنید. مثل ()variable$
از توابع ناشناخته در توابع بومی PHP استفاده شده، که مثالهای فوق العادهای در این زمینه هستند، از جمله array_walk, array_map, array_reduce و array_filter usort.
در مثال زیر نمونهایی از callback function را مشاهده میکنید که با Lambada و در تابع array_filter پیاده سازی شده است.
نکته: کار array_filter به این صورت است که پارامتر اول یک آرایه مثلا input$ را میگیرد و در یک Loop قرار میدهد و هر دفعه مقدار فعلی آرایه را به function callback ارسال یا pass میکند. اگرfunction callback مقدار true برگرداند، value جاری خانه مورد نظر از آرایه برگردانده میشود. در ضمن keyهای آرایه هم تغییری نمیکنند.
در مثال بالا، عبارت { ;function ($v) { return $v > 2 یک Lambada است، که اگر میخواهید قابل استفاده مجدد باشد باید آن را داخل یک متغیر ذخیره کنید.
اطلاعات بیشتر:
پیشتر میتوانستید از create_function در PHP استفاده کنید که اساسا همین کار را انجام میدهد.
یک Closure (کلوژر) اساسا همان Lambada است، علاوه بر اینکه، میتوانید به متغیرهای خارج از محدودهایی که تعریف شده هم، دسترسی داشته باشد.
همچنین اگر میخواهید مقدار متغیر user$ را داخل Closure تغییر بدهید و بیرون آن هم این تغییر از بین نرود، باید حتما قبل از متغیر داخل عبارت use یک & (امپرسند) قرار بدهید تا متغیر به صورت ارسال با مرجع فرستاده شود.
بیایید مثال array_filter را نیز با Closure انجام بدهیم.
مثالی از Closure در array_walk:
استفاده از this$ در توابع ناشناخته
در نیمه اول سال 2012، یعنی زمانی که PHP به نسخه 5.4 خودش رسید، قابلیت جدیدی به توابع ناشناخته اضافه شد. بوسیله این قابلیت قادر هستید به راحتی با استفاده از this$ داخل تابع ناشناخته، به یک نمونه Object دسترسی داشته باشید.
یک مثال معروف از استفاده از این نوع توابع در routing درخواست ها در فریم ورک های مدرن است.
به عنوان مثال Laravel، به شما اجازه میده که مثل زیر عمل کنید:
این یک مثال خیلی ساده بود، اما روشن میکند که چطور یک Closure در شرایطی که به آن نیاز هست میتواند مورد استفاده واقع شود.
بدون دیدگاه