🚀 چند خروجی از توابع در پایتون و PHP
اگه با Python کار کرده باشید، میدونید که میتونیم با تاپلها مقادیر برگشتی یک تابع رو در چندین متغیر بریزیم.
مثال در پایتون:
〰〰〰〰〰〰
❓ اما داخل PHP هم ممکنه؟
✅ جواب: بله! در PHP میتونیم از آرایههای فهرستی برای همین کار استفاده کنیم:
💡 از PHP 7.1+ میتونیم از نسخه کوتاه شده هم استفاده کنیم:
〰〰〰〰
✨ مزیتها و قابلیتهای بیشتر:
1. باز کردن چند سطحی:
2. کار با آرایههای انجمنی:
3. نادیده گرفتن عناصر اضافی:
4. خواناتر و مدرنتر نسبت به list
〰〰〰〰
نسخه کوتاه [ ] شبیه tuple unpacking پایتون است و خیلی انعطافپذیرتر است.
💡 با این روش میتونید چند خروجی از یک تابع داشته باشید و کدتون هم خواناتر و ساختارمندتر بشه.
اگه با Python کار کرده باشید، میدونید که میتونیم با تاپلها مقادیر برگشتی یک تابع رو در چندین متغیر بریزیم.
یعنی به جای داشتن یک خروجی، میتونیم چند خروجی داشته باشیم!
مثال در پایتون:
def sum_and_product(a, b) -> tuple:
suma = a + b
prod = a * b
return (suma, prod)
sum, product = sum_and_product(3, 5)
print(sum) # 🟢 8
print(product) # 🟢 15
〰〰〰〰〰〰
❓ اما داخل PHP هم ممکنه؟
✅ جواب: بله! در PHP میتونیم از آرایههای فهرستی برای همین کار استفاده کنیم:
function sum_and_product(int $a, int $b): array {
$sum = $a + $b;
$prod = $a * $b;
return [$sum, $prod];
}
list($sum, $product) = sum_and_product(3, 5);
echo $sum . PHP_EOL; // 🟢 8
echo $product . PHP_EOL; // 🟢 15💡 از PHP 7.1+ میتونیم از نسخه کوتاه شده هم استفاده کنیم:
[$sum, $product] = sum_and_product(3, 5);
〰〰〰〰
✨ مزیتها و قابلیتهای بیشتر:
1. باز کردن چند سطحی:
$data = [1, [2, 3]];
[$a, [$b, $c]] = $data;
2. کار با آرایههای انجمنی:
$data = ['sum' => 8, 'product' => 15];
['sum' => $s, 'product' => $p] = $data;
3. نادیده گرفتن عناصر اضافی:
$data = [1, 2, 3, 4];
[, $b, , $d] = $data;
4. خواناتر و مدرنتر نسبت به list
〰〰〰〰
نسخه کوتاه [ ] شبیه tuple unpacking پایتون است و خیلی انعطافپذیرتر است.
💡 با این روش میتونید چند خروجی از یک تابع داشته باشید و کدتون هم خواناتر و ساختارمندتر بشه.
🔥1
🐘 اپراتور (?->) در PHP
📌 این یعنی چی؟
همونطور که میدونیم اگه متغییر object$ برابر با NULL باشه، خروجیمون خطای Fatal میده. اما با اپراتور (?->) شما رسما میگی اگه NULL بود، خروجی رو NULL برگردون.
🔗 زنجیرهسازی
میتونی چند پراپرتی پشت سر هم بخونی:
اگر متغییر object$ برابر با NULL باشه, خروجی NULL خواهد بود.
اما اگر object$ واقعا آبجکت بود, ولی پراپرتی test برابر با NULL بود، خروجیمون خطای Fatal میده(چون فقط جلوی object$ از ?-> استفاده کردیم).
✅ راهحل
برای هر جایی که احتمال NULL بودن هست باید دوباره ?-> بذاری:
💡 مثال:
✨ خلاصه:
اپراتور ?-> یعنی اگر NULL بود، ادامه نده و NULL بده.
و برای زنجیرههای طولانی، هرجا احتمال NULL هست باید دوباره ?-> استفاده کنیم.
از نسخه PHP 8 به بعد عملگر جدیدی به اسم NullSafe Operator معرفی شد:
$object?->test
📌 این یعنی چی؟
همونطور که میدونیم اگه متغییر object$ برابر با NULL باشه، خروجیمون خطای Fatal میده. اما با اپراتور (?->) شما رسما میگی اگه NULL بود، خروجی رو NULL برگردون.
🔗 زنجیرهسازی
میتونی چند پراپرتی پشت سر هم بخونی:
$object?->test->test_again
اگر متغییر object$ برابر با NULL باشه, خروجی NULL خواهد بود.
اما اگر object$ واقعا آبجکت بود, ولی پراپرتی test برابر با NULL بود، خروجیمون خطای Fatal میده(چون فقط جلوی object$ از ?-> استفاده کردیم).
✅ راهحل
برای هر جایی که احتمال NULL بودن هست باید دوباره ?-> بذاری:
$object?->test?->test_again
💡 مثال:
class Test {
public $test;
}
class Sub {
public $test_again = "salam";
}
$a = new Test();
$a->test = new Sub();
$b = null;
echo $a?->test?->test; // salam
echo $b?->test?->test_again; // null✨ خلاصه:
اپراتور ?-> یعنی اگر NULL بود، ادامه نده و NULL بده.
و برای زنجیرههای طولانی، هرجا احتمال NULL هست باید دوباره ?-> استفاده کنیم.
🧩 قابلیت ::class در PHP
از نسخهی PHP 5.5 به بعد، قابلیتی به نام ::class اضافه شد که مسیر کامل یک کلاس (همراه با namespace) را به صورت رشته برمیگرداند.
مثلاً:
🔹 self::class
نام همان کلاسی را برمیگرداند که کد درون آن نوشته شده است.
یعنی حتی اگر کلاس فرزند آن را صدا بزند، باز هم اسم کلاس والد برمیگردد.
🔹 static::class
برعکس self، در زمان اجرا بررسی میکند شیء واقعاً از چه کلاسی ساخته شده است.
پس اگر کلاس فرزند از کلاس والد ارثبری کرده باشد، static::class نام کلاس فرزند را میدهد.
🔹
یک ثابت جادویی (magic constant) است که همیشه نام کلاسی که کد در آن نوشته شده را برمیگرداند.
تقریباً معادل self::class است و تفاوت جزئی در بافت استفاده دارد.
〰〰〰〰
📘 خلاصه:
از نسخهی PHP 5.5 به بعد، قابلیتی به نام ::class اضافه شد که مسیر کامل یک کلاس (همراه با namespace) را به صورت رشته برمیگرداند.
مثلاً:
namespace App\Core;
class ExitProcess {}
echo ExitProcess::class;
//result: App\Core\ExitProcess
این یعنی ::class فقط نام کامل کلاس را بهصورت string برمیگرداند و کاری اجرا نمیکند.〰〰〰〰
🔹 self::class
نام همان کلاسی را برمیگرداند که کد درون آن نوشته شده است.
یعنی حتی اگر کلاس فرزند آن را صدا بزند، باز هم اسم کلاس والد برمیگردد.
🔹 static::class
برعکس self، در زمان اجرا بررسی میکند شیء واقعاً از چه کلاسی ساخته شده است.
پس اگر کلاس فرزند از کلاس والد ارثبری کرده باشد، static::class نام کلاس فرزند را میدهد.
🔹
__CLASS__یک ثابت جادویی (magic constant) است که همیشه نام کلاسی که کد در آن نوشته شده را برمیگرداند.
تقریباً معادل self::class است و تفاوت جزئی در بافت استفاده دارد.
〰〰〰〰
📘 خلاصه:
ExitProcess::class مسیر کامل کلاس بهصورت رشته برمیگرداند.
self::class نام همان کلاس فعلی را میدهند.
static::class نام کلاس واقعی در زمان اجرا را برمیگرداند (حتی اگر از ارثبری استفاده شود).
‼️ ممکنه همچنین ساختاری در توابع دیدید، یا به اشتباه ازش استفاده کنید:
function fnc1() {
echo "fnc1";
return false;
}
function fnc2() {
echo "&&fnc2";
return true;
}
return fnc1() && fnc2();💡 بررسی عمیق تابع intval() و (int) در PHP:
〰〰〰〰
❌ خیلیها فکر میکنن intval() یا (int) کل رشته رو بررسی میکنه و اگر جز عدد کاراکتر دیگهای بود، صفر میده.
✅ اما intval() یا (int) فقط از ابتدای رشته شروع میکنه به خواندن عدد.
- اگر ابتدای رشته عدد باشه، تا جایی که عدد هست ادامه میده و بعد متوقف میشه.
- اگر ابتدای رشته عدد نباشه، نتیجه 0 خواهد بود.
〰〰〰〰
➰➰➰➰
نکته: تا نسخه 8.4، این رفتار بدون تغییر بوده است و ممکن است در نسخههای بعدی متفاوت عمل کند.
〰〰〰〰
#برسی_عمیق_توابع
معمولا (int) یا intval() وقتی میخوایم یک مقدار رو به نوع عدد صحیح تبدیل کنیم استفاده میشه.
〰〰〰〰
مثال ساده:
// intval():
var_dump(intval("1234")); // نتیجه: int(1234)
var_dump(intval("42abc")); // نتیجه: int(42)
var_dump(intval("abc42")); // نتیجه: int(0)
//یا (int):
var_dump((int)"1234ee41"); // int(1234)
var_dump((int)"jj1234ee41"); // int(0)
var_dump((int)"42abc"); // int(42)
❌ خیلیها فکر میکنن intval() یا (int) کل رشته رو بررسی میکنه و اگر جز عدد کاراکتر دیگهای بود، صفر میده.
✅ اما intval() یا (int) فقط از ابتدای رشته شروع میکنه به خواندن عدد.
- اگر ابتدای رشته عدد باشه، تا جایی که عدد هست ادامه میده و بعد متوقف میشه.
- اگر ابتدای رشته عدد نباشه، نتیجه 0 خواهد بود.
〰〰〰〰
مثال توضیحی:
var_dump(intval("1234ee41")); // ابتدای رشته عدد هست → int(1234)
var_dump(intval("jj1234ee41")); // ابتدای رشته عدد نیست → int(0)➰➰➰➰
نکته: تا نسخه 8.4، این رفتار بدون تغییر بوده است و ممکن است در نسخههای بعدی متفاوت عمل کند.
〰〰〰〰
#برسی_عمیق_توابع
شاید واستون پیش امده، بخواین متنتون حتما راستچین یا چپچین باشه، اینجا دوتا کارکتر کاربردی بهتون معرفی میکنم که به راحتی این کارو انجام بده.
〰〰〰〰〰
• راست چین کردن:
[
|> مثال:
||> متن عادی:
||> متن راستچین شده:
➿➿➿➿➿
• چپ چین کردن:
[
|> مثال:
||> متن عادی:
||> متن چپچین شده:
〰〰〰〰
💡نکته: برای کوپی کردنشون، داخل پرانتز کلیک کنید کوپی میشه، اول متنتون قرار بدین.
〰〰〰〰〰
• راست چین کردن:
[
]|> مثال:
||> متن عادی:
PHP یک زبان برنامه نویسی است.
||> متن راستچین شده:
PHP یک زبان برنامه نویسی است.
➿➿➿➿➿
• چپ چین کردن:
[
]|> مثال:
||> متن عادی:
پیاچ پی is a programming language.
||> متن چپچین شده:
پیاچپی is a programming language.
〰〰〰〰
💡نکته: برای کوپی کردنشون، داخل پرانتز کلیک کنید کوپی میشه، اول متنتون قرار بدین.