| کانال توسعه‌دهندگان PHP |
1.68K subscribers
42 photos
1 video
56 links
⭕️ کانال توسعه‌دهندگان پی‌اچ‌پی (PHP) دولوپیکس

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

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
👨‍💻 سوال برای توسعه‌دهندگان 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 $title): array
{
$id = uniqid('task_', true);
$task = [
'id' => $id,
'title' => $title,
];
$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['title']) || !is_string($input['title'])) {
http_response_code(422);
echo json_encode(['error' => 'title is required']);
exit;
}

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

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
👍4❤1🔥1
یکی از ساده‌ترین و مهم‌ترین کارها برای امن‌کردن اپ‌های PHP اینه که مستقیم متغیرها رو نچسبونیم به Query و به‌جاش از Prepared Statement با PDO استفاده کنیم. با این کار جلوی خیلی از SQL Injectionها گرفته می‌شه 🚫💉

فرض کنیم یه فرم لاگین ساده داریم. این روش 👇 ناامن و مستعد SQL Injection هست:

$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');

$username = $_POST['username'];
$password = $_POST['password'];

// ❌ ناامن
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$stmt = $pdo->query($sql);
$user = $stmt->fetch();


راه درست، استفاده از placeholder و bind کردن مقادیر هست. این‌طوری PDO خودش مقادیر رو escape می‌کنه و به‌عنوان دیتا با دیتابیس حرف می‌زنه، نه کد 👇

$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);

$username = $_POST['username'];
$password = $_POST['password'];

// ✅ امن با prepared statement
$sql = "SELECT * FROM users WHERE username = :username AND password = :password";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':username' => $username,
':password' => $password,
]);

$user = $stmt->fetch(PDO::FETCH_ASSOC);


نکات مهم 🤝

• همیشه ERRMODE_EXCEPTION رو فعال کن تا خطاها رو از دست ندی.
• از named placeholder (مثل :username) استفاده کن تا کدت خواناتر بشه.
• حتی برای مقدارهای عددی هم از prepared statement استفاده کن؛ به شرط «عددی بودن» دیتا برای Logic خودت اعتماد نکن.

این الگو رو توی همه Queryهایی که ورودی کاربر توشون استفاده می‌شه پیاده کن؛ لاگین، سرچ، فیلتر، پنل ادمین و… ✅

مستندات رسمی PDO و prepared statement:
https://www.php.net/manual/en/book.pdo.php

امروز توی یکی از بخش‌های پروژه‌ات این الگو رو جایگزین روش قدیمی کن و تفاوت تمیزی و امنیت کد رو ببین 😎

🔖 #PHP #پی_اچ_پی #PHP #PDO #Security #SQL_Injection #Best_Practices

👤 Developix

💎 Channel: @DevelopixPHP
🔥3
Forwarded from ابر ویراک
⭕️ ویراک کلود
زیرساختی مطمئن برای کسب و کارهای آنلاین
🎁 20% شارژ بیشتر روی اولین واریزی
⚡️با کد معرف: 10%  شارژ برای شما و 10% برای دوستتان!

🔘با IPv6 رایگان
🔘با IP مازاد
🔘تست رایگان 2 روزه
🔘فایروال اختصاصی
🔘با API برای حرفه‌ای ها
🔘پشتیبانی 24 ساعته
🔘آپلود رایگان


📞 همین حالا با ما تماس بگیرید و این فرصت فوق‌العاده رو از دست ندید!
🔻02191555530
🌐Virakcloud.com
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2👎1
📨 ساخت یک فرم تماس امن با PHP 8 و PDO

خیلی وقت‌ها سریع یک فرم «ارتباط با ما» می‌نویسیم، ولی اگر درست هندل نشه، پر از مشکل امنیتی و باگ می‌شه؛ از SQL Injection گرفته تا اسپم و خطاهای عجیب. امروز یه نمونه‌ی خیلی کاربردی و مدرن با PHP 8 + PDO رو مرور می‌کنیم.

این ایده برگرفته از نمونه‌های رسمی و Best Practiceهای مستندات PHP و PDO هست:
php.net/manual/en/book.pdo.php

🔹 سناریو
فرض کن یه فرم ساده داریم: name، email و message. می‌خوایم داده‌ها رو:

