Web Programmer
32 subscribers
7 photos
5 videos
5 links
پشتیبان چنل: @Bot_MoMi
Download Telegram
🚀 چند خروجی از توابع در پایتون و PHP

اگه با 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

از نسخه 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) را به صورت رشته برمی‌گرداند.

مثلاً:
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:

معمولا (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.


💡نکته: برای کوپی کردنشون، داخل پرانتز کلیک کنید کوپی میشه، اول متنتون قرار بدین.