| کانال توسعه‌دهندگان PHP | – Telegram
| کانال توسعه‌دهندگان PHP |
1.7K subscribers
22 photos
39 links
⭕️ کانال توسعه‌دهندگان پی‌اچ‌پی (PHP) دولوپیکس

💠 دولوپیکس | جامعه توسعه‌دهندگان ایرانی

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
| کانال توسعه‌دهندگان PHP |
خروجی کد بالا کدام است؟ A Outer 1 Inner 1 Outer 2 Inner 1 B Outer 1 Inner 1 Inner 2 Outer 2 Inner 1 C Outer 1 Inner 1 D Outer 1 Inner 1 Inner 2 💢 نکته : لطفا اندکی تامل کنید، از اجرای کد و استفاده از هوش مصنوعی…
🔰 این سوال بسیار راحت است، درصورتی که با break و continue که با یک عدد همراه است آشنا باشید.

🔸 کد ما به این صورت است:
for ($i = 1; $i < 3; $i++) {
echo "Outer $i\n";
for ($j = 1; $j < 3; $j++) {
echo "\tInner $j\n";
if ($j == 1) break 2;
if ($j == 2) continue 2;
}
}

🔹 و خروجی آن گزینه C، یعنی:
Outer 1
Inner 1


⁉️ اما چرا؟
⚜️ بیایید ابتدا با دستورات break، و continue به صورت دقیق تر آشنا شویم.

🔻 ‏break N چیست؟
‏break به صورت معمول از یک حلقه خارج می‌شود. اما اگر بنویسیم break 2، به معنی خروج از دو سطح حلقه است.
یعنی در این کد:
if ($j == 1) break 2;

اگر شرط ‎$j == 1 برقرار شود، هم از حلقه داخلی و هم خارجی خارج می‌شود. یعنی اجرای کل حلقه‌ها متوقف می‌شود.

🔻continue N چیست؟
‏continue معمولاً ادامه حلقه جاری را رها می‌کند و می‌رود سراغ تکرار بعدی همان حلقه. اما continue 2 می‌گوید برو سراغ تکرار بعدی حلقه سطح دوم.
در این کد:
if ($j == 2) continue 2;

اگر این شرط اجرا شود، کل حلقه داخلی متوقف می‌شود و حلقه بیرونی به تکرار بعدی می‌رود.

🔸 در هر دو حالت، عدد بعد از break یا continue مشخص می‌کند که چند سطح از حلقه را تحت تأثیر قرار می‌دهد.
⭕️ نکته: عدد بعد از break یا continue باید به تعداد سطوح حلقه باشد.

⚜️ حالا بیایید ببینیم این کد دقیقاً چطور اجرا می‌شود:

اولین دور حلقه بیرونی: ‎$i = 1
Outer 1
اولین دور حلقه داخلی: ‎$j = 1
Inner 1
سپس:
if ($j == 1) break 2;


شرط درست است، پس اجرای break 2 انجام می‌شود. یعنی از هر دو حلقه خارج می‌شویم و برنامه پایان می‌یابد.

⭕️ نکته: دستور continue هرگز اجرا نخواهد شد.

🔖 #PHP, #پی_اچ_پی

👤 AmirHossein

💎 Channel: @DevelopixPHP
5👍1
‏LaraGram یک فریم‌ورک توسعه‌پذیر، منعطف و مدرن به زبان PHP برای ساخت ربات‌های تلگرامه که با الهام از ساختار لاراول طراحی شده.

اگر با لاراول آشنایی دارید، کار با LaraGram براتون راحت، لذت‌بخش و قابل پیش‌بینی خواهد بود — و حتی اگه آشنایی ندارید، ساختار منظمش خیلی زود براتون جا می‌افته.

‏LaraGram امکانات زیادی درون خودش داره که می‌تونید سخت‌ترین ربات‌ها رو با چند خط کد پیاده‌سازی کنید، اگر قابلیتی رو هم نداشته باشه می‌تونید به عنوان پکیج جانبی بهش اضافه کنید یا حتی برای اون پکیج توسعه بدید.

به عنوان مثال، LaraGram مجهز به یک سیستم Update Listener پیشرفته هست که به شما امکاناتی مانند گروه‌بندی لیسنرها، نام‌دهی به هر لیسنر، اعمال محدودیت و Middleware بر روی لیسنر، پردازش متن و ورودی‌ها، و... رو میده.