• ولیدیت اولیه کنیم (خالی نبودن، ایمیل معتبر)
• امن ذخیره کنیم داخل MySQL با Prepared Statement
• خطاها رو لاگ کنیم، نه اینکه به کاربر Error خام نشون بدیم

🔹 ساخت جدول MySQL (یک‌بار روی DB اجرا کن)
CREATE TABLE contacts (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL,
message TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


🔹 فایل process_contact.php
این نمونه از strict types، PDO و Exception Handling استفاده می‌کنه؛ مناسب PHP 8 به بالا:

<?php

declare(strict_types=1);

$dsn = 'mysql:host=127.0.0.1;dbname=demo_app;charset=utf8mb4';
$user = 'demo_user';
$pass = 'demo_pass';

try {
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
} catch (PDOException $e) {
error_log('DB connection failed: ' . $e->getMessage());
http_response_code(500);
exit('Server Error');
}

$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');
$message = trim($_POST['message'] ?? '');

$errors = [];

if ($name === '') {
$errors[] = 'نام الزامی است.';
}

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = 'ایمیل نامعتبر است.';
}

if ($message === '') {
$errors[] = 'متن پیام را وارد کنید.';
}

if ($errors) {
http_response_code(422);
echo implode("\n", $errors);
exit;
}

$sql = 'INSERT INTO contacts (name, email, message) VALUES (:name, :email, :message)';
$stmt = $pdo->prepare($sql);

$stmt->execute([
':name' => $name,
':email' => $email,
':message' => $message,
]);

echo 'پیام شما با موفقیت ثبت شد.';


✨ چند نکته‌ی ریز اما مهم

• استفاده از charset=utf8mb4 برای ساپورت ایموجی و متن‌های ترکیبی.
• فعال‌کردن PDO::ERRMODE_EXCEPTION باعث می‌شه خطاها رو مثل آدم مدیریت کنیم، نه با die() و متن خام.
• filter_var برای Validation ایمیل ساده و قابل فهمه؛ برای پروژه‌های بزرگ‌تر می‌شه از کتابخونه‌های قوی‌تر استفاده کرد.
• حتماً خروجی خطا به کاربر عمومی باشه و لاگ کامل فقط در error_log ذخیره بشه.

🌱 این الگو یه اسکلت تمیز برای هر نوع فرم (ثبت‌نام، کامنت، تیکت) تو پروژه‌های PHP محسوب می‌شه. یک بار تمیز پیاده‌سازی بشه، بعد می‌تونی هی رویش توسعه بدی (CSRF token، Rate Limit, Recaptcha و غیره).

امتحانش کن، روی پروژه‌ی واقعی استفاده کن و اگر باگ یا ایده‌ی بهتری داشتی، با بقیه توسعه‌دهنده‌های PHP به اشتراک بذار 💻

🔖 #PHP #پی_اچ_پی #PHP #PDO #MySQL #Form_Handling #Validation #Backend #Web_Development

👤 Developix

💎 Channel: @DevelopixPHP
👍2👎1
🔍 در مثال بالا در نمونه‌ی اول هر بار اجرای کوئری با query ساده و مقداردهی دستی باعث تکرار منطق، ریسک SQL Injection و سخت شدن نگه‌داری می‌شود. در نمونه‌ی دوم با استفاده از Prepared Statement و bind کردن پارامترها علاوه بر افزایش امنیت، امکان استفاده دوباره از کوئری و بهبود کارایی در سناریوهای تکرار زیاد (مثلاً Import حجم بالای داده) فراهم می‌شود.

به‌عنوان یک PHP Developer بهتر است در عملیات‌های پرتکرار دیتابیس، به‌جای ساختن رشته‌ی SQL در هر حلقه، از Prepared Statement استفاده کنید تا هم کد تمیزتر و امن‌تری داشته باشید و هم فشار کمتری به Database Engine وارد شود.

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

👤 Developix

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

در قطعه کد زیر، از ویژگی Late Static Binding و تفاوت self و static استفاده شده است.

خروجی اجرای این اسکریپت PHP در خروجی استاندارد دقیقا چه خواهد بود؟ (با در نظر گرفتن حروف کوچک/بزرگ و فاصله‌ها)

