💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۱۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ امیر مهدی سلگی
تفاوت 3 نقطه بعد و قبل از آرگومان ورودی
جامعه پی اچ پی ایجاد شده در ۰۶ تیر ۱۴۰۳

سلام وقتتون بخیر،
دوستانم من قبلا داخل کدی دیدم که برای پارامتر‌های وروردی به جای 3 نقطه ای که قبل از پارامتر‌های وروردی باشه که استاد استفاده کردن، بعد از اون بوده ... یعنی به این صورت:
name...
...name
می خواستم بدونم اینا اصلاً تفاوتی با هم دارین و اگر دارن تفاوتشون داخل چی هستش ؟

سلام،

سه مدل برای این اوپراتور داریم.

1. Variadic function:

وقتی سه نقطه (...) قبل از پارامتر ورودی توو تعریف تابع بیاد بهش میگن "variadic functions". یعنی تابع می‌تونه تعداد نامحدودی آرگومان ورودی بگیره.

function sum(...$numbers) {
    return array_sum($numbers);
}
echo sum(1, 2, 3); // 6
echo sum(4, 5, 6, 7); // 22

2. Argument unpacking:

وقتی سه نقطه (...) قبل آرگومان بیاد(جایی که به تابع مقدار میدیم)، برای "unpacking" آرایه‌ها استفاده میشه. یعنی می‌تونیم یک آرایه رو به صورت جداگانه به عنوان چندین آرگومان به تابع پاس بدیم.

function add($a, $b, $c) {
    return $a + $b + $c;
}
$numbers = [1, 2, 3];
echo add(...$numbers); // 6

اینجا، آرایه $numbers به صورت جداگانه به تابع add پاس داده میشه. (یعنی مقادیرش به جای سه پارامتر تابع میشینه)

تا اینجا این دو مورد روی آرایه اعمال میشن. در اول packing صورت میگیره و مقادیر تبدیل به آرایه میشن و در دومی unpacking میشه.

3. First-class Callable (از نسخه 8.1):

اما سومی متفاوته. در PHP 8.1 یک قابلیت جدید به نام "First-class Callable Syntax" معرفی شده که اجازه میده توابع و متدها رو به شکلی ساده‌‌تر به عنوان callable تعریف و استفاده کنیم. این ویژگی به ما اجازه میده تا به راحتی توابع و متدها رو به متغیرها نسبت بدیم یا به عنوان آرگومان به توابع دیگه پاس بدیم.

فرض کن یک کلاس داریم که یک متد داره و می‌خوایم این متد رو به یک متغیر نسبت بدیم و بعداً اجراش کنیم.

class MyClass {
    public function sayHello($name) {
        return "Hello, $name!";
    }
}
// ساختن یک شیء از کلاس
$obj = new MyClass();
// تعریف callable با استفاده از First-class Callable Syntax
$callable = $obj->sayHello(...);
// استفاده از callable
echo $callable('World'); // Hello, World!
محسن موحد ۰۶ تیر ۱۴۰۳، ۲۱:۴۰