همچنین نسخه بازنویسی شده Eloquent ORM رو در خودش جا داده با پشتیبانی از ۵ دیتابیس مختلف، همراه با تعریف روابط، Migrations، Seeders و Factory‌ها.

سایر قابلیت های کلیدی اون:

🔐‌ سیستم کنترل مجوز با قابلیت تعریف Gate و Policy برای مدیریت دقیق سطح دسترسی کاربران به منابع مختلف.

💻‌ Commander System برای ساخت و اجرای راحت command‌ها، مدیریت ساده‌تر پروژه، و زمان‌بندی اجرای وظایف (Scheduled Tasks).

📨‌ ‏Queue و Job System برای ساخت صف و اجرای کارها در پس‌زمینه با زمان‌بندی دلخواه.

🧰‌ رابط Redis با امکانات لازم برای توسعه‌های وابسته به کش، صف و پیام‌رسانی آنی.

🧠‌ سیستم کشینگ با پشتیبانی از ۷ درایور مختلف برای ذخیره‌سازی داده‌های موقتی، به‌همراه پیاده‌سازی Step Manager بر همین بستر.

🔁‌ کالکشن‌ها برای کار ساده‌تر و منعطف‌تر با داده‌های Iterable، مشابه کالکشن‌های Laravel.

⚙️‏‌ Concurrency‏ داخلی با امکان پردازش هم‌زمان چند درخواست در پس‌زمینه بدون پیچیدگی اضافه.

🔒‌ ابزارهای امنیتی با پشتیبانی از سیستم‌های رمزنگاری (Crypt) و هشینگ (Hash).

📢‌ Event Dispatcher برای تعریف و مدیریت رویدادها و واکنش به آن‌ها.

🎛‌ کیبورد بیلدر توسعه‌یافته با استفاده ساده و انعطاف پذیری بالا.

🧩‌ موتور قالب‌سازی پیشرفته الهام‌گرفته از Blade برای ساخت پیام‌ها به‌صورت پویا و قابل نگهداری.

🌍‌ سیستم چندزبانه (Translation) برای ساخت ربات‌هایی با پشتیبانی از زبان‌های مختلف.

‌ سیستم اعتبارسنجی با قوانین متنوع و امکان تعریف Rule‌های سفارشی.

🤖‌ پشتیبانی از چند ربات هم‌زمان و امکان تعریف چند کانکشن و مدیریت آن‌ها به‌صورت مستقل.

یک مثال ساده برای ایجاد یک کامند بن با user_id به مدت 7 روز، با کنترل دسترسی و شرط ریپلای نشدن کامند:
Bot::onCommand("ban {id}", function (Request $request, $id) {
$request->banChatMember(
chat_id: chat()->id,
user_id: $id,
until_date: now()->addDays(7)->timestamp
);
})->can('administrator')->hasNotReply();


برخی از ویژگی‌ها با افزونه‌ها و پکیج‌های جانبی به LaraGram اضافه می‌شوند، به عنوان مثال:

⚡️LaraGram Surge
پکیجی برای اجرای سریع‌تر ربات‌ها با پشتیبانی از Swoole و OpenSwoole

🔧LaraGram Installer
برای نصب و راه‌اندازی سریع و ساده پروژه‌های LaraGram

🛢‌ LaraGram MongoDB‌‏
درایور پایگاه‌داده MongoDB برای Eloquent ORM


📚 مستندات رسمی LaraGram نیز از طریق لینک زیر در دسترس است:
🔗 laraxgram.github.io

💬 گروه پرسش و پاسخ:
🔹 @LaraGramChat

📌 پروژه در گیت‌هاب:
♦️ LaraGram

🔖 #TelegramBot, #ربات, #تلگرام

👤 AmirHossein

💎 Channel: @DevelopixRobot
👍6🔥31
Forwarded from | Erfan's Notes |
حدودا یک ماه از ریلیز شدن نسخه 3.0 وب‌اسمبلی (WASM) می‌گذره و الان فرصت کردم درموردش بخونم، تغییرات مهمی که داشته رو پایین می‌نویسم.

💠 پشتیبانی از Address Space های 64 بیت
تا قبل از این نسخه، وب‌اسمبلی محدود به آدرس‌های i32 بود و نمی‌تونست بیشتر از 4GB رو آدرس‌دهی کنه، ولی پشتیبانی از i64 اضافه شده و این محدودیت عملا بی‌نهایت شده، هرچند که همچنان مرورگرها حداکثر اجازه allocate کردن 16GB رو می‌دن.

💠 پشتیبانی از Memory های چندگانه
تا قبل از این نسخه، هر ماژول وب‌اسمبلی فقط محدود به یک Memory بود و برای تفکیک باید ماژول‌ها Split می‌شدند، ولی در این نسخه قابلیت داشتن Memory های متعدد برای یک ماژول اضافه شده.

💠 پشتیبانی از Garbage Collection
در این نسخه یک افزونه با عنوان wasm-gc اضافه شده که در سطوح پایین می‌تونه مموری رو به‌صورت خودکار مدیریت کنه، کامپایلرها می‌تونند Struct ها و آرایه‌ها و بعضی Integer ها رو به صورت تگ شده تعریف کنند و خود wasm وظیفه allocation و lifetime شون رو برعهده بگیره.

💠 پشتیبانی از Tail Call ها
قابلیت Tail Call به وب‌اسمبلی اضافه شده، این ویژگی از زبان‌های فانکشنال الگو گرفته، به این معنی که فانکشن‌ها می‌تونند در آخرین اکشن‌شون یک فانکشن دیگه‌ای رو کال کنند بدون اینکه فضایی از Stack رو اشغال کنند، این موضوع در کال های Recursive اهمیت زیادی داره.

💠 پشتیبانی از Exception ها
پشتیبانی از Exception های try و catch در وب‌اسمبلی اضافه شده، تا قبل از این برای چنین کاری باید از JS استفاده می‌شد.

💠 پشتیبانی از String های جاوا اسکریپت
قابلیت رد و بدل کردن مستقیم String های جاوا اسکریپت بدون نیاز به تبدیل دو طرفه اضافه شده، می‌تونید مقادر String رو به صورت مستقیم به‌عنوان externref پاس بدید و سمت wasm تغییرات لازم رو روش اعمال کنید و سمت JS تحویل بگیرید.

و البته کلی قابلیت دیگه که اگر دوست داشتید می‌تونید اینجا بخونید.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
آشنایی با Reflection در PHP
بخش اول - مقدمه‌ای بر مفهوم Reflection

در بسیاری از مواقع، ممکن است بخواهیم برنامه‌ای بنویسیم که بتواند ساختار خود را در زمان اجرا بررسی و تحلیل کند.

به عنوان مثال:
- فریم‌ورکی که بتواند کنترلرها و متدهای آن‌ها را به صورت خودکار شناسایی کند؛
- ابزاری برای تست خودکار که بدون دخالت انسان، متدهای آزمون را پیدا و اجرا نماید؛
- یا حتی سیستمی که بر اساس type hintها، وابستگی‌ها را به صورت خودکار تزریق کند.

چنین قابلیت‌هایی با استفاده از Reflection API در PHP امکان‌پذیر است.
این ابزار یکی از بخش‌های پیشرفته و کمتر شناخته‌شده‌ی زبان PHP است که قدرت زیادی برای تحلیل، بازرسی و حتی تغییر رفتار کد در زمان اجرا در اختیار توسعه‌دهنده قرار می‌دهد.

تعریف Reflection

به طور خلاصه، Reflection در PHP به مجموعه‌ای از کلاس‌ها و متدها گفته می‌شود که امکان بازتاب (reflection) و خودشناسی (introspection) کد را در زمان اجرا فراهم می‌کنند.

به بیان دیگر، با استفاده از Reflection می‌توان:
- ساختار کلاس‌ها، توابع و متدها را شناسایی کرد،
- نوع و ویژگی‌های پارامترها را تشخیص داد،
- متدها را به صورت پویا فراخوانی کرد،
- و حتی به اعضای private و protected دسترسی پیدا نمود (در صورت نیاز و آگاهی از خطرات امنیتی آن).

کاربردهای Reflection در دنیای واقعی

‏Reflection در پروژه‌های واقعی کاربردهای متعددی دارد. در ادامه به برخی از مهم‌ترین آن‌ها اشاره می‌شود:

1- فریم‌ورک‌ها و سیستم‌های خودکارسازی
در فریم‌ورک‌هایی مانند Laravel و Symfony، از Reflection برای شناسایی خودکار کنترلرها، متدها و type hintها استفاده می‌شود.
به عنوان نمونه، در زمان اجرای Dependency Injection Container، با استفاده از Reflection مشخص می‌شود که هر کلاس چه نوع وابستگی‌هایی دارد و باید چه اشیایی به آن تزریق شود.

2- تست‌نویسی (Unit Testing)
در ابزارهایی مانند PHPUnit، از Reflection برای یافتن متدهایی استفاده می‌شود که با test آغاز می‌شوند.
همچنین از این قابلیت برای دسترسی به متدها و پراپرتی‌های خصوصی (private/protected) جهت تست دقیق‌تر منطق داخلی کلاس‌ها بهره گرفته می‌شود.

3- ‏ORM و Map کردن داده‌ها
کتابخانه‌هایی مانند Doctrine ORM از Reflection برای بررسی ساختار کلاس‌ها و تبدیل آن‌ها به جداول پایگاه داده استفاده می‌کنند.
در واقع، Reflection به ORM کمک می‌کند تا بدون نیاز به پیکربندی دستی، تشخیص دهد هر property به کدام ستون از جدول مرتبط است.

4- ابزارهای تحلیل و اشکال‌زدایی
ابزارهای Debug و Code Analysis می‌توانند با استفاده از Reflection، در زمان اجرا اطلاعات دقیقی از وضعیت کلاس‌ها و اشیاء جمع‌آوری کنند.
این اطلاعات در ساخت ابزارهای Documentation Generator، Profiler و Static Analyzer کاربرد فراوان دارد.

ملاحظات عملکرد و امنیت

هرچند Reflection امکانات بسیار قدرتمندی در اختیار توسعه‌دهنده قرار می‌دهد، اما باید در استفاده از آن احتیاط نمود:
- اجرای Reflection ممکن است اندکی باعث افزایش بار پردازشی (Performance Overhead) شود.
- دسترسی به متدها و پراپرتی‌های private/protected در صورت استفاده‌ی نادرست می‌تواند ریسک امنیتی ایجاد کند.

در نتیجه، پیشنهاد می‌شود Reflection تنها در مواردی مورد استفاده قرار گیرد که واقعاً به تحلیل یا رفتار پویا نیاز داریم، نه برای انجام کارهای ساده‌ای که می‌توان با روش‌های معمول انجام داد.

در بخش بعدی، به صورت گام‌به‌گام با کلاس‌های مختلف Reflection در PHP آشنا خواهیم شد و یاد می‌گیریم چگونه از آن‌ها برای ساخت ابزارها و سیستم‌های پویا استفاده کنیم.

🔖 #PHP, #پی_اچ_پی, #reflection

👤 AmirHossein

💎 Channel: @DevelopixPHP
👍21🔥1
امنیت ورودی‌ها همیشه نقطه‌ضعف اپلیکیشن‌هاست. استفاده از prepared statements در PDO یک راهکار ساده و مؤثر برای جلوگیری از SQL Injection است.

ایدهٔ اصلی (مختصر)
با آماده‌سازی کوئری و جدا کردن داده‌ها از ساختار SQL، هر ورودی به‌عنوان داده تفسیر می‌شود نه دستور SQL. در نتیجه حتی ورودی‌های مخرب اجرا نخواهند شد.

مثال شفاف
در این مثال یک اتصال PDO امن و نمونهٔ استفاده از پارامترهای نام‌دار را می‌بینید. دقت کنید که PDO::ERRMODE_EXCEPTION روشن است تا خطاها واضح باشند.

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'user', 'pass');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// INSERT امن با پارامتر نام‌دار
$stmt = $pdo->prepare('INSERT INTO users (email, name) VALUES (:email, :name)');
$stmt->execute([':email' => $email, ':name' => $name]);

// استفادهٔ مجدد برای SELECT
$select = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$select->execute([':email' => $email]);
$user = $select->fetch(PDO::FETCH_ASSOC);
?>


نکات عملی و خطاهای رایج
- هرگز ورودی‌ها را با string concatenation داخل کوئری قرار ندهید.
- از bindValue یا آرایهٔ execute برای ارسال پارامترها استفاده کنید.
- نوع داده را در صورت نیاز explicit کنید (مثلاً PDO::PARAM_INT).
- اتصال با charset=utf8mb4 و ERRMODE_EXCEPTION را فراموش نکنید.

اگر تجربه‌ای در مهاجرت از mysql_* یا mysqli به PDO دارید یا سوالی هست، خوشحال می‌شم بشنوم و بحث کنیم.

منبع: مستندات رسمی PHP — PDO Prepared Statements

🔖 #PHP #پی_اچ_پی #php #pdo #security #sql_injection #prepared_statements

👤 Developix

💎 Channel: @DevelopixPHP
👍1
Guzzle — کلاینت HTTP برای PHP

Guzzle یک کتابخانهٔ معتبر و فعال برای ارسال درخواست‌های HTTP در PHP است. به‌سادگی با APIهای REST، سرویس‌های خارجی و میکروسرویس‌ها کار می‌کند و مدیریت زمان‌انتظار، خطاها و درخواست‌های همزمان را آسان می‌کند. 🚀

ویژگی‌ها و مزایا:
- پشتیبانی sync و async (Promise)
- Middleware و مدیریت هدر/کوکی
- Pool برای درخواست‌های همزمان و بهینه‌سازی کارایی
- قابلیت تنظیم timeout، retries و stream برای دانلود فایل

نمونه نصب و استفاده:
<?php
// نصب: composer require guzzlehttp/guzzle
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'https://api.github.com/']);
$res = $client->request('GET', 'users/guzzle');
echo $res->getStatusCode();
echo $res->getBody();


موارد کاربرد: فراخوانی APIهای خارجی، ارتباط بین سرویس‌ها، تست و نمونه‌سازی سریع کلاینت HTTP. نکته: از timeout و retries مناسب استفاده کنید تا برنامه پایدار بماند. 🔧

مستندات رسمی: docs.guzzlephp.org
کد منبع: github.com/guzzle/guzzle

تجربه‌تان را با Guzzle امتحان کنید و بازخورد خود را به اشتراک بگذارید.

🔖 #PHP #پی_اچ_پی #Guzzle #HTTP #API #PHP

👤 Developix

💎 Channel: @DevelopixPHP
1
👨‍💻 سوال PHP برای توسعه‌دهندگان

خروجی اجرای کد زیر در PHP 8 چه خواهد بود؟

به تفاوت بین reference و مقدار کپی‌شده، و همین‌طور رفتار تابع با آرگومان‌ها دقت کنید.

🔖 #PHP #پی_اچ_پی

👤 Developix

💎 Channel: @DevelopixPHP
🔥4
عملگر پایپ (Pipe Operator) در PHP

عملگر پایپ ( |> ) از PHP 8.5 با هدف ساده‌سازی جریان داده و افزایش خوانایی کد اضافه شده است. این عملگر امکان می‌دهد خروجی یک عبارت به‌عنوان ورودی تابع بعدی استفاده شود؛ بدون آنکه نیاز به تو در تو کردن فراخوانی‌ها یا استفاده از متغیرهای موقتی باشد.

ساختار کلی عملگر پایپ:
$value |> callable;


در این ساختار:

- مقدار سمت چپ (value) محاسبه شده و سپس به تابع سمت راست (callable) ارسال می‌شود، و نتیجهٔ آن تابع، خروجی نهایی عبارت خواهد بود.

- تابع سمت راست باید فقط یک پارامتر لازم داشته باشد؛ زیرا همان یک پارامتر از پایپ دریافت می‌شود.

- نماد ( ... ) پس از نام تابع، بیانگر این است که پارامتر آن تابع از طریق عملگر پایپ وارد می‌شود.

چند مثال:

پیش از اضافه شدن پایپ تواع پشت سر هم نوشته می‌شد:
$result = strtolower(trim($noscript));

یا از متغیرهای موقتی استفاده می‌شد:
$trim = trim($noscript);
$result = strtolower($trim);

اما با استفاده از پایپ می توان ساختار تمیزتر و قابل فهم‌تری را داشته باشیم:
$result = $noscript
|> trim(...)
|> strtolower(...);

ترتیب اجرای عملیات کاملا روشن و خوانا است:
ابتدا trim، سپس strtolower.

ترکیب توابع استاندارد با Closure
$slug = $noscript
|> trim(...)
|> (fn($s) => str_replace(' ', '-', $s))
|> strtolower(...);

از آنجایی که گفته شد توابع تنها یک متد داشته باشند، برای توابع با چند متد می‌توان از کلوژرها استفاده کرد.
در این مثال str_replace نیاز به پارامترهای بیشتری است به همین دلیل از arrow-function استفاده شده.

عملیات روی آرایه
$clean = $items
|> (fn(array $arr) => array_map(fn($x) => trim($x), $arr))
|> (fn(array $arr) => array_filter($arr, fn($x) => $x !== ''))
|> array_values(...);

چنین زنجیره‌ای بدون استفاده از پایپ، به‌طور معمول شامل متغیرهای واسطه یا تو در تویی توابع خواهد بود؛ اما با استفاده از پایپ، تمامی مراحل به صورت خوانا پشت سر هم نوشته شده‌اند.

مزایای استفاده از عملگر پایپ:
- جریان داده از بالا به پایین قابل مشاهده است و عملیات به شکلی خطی بیان می‌شوند.

- به‌جای اینکه توابع داخل یکدیگر قرار بگیرند، هر تابع به‌طور مستقل در یک مرحله اجرا می‌شود.

- نیازی به ایجاد متغیر برای ذخیرهٔ نتیجهٔ هر مرحله نیست.

محدودیت‌ها و نکات مهم:
- توابعی که بیش از یک پارامتر ضروری دارند، مستقیماً با پایپ قابل استفاده نیستند.
"hello world" |> explode(' ', ...); // ERROR

"hello world" |> (fn($v) => explode(' ', $v)); // correct

- توابعی که پارامترشان با ارجاع (By Reference) دریافت می‌شود قابل استفاده نیستند (مانند array_pop یا sort)

- اگر تابعی مقدار بازگشتی نداشته باشد (void)، نتیجهٔ عملیات null خواهد بود و استفادهٔ آن در میانهٔ زنجیره صحیح نیست.


به طور کلی عملگر پایپ در PHP 8.5 امکان نگارش کدی خواناتر، مرحله‌ای و ساخت‌یافته را فراهم می‌کند.
این عملگر با ارسال خروجی هر مرحله به مرحلهٔ بعد، جریان داده را ساده‌سازی می‌کند و برای پردازش رشته‌ها، آرایه‌ها و داده‌های میان‌مرحله‌ای بسیار مناسب است.
در مقابل، محدودیت‌هایی نظیر نیاز به تک‌پارامتری بودن تابع یا عدم پشتیبانی از توابع دارای ارجاع وجود دارد که باید در استفادهٔ روزمره مورد توجه قرار گیرد.

🔖 #PHP #پی_اچ_پی

👤 AmirHossein

💎 Channel: @DevelopixPHP
👍52🔥1
👨‍💻 سوال برای توسعه‌دهندگان PHP:

خروجی اجرای این کد در PHP 8 چیست؟

به تفاوت بین مقایسه شل (loose) و مقایسه صریح (strict)، همین‌طور رفتار آرایه‌ها در مقایسه توجه کنید.


<?php

$values = [
"0", // string
0, // int
false, // bool
"", // empty string
[], // empty array
[0], // array with one element
];

$result = [];

foreach ($values as $i => $a) {
foreach ($values as $j => $b) {
if ($a == $b) {
$result[] = "$i==$j";
}
}
}

var_dump($result);


خروجی دقیق این کد (همان چیزی که var_dump چاپ می‌کند) چیست؟

🔖 #PHP #پی_اچ_پی

👤 Developix

💎 Channel: @DevelopixPHP
📌 ساخت یک REST API سبک با PHP خالص

خیلی وقت‌ها برای یک فرم ساده، اپ موبایل کوچک یا integration داخلی، لازم نیست کل Laravel را بالا بیاریم. یک API سبک با PHP خالص می‌تونه هم سریع باشه، هم قابل دیپلوی روی هر هاستی.

در این پست، یه نمونه خیلی عملی می‌بینیم که شبیه مثال‌های سرور داخلی PHP در مستندات رسمی کار می‌کنه؛ فقط کمی مرتب‌تر و مدرن‌تر 👇

💡 ایده اصلی

– استفاده از PHP 8+ با type hint و strict_types.
– هندل‌کردن GET /tasks و POST /tasks برای یک TODO ساده.
– استفاده از json_encode / json_decode با application/json.
– جداسازی لاجیک در یک کلاس کوچک (بدون شلوغ‌کاری).

🔧 ساختار پیشنهادی

– یک فایل public/index.php
– یک کلاس ساده برای مدیریت داده‌ها (فعلاً in-memory، بعداً راحت می‌شه به DB وصل کرد)


<?php

declare(strict_types=1);

// public/index.php

header('Content-Type: application/json; charset=utf-8');

$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
$uri = strtok($_SERVER['REQUEST_URI'] ?? '/', '?');

class TaskStore
{
private array $tasks = [];

public function all(): array
{
return array_values($this->tasks);
}

public function add(string $noscript): array
{
$id = uniqid('task_', true);
$task = [
'id' => $id,
'noscript' => $noscript,
];
$this->tasks[$id] = $task;
return $task;
}
}

$store = new TaskStore();

if ($uri === '/tasks' && $method === 'GET') {
echo json_encode($store->all(), JSON_UNESCAPED_UNICODE);
exit;
}

if ($uri === '/tasks' && $method === 'POST') {
$input = json_decode(file_get_contents('php://input'), true) ?? [];

if (!isset($input['noscript']) || !is_string($input['noscript'])) {
http_response_code(422);
echo json_encode(['error' => 'noscript is required']);
exit;
}

$task = $store->add(trim($input['noscript']));

http_response_code(201);
echo json_encode($task, JSON_UNESCAPED_UNICODE);
exit;
}

http_response_code(404);
echo json_encode(['error' => 'Not Found']);


🚀 اجرا روی لوکال

با سرور داخلی PHP (مطابق داکیومنت رسمی):

php -S localhost:8000 -t public


حالا:
– با curl یا Postman روی /tasks تست کن.
– بعداً خیلی راحت می‌شه این ساختار رو به یک لایه Repository و اتصال به MySQL یا PostgreSQL گسترش داد.

🔥 چند نکته کاربردی

– همیشه Content-Type درست برای JSON ست کن تا client ها راحت‌تر parse کنن.
– برای پروژه واقعی، لاگ‌گرفتن و error handling مرکزی (مثلاً با یک middleware ساده) خیلی کمک می‌کنه.
– اگر این سبک رو دوست داشتی، نگاه‌کردن به سورس micro-frameworkهایی مثل Slim PHP ایده‌های خوبی برای routing و middleware می‌ده.

امروز همین نمونه کوچک رو روی سیستم خودت بالا بیار، کمی باهاش بازی کن و بعد شروع کن به اضافه‌کردن featureهای کوچیک 😉

🔖 #PHP #پی_اچ_پی #PHP #REST_API #Backend #Web #Tutorial

👤 Developix

💎 Channel: @DevelopixPHP
1
👨‍💻 پرسش برای توسعه‌دهندگان PHP

در کد زیر از ویژگی late static binding در PHP، همراه با traits و overriding متد، استفاده شده است.

با دقت کد را بررسی کنید و بگویید خروجی نهایی اجرای این اسکریپت دقیقا چه خواهد بود؟ (تمام خطوط خروجی به ترتیب)

برای خوانایی بیشتر، می‌توانید روی بخش code (در تصویر بالا) زوم کنید و به تفاوت بین self و static در این مثال توجه کنید.

🔖 #PHP #پی_اچ_پی

👤 Developix

💎 Channel: @DevelopixPHP
6
در نمونه‌کد بالا در نسخهٔ اشتباه، هر بار برای گرفتن تنظیمات از دیتابیس یک کوئری جدید اجرا می‌شود و کل جدول settings در هر درخواست دوباره خوانده می‌شود؛ این کار هم فشار زیادی به دیتابیس وارد می‌کند و هم در لود بالا می‌تواند گلوگاه جدیِ کارایی ایجاد کند.

با استفاده از یک لایهٔ caching سطح‌برنامه (مثلاً ذخیره در یک متغیر static داخل تابع یا استفاده از APCu / Redis) می‌توانید نتایج را فقط یک‌بار بخوانید و در ادامهٔ طول عمر درخواست از همان دادهٔ cache شده استفاده کنید. این کار باعث کاهش چشمگیر تعداد کوئری‌ها، کاهش زمان پاسخ و آزاد شدن منابع دیتابیس در شرایط ترافیک بالا می‌شود.

در سناریوهایی مثل بارگذاری مکرر تنظیمات اپلیکیشن، session-less API ها یا اسکریپت‌هایی که چندین کلاس مختلف مدام از تنظیمات استفاده می‌کنند، پیاده‌سازی یک Config Repository با cache (مثل نسخهٔ اصلاح‌شده) نسبت به فراخوانی مستقیم دیتابیس در هر مرتبه، انتخاب بسیار بهینه‌تر و حرفه‌ای‌تری است.

🔖 #PHP #پی_اچ_پی

👤 Developix

💎 Channel: @DevelopixPHP
👍41🔥1