<?php

class Base
{
protected static string $name = 'Base';

public static function who(): string
{
return static::$name;
}

public static function test(): void
{
echo self::who() . PHP_EOL;
echo static::who() . PHP_EOL;
}
}

class Child extends Base
{
protected static string $name = 'Child';

public static function who(): string
{
return parent::who() . ' > ' . static::$name;
}
}

Child::test();


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

👤 Developix

💎 Channel: @DevelopixPHP
❤1
Forwarded from ابر ویراک
ویراک کلود | تجربه‌ی ابری بدون محدودیت ☁️🚀

🎁 ۲۰٪ شارژ هدیه روی اولین واریزی

مزیت‌هایی که واقعاً فرق می‌سازن:
⚡️ پهنای باند 980 مگ
🌐با IP مازاد
⏱️ راه‌اندازی فوری
💳 پرداخت ساعتی
🛡 پشتیبانی ۲۴/۷

💬 هر سوالی داشتی، تیم ما کنارتـه
✅ مناسب استارتاپ‌ها، تیم‌های فنی، تا سازمان‌های بزرگ

همین الان شروع کن و با حداکثر منابع، سریع‌تر رشد کن 👇🏻

📞 تماس سریع: 02191555530
🔗 https://virakcloud.com
📌 سوال برای توسعه‌دهندگان PHP

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

به رفتار reference در foreach و تأثیر آن روی آرایه اصلی دقت کنید و در نهایت، مقدار چاپ‌شده را بنویسید.

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

👤 Developix

💎 Channel: @DevelopixPHP
👎2👍1
‏اصل Single Responsibility در کدهای PHP 🧱

یکی از مهم‌ترین اصول SOLID که روی تمیزی کد PHP تاثیر مستقیم دارد، Single Responsibility Principle (SRP) است؛ یعنی هر کلاس فقط یک دلیل برای تغییر داشته باشد.

وقتی همه‌چیز را در یک کلاس می‌ریزیم، بعد از مدتی هر تغییر کوچک تبدیل می‌شود به کابوس ریفکتور، با ده‌ها باگ پنهان 😅

نمونه کد بد (نقض SRP) 👇
<?php

class UserService
{
public function register(string $email, string $password): void
{
// 1) validation
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException('Invalid email');
}

if (strlen($password) < 8) {
throw new InvalidArgumentException('Weak password');
}

// 2) save to database
// imagine: DB queries here...

// 3) send welcome email
mail($email, 'Welcome', 'Thanks for registering');
}
}

در این کلاس، UserService هم validation انجام می‌دهد، هم کار دیتابیس، هم ارسال ایمیل. سه دلیل برای تغییر در یک کلاس؛ این یعنی خلاف SRP.

ریفکتور با SRP ✅
هر بخش را به مسئولیت خودش محدود می‌کنیم:

<?php

class UserValidator
{
public function validate(string $email, string $password): void
{
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException('Invalid email');
}

if (strlen($password) < 8) {
throw new InvalidArgumentException('Weak password');
}
}
}

class UserRepository
{
public function save(string $email, string $password): void
{
// persist user to DB (PDO / ORM / ...)
}
}

class Mailer
{
public function sendWelcome(string $email): void
{
// use real mailer here
}
}

class UserService
{
public function __construct(
private UserValidator $validator,
private UserRepository $repository,
private Mailer $mailer,
) {}

public function register(string $email, string $password): void
{
$this->validator->validate($email, $password);
$this->repository->save($email, $password);
$this->mailer->sendWelcome($email);
}
}

حالا:

• تغییر قوانین پسورد فقط روی UserValidator اثر دارد 🔐

• تغییر دیتابیس یا ORM فقط در UserRepository انجام می‌شود 🗄️

• سوییچ از mail() به مثلاً Symfony Mailer فقط در Mailer عوض می‌شود 📧

چرا این ساختار در پروژه واقعی PHP (مثلاً Laravel) جواب می‌دهد؟

در فریم‌ورک‌هایی مثل Laravel و Symfony همین ایده تکرار شده: Form Requestها برای validation، Repository / Model برای persistence، و Service / Mailer برای بیزنس لاجیک و ایمیل. SRP دقیقا پشت این تفکیک قرار دارد.

یک قدم ساده مثل جدا کردن validation و ایمیل از کلاس اصلی، کد را:

• قابل تست‌تر می‌کند (Unit Test روی هر کلاس جدا)

• قابل ریفکتورتر می‌کند

• خوانایی تیمی را بالا می‌برد

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

منابع پیشنهادی برای مطالعه بیشتر:
PHP The Right Way - SOLID
Single Responsibility Principle (Wikipedia)


🔖 #PHP #پی_اچ_پی #PHP #Clean_Code #SOLID #SRP #Architecture

👤 Developix

💎 Channel: @DevelopixPHP
👍3❤2
🇮🇷 مخزن داخلی WP Mirror

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

برای دریافت آخرین آپدیت‌ها به صورت رایگان، از لینک زیر استفاده کنید:

http://wpexperts.ir

مخزن به صورت هفتگی آپدیت می‌شود.

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

👤 Mojtaba

💎 Channel: @DevelopixPHP
👎7❤1
اگه تا حالا خواستی یه لاگین سبک برای SPA، موبایل یا حتی فرم ساده خودت بسازی، یه API لاگین کوچیک با PHP خالص می‌تونه عالی باشه؛ مخصوصاً وقتی با سبک مدرن و OOP نوشته بشه 😊

ایده این پست بر اساس ترکیبی از مستند رسمی PHP و چند نمونه‌کار تمیز روی GitHub هست (مثل ریپوهای سبک login API با PDO). تمرکز روی اینه که یه ساختار تمیز، قابل‌گسترش و امن‌تر نسبت به کدهای قدیمی و procedural داشته باشیم.

سناریو 🔎
می‌خوای یه endpoint مثل /api/login.php داشته باشی که:

• JSON از کلاینت بگیره (email و password)
• یوزر رو توی دیتابیس MySQL چک کنه
• پسورد رو با password_hash و password_verify هندل کنه
• در جواب، JSON تمیز برگردونه

چند نکته مهم قبل از کد 🧠
• حتماً PDO با prepared statement استفاده کن، نه query خام.
• همیشه Content-Type: application/json رو ست کن.
• خطاها رو JSON برگردون، نه echo ساده.

نمونه ساختار ساده API لاگین 🧩
این یه مثال مینیمال و قابل‌اجراست (فرض بر اینه که جدول users با ستون‌های id، email، password داری و پسوردها با password_hash ذخیره شدن):

<?php
// api/login.php

declare(strict_types=1);

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

class DB
{
private \PDO $pdo;

public function __construct()
{
$dsn = 'mysql:host=localhost;dbname=myapp;charset=utf8mb4';
$user = 'db_user';
$pass = 'db_pass';

$this->pdo = new \PDO($dsn, $user, $pass, [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
]);
}

public function findUserByEmail(string $email): ?array
{
$stmt = $this->pdo->prepare('SELECT * FROM users WHERE email = :email LIMIT 1');
$stmt->execute(['email' => $email]);
$user = $stmt->fetch();
return $user ?: null;
}
}

class LoginController
{
public function __construct(private DB $db) {}

public function handle(): void
{
$input = json_decode(file_get_contents('php://input'), true);

if (!isset($input['email'], $input['password'])) {
http_response_code(400);
echo json_encode(['error' => 'invalid_payload']);
return;
}

$user = $this->db->findUserByEmail($input['email']);
if (!$user || !password_verify($input['password'], $user['password'])) {
http_response_code(401);
echo json_encode(['error' => 'invalid_credentials']);
return;
}

echo json_encode([
'id' => (int) $user['id'],
'email' => $user['email'],
]);
}
}

$db = new DB();
$controller = new LoginController($db);
$controller->handle();


چرا این سبک خوبه؟ ⚙️
• کلاس DB جداست، بعداً راحت می‌تونی لاگ، کش یا تست واحد براش بنویسی.
• LoginController فقط روی لاجیک لاگین تمرکز داره، نه اتصال به دیتابیس.
• از strict_types و type hint استفاده شده که با PHP مدرن هماهنگه.

برای عمیق‌تر شدن توی این سبک، مستند رسمی PHP درباره PDO و همچنین بخش password hash و password_verify خیلی کمک‌کننده است.

این ساختار کوچیک رو بردار، توی پروژه‌هات امتحانش کن و با اضافه کردن token (مثلاً JWT) یا session، تبدیلش کن به یه auth کامل‌تر. تجربه‌هات رو هم با بقیه توسعه‌دهنده‌های PHP به اشتراک بذار 🔧💬

🔖 #PHP #پی_اچ_پی #PHP #Login_API #PDO #OOP #Authentication #Backend

👤 Developix

💎 Channel: @DevelopixPHP
👍3❤1
در نمونه‌کد بالا در بخش کد اشتباه برای گرفتن پست‌ها و کامنت‌ها در یک حلقه روی هر پست، یک Query جداگانه به دیتابیس ارسال شده است (مشکل معروف به N+1 Queries). این کار در اسکیل بالا فشار زیادی به دیتابیس وارد می‌کند و زمان پاسخ‌گویی را به‌شدت بالا می‌برد.

در کد صحیح با استفاده از with('comments.user') همه‌ی داده‌های مورد نیاز به‌صورت Eager Loading در چند Query محدود واکشی می‌شوند. به این ترتیب تعداد Queryها کاهش پیدا کرده، Latency پایین می‌آید و Performance در سناریوهایی مثل لیست کردن پست‌های صفحه‌ی اصلی یا Dashboard با تعداد زیاد رکورد به‌مراتب بهتر می‌شود.

اگر در پروژه‌ی PHP/Laravel خود با Modelهای مرتبط زیاد سروکار دارید، به جای دسترسی تنبلی (Lazy Loading) داخل حلقه، از Eager Loading استفاده کنید تا هم Queryهای غیرضروری حذف شوند و هم در Loadهای بالا دچار افت شدید سرعت و فشار روی دیتابیس نشوید.

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

👤 Developix

💎 Channel: @DevelopixPHP
در کد زیر، یک تابع برای trim کردن همه مقادیر یک آرایه چندبعدی نوشته شده است، اما نتیجه‌ی نهایی به‌درستی کار نمی‌کند و آرایه‌ی اصلی دچار رفتار عجیب می‌شود:


<?php

$data = [
['name' => ' Ali ', 'email' => ' ali@example.com '],
['name' => ' Sara ', 'email' => ' sara@example.com'],
];

function deepTrim(array $items): array
{
foreach ($items as &$row) {
foreach ($row as &$value) {
$value = trim($value);
}
}

return $items;
}

$result = deepTrim($data);

print_r($data);
print_r($result);


در این کد از reference در حلقه‌های foreach استفاده شده است و باعث بروز باگ پنهان در آرایه‌ی اصلی می‌شود.

چه چیزی باید در این کد اصلاح شود تا هم Memory Leak و هم رفتار غیرمنتظره روی آرایه‌ی اصلی برطرف شود؟

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

👤 Developix

💎 Channel: @DevelopixPHP
خروجی نهایی اجرای این کد در PHP چیست؟

توجه کنید که از closure بازگشتی و متغیر static داخل تابع استفاده شده است و ترتیب فراخوانی تابع اهمیت دارد.

<?php

function makeCounter() {
static $base = 1;
$multiplier = 2;

$f = function($n) use (&$f, $multiplier) {
static $inner = 0;
$inner += $n;
if ($n <= 1) {
return $inner * $multiplier;
}
return $f($n - 1) + $inner;
};

$result = $f($base + 2);
$base += 2;

return $result;
}

echo makeCounter() . "\n";
echo makeCounter() . "\n";


خروجی دقیق این اسکریپت (دو خط echo شده) را بنویسید.

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

👤 Developix

💎 Channel: @DevelopixPHP
خروجی اجرای این کد در PHP چیست؟


$val = "9";

for ($i = 0; $i < 3; $i++) {
$val++;
}

echo $val . "\n";

$val2 = "A9";
$val2++;

echo $val2 . "\n";

$val3 = "09";
$val3++;

echo $val3 . "\n";


به ترتیب سه خط خروجی این اسکریپت را بنویس.


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

👤 Developix

💎 Channel: @DevelopixPHP
👍1