آموزش برنامه نویسی PHP-جلسه بیستم

آموزش برنامه نویسی PHP-جلسه بیستم

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

Iterable در PHP چیست؟

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

برای مثال اگر یک آرایه داشته باشیم، می‌توانیم به کمک foreach تمام عناصر آن را یکی‌یکی بررسی کنیم:

<?php

$names = ["Ali", "Sara", "Reza"];

foreach ($names as $name) {
    echo $name;
}

?>

اما در پروژه‌های واقعی همیشه نمی‌توانیم فرض کنیم داده‌ای که به یک تابع ارسال می‌شود حتماً یک آرایه است. PHP نوع داده‌ای به نام Iterable در اختیار ما قرار داده است که برای مشخص کردن داده‌هایی استفاده می‌شود که قابلیت پیمایش با foreach را دارند.


Iterable در PHP چه مفهومی دارد؟

iterable یک نوع داده (Type) در PHP است که می‌تواند داده‌هایی را بپذیرد که قابلیت پیمایش با foreach دارند.

در PHP، iterable شامل موارد زیر می‌شود:

  • آرایه‌ها (array)
  • اشیایی که Traversable هستند
  • Iteratorها
  • Generatorها

بنابراین یک نکته مهم این است که iterable فقط به معنی «آرایه» نیست.

برای مثال:

function printIterable(iterable $items)
{
    foreach ($items as $item) {
        echo $item;
    }
}

در اینجا PHP انتظار دارد مقدار ارسال‌شده به $items قابل پیمایش باشد.


چرا از Iterable استفاده می‌کنیم؟

فرض کنید تابعی داریم که قرار است با foreach روی داده‌های ورودی حرکت کند:

function printItems($items)
{
    foreach ($items as $item) {
        echo $item;
    }
}

در این حالت نوع ورودی تابع مشخص نیست.

ممکن است برنامه‌نویس دیگری به اشتباه مقدار نامناسبی برای تابع ارسال کند.

اما با استفاده از Type Declaration می‌توانیم مشخص کنیم که ورودی تابع باید iterable باشد:

function printItems(iterable $items)
{
    foreach ($items as $item) {
        echo $item;
    }
}

اکنون تابع فقط داده‌ای را قبول می‌کند که PHP آن را iterable تشخیص دهد.

این موضوع باعث می‌شود کد قابل پیش‌بینی‌تر و خطاهای ناشی از ورودی نامعتبر کمتر شوند.


مثال ساده از Iterable

در مثال زیر یک آرایه به تابع ارسال می‌کنیم:

<?php

function printIterable(iterable $myIterable)
{
    foreach ($myIterable as $item) {
        echo $item;
    }
}

$arr = ["a", "b", "c"];

printIterable($arr);

?>

خروجی:

abc

چون $arr یک Array است و Array در PHP قابلیت پیمایش دارد، ارسال آن به پارامتر iterable معتبر است.


اگر مقدار نامعتبر به Iterable ارسال شود چه اتفاقی می‌افتد؟

اگر تابعی به صورت زیر تعریف شده باشد:

function printIterable(iterable $items)
{
    foreach ($items as $item) {
        echo $item;
    }
}

و یک مقدار نامعتبر مانند یک عدد یا Boolean به آن ارسال شود، PHP خطای TypeError ایجاد می‌کند.

برای مثال:

printIterable(123);

این مقدار iterable نیست و نمی‌تواند به عنوان ورودی معتبر برای این تابع استفاده شود.

این ویژگی یکی از مزایای Type Declaration در PHP است، زیرا خطا را نزدیک به محل ورود داده نامعتبر مشخص می‌کند.


Iterable به عنوان Return Type

iterable فقط برای ورودی توابع استفاده نمی‌شود.

می‌توانیم مشخص کنیم که یک تابع باید یک مقدار iterable برگرداند.

برای این کار بعد از پرانتز تابع از : iterable استفاده می‌کنیم:

function getIterable(): iterable
{
    return ["a", "b", "c"];
}

سپس:

$myIterable = getIterable();

foreach ($myIterable as $item) {
    echo $item;
}

در اینجا مشخص کرده‌ایم مقدار برگشتی تابع باید قابل پیمایش باشد.


مثال کامل Return Type با Iterable

<?php

function getIterable(): iterable
{
    return ["PHP", "MySQL", "HTML"];
}

$items = getIterable();

foreach ($items as $item) {
    echo $item . "<br>";
}

?>

خروجی:

PHP
MySQL
HTML

استفاده از Return Type باعث می‌شود قرارداد تابع مشخص باشد و سایر بخش‌های برنامه بدانند چه نوع مقداری از تابع دریافت خواهند کرد.


Iterable فقط Array نیست

یکی از نکات مهم در مورد iterable این است که تصور نکنیم:

iterable = array

این دو دقیقاً یکسان نیستند.

iterable یک مفهوم گسترده‌تر است و علاوه بر Array، اشیایی را نیز شامل می‌شود که قابلیت پیمایش دارند.

برای مثال:

function showItems(iterable $items)
{
    foreach ($items as $item) {
        echo $item;
    }
}

این تابع می‌تواند با یک Array یا یک Iterator مناسب کار کند.

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


Iterable و Generator

یکی از کاربردهای مهم Iterable در PHP، کار با Generatorها است.

Generatorها به ما اجازه می‌دهند داده‌ها را به صورت مرحله‌ای تولید کنیم، بدون اینکه لازم باشد تمام داده‌ها را هم‌زمان در حافظه قرار دهیم.

برای مثال:

function numbers(): iterable
{
    yield 1;
    yield 2;
    yield 3;
}

foreach (numbers() as $number) {
    echo $number . "<br>";
}

خروجی:

1
2
3

در پروژه‌هایی که با حجم زیادی از داده‌ها کار می‌کنند، Generator می‌تواند به کاهش مصرف حافظه کمک کند.


بررسی Iterable بودن یک مقدار

در PHP می‌توانیم برای بررسی اینکه یک مقدار قابل پیمایش است یا خیر، از is_iterable() استفاده کنیم.

مثال:

$value = ["a", "b", "c"];

if (is_iterable($value)) {
    echo "This value is iterable.";
}

خروجی:

This value is iterable.

مثلاً:

$value = "Hello";

if (is_iterable($value)) {
    echo "Iterable";
} else {
    echo "Not iterable";
}

در این حالت رشته معمولی iterable محسوب نمی‌شود.

بنابراین:

is_iterable($value)

یک روش مناسب برای بررسی قابلیت پیمایش یک مقدار است.


تفاوت Iterable و Array

تفاوت مهم این دو را می‌توان به صورت زیر خلاصه کرد:

ویژگیArrayIterable
نوع داده مشخصبلهیک Type برای مقادیر قابل پیمایش
شامل Arrayبلهبله
شامل Iteratorخیربله
قابل استفاده با foreachبلهبله
قابل استفاده به عنوان Type Declarationبلهبله
مناسب برای داده‌های قابل پیمایش مختلفمحدودترانعطاف‌پذیرتر

PHP و پایگاه داده چیست؟

تقریباً بیشتر وب‌سایت‌ها و برنامه‌های تحت وب با داده‌هایی سروکار دارند.

برای مثال در یک فروشگاه اینترنتی اطلاعاتی مانند موارد زیر باید ذخیره شوند:

  • اطلاعات کاربران
  • نام محصولات
  • قیمت محصولات
  • سفارش‌ها
  • اطلاعات پرداخت
  • دسته‌بندی محصولات
  • نظرات کاربران
  • تاریخ ثبت سفارش

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

به همین دلیل از Database یا پایگاه داده استفاده می‌کنیم.

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


Database چیست؟

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

برای مثال ممکن است یک فروشگاه اینترنتی جدولی به نام users داشته باشد:

idnameemail
1Aliali@example.com
2Sarasara@example.com
3Rezareza@example.com

و جدول دیگری برای محصولات داشته باشد:

idnameprice
1Laptop50000
2Mouse1000
3Keyboard2500

پایگاه داده به برنامه اجازه می‌دهد این اطلاعات را ذخیره و در زمان نیاز بازیابی کند.


MySQL چیست؟

MySQL یکی از سیستم‌های مدیریت پایگاه داده رابطه‌ای (RDBMS) است.

در MySQL اطلاعات معمولاً در قالب جدول‌هایی ذخیره می‌شوند و بین جدول‌ها می‌توان روابط مختلفی ایجاد کرد.

برای مثال یک فروشگاه اینترنتی می‌تواند جدول‌های زیر را داشته باشد:

users
products
orders
order_items
categories

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


PHP چگونه با MySQL ارتباط برقرار می‌کند؟

PHP خودش Database نیست.

PHP یک زبان برنامه‌نویسی سمت سرور است و می‌تواند با سیستم‌های مدیریت پایگاه داده مختلف ارتباط برقرار کند.

یکی از رایج‌ترین انتخاب‌ها برای پروژه‌های PHP، MySQL یا سیستم‌های سازگار با آن است.

به طور ساده می‌توان ارتباط را این‌گونه تصور کرد:

کاربر
   ↓
وب‌سایت
   ↓
PHP
   ↓
MySQL
   ↓
Database

برای مثال کاربر در یک فرم ثبت‌نام، نام و ایمیل خود را وارد می‌کند.

PHP اطلاعات فرم را دریافت می‌کند و با استفاده از Query مناسب آن را در MySQL ذخیره می‌کند.


SQL چیست؟

برای کار با بسیاری از پایگاه داده‌های رابطه‌ای از زبان SQL استفاده می‌شود.

SQL مخفف:

Structured Query Language

به معنی «زبان پرس‌وجوی ساخت‌یافته» است.

SQL یک زبان استاندارد برای کار با داده‌های پایگاه داده‌های رابطه‌ای است.

با SQL می‌توان عملیات مختلفی مانند موارد زیر را انجام داد:

  • ایجاد جدول
  • اضافه کردن اطلاعات
  • دریافت اطلاعات
  • ویرایش اطلاعات
  • حذف اطلاعات
  • جست‌وجو در داده‌ها
  • مرتب‌سازی اطلاعات
  • ایجاد ارتباط بین جدول‌ها

مثال ساده SQL

برای دریافت اطلاعات از یک جدول می‌توان از دستور SELECT استفاده کرد:

SELECT * FROM users;

این Query اطلاعات موجود در جدول users را دریافت می‌کند.

برای اضافه کردن یک کاربر:

INSERT INTO users (name, email)
VALUES ('Ali', 'ali@example.com');

برای تغییر اطلاعات:

UPDATE users
SET name = 'Reza'
WHERE id = 1;

و برای حذف:

DELETE FROM users
WHERE id = 1;

این دستورات بخشی از زبان SQL هستند و PHP می‌تواند آن‌ها را برای اجرا به سیستم پایگاه داده ارسال کند.


MySQL چه تفاوتی با SQL دارد؟

این دو مفهوم را نباید با یکدیگر اشتباه گرفت.

SQL یک زبان برای کار با پایگاه داده‌های رابطه‌ای است.

اما MySQL یک سیستم مدیریت پایگاه داده است که از SQL برای کار با داده‌ها استفاده می‌کند.

به زبان ساده:

SQL
↓
زبان کار با داده‌ها

MySQL
↓
سیستم مدیریت پایگاه داده

برای مثال:

SELECT * FROM users;

یک دستور SQL است.

این دستور می‌تواند در MySQL اجرا شود.


دیتابیس رابطه‌ای چیست؟

MySQL یک سیستم مدیریت پایگاه داده رابطه‌ای است.

در پایگاه داده‌های رابطه‌ای، اطلاعات معمولاً در جدول‌ها ذخیره می‌شوند و می‌توان بین جدول‌ها ارتباط ایجاد کرد.

فرض کنید یک فروشگاه داریم.

جدول کاربران:

users

جدول سفارش‌ها:

orders

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

در چنین ساختاری معمولاً از شناسه‌هایی مانند id و user_id برای ایجاد ارتباط بین داده‌ها استفاده می‌شود.

مثلاً:

users
----------------
id | name
1  | Ali
2  | Sara

orders
----------------
id | user_id
10 | 1
11 | 2

در این مثال سفارش شماره 10 مربوط به کاربری با id = 1 است.


انواع معروف پایگاه داده

امروزه سیستم‌های مدیریت پایگاه داده متنوعی وجود دارند و انتخاب آن‌ها به نیاز پروژه، حجم داده، معماری سیستم و سایر عوامل بستگی دارد.

برخی از سیستم‌های شناخته‌شده عبارت‌اند از:

MySQL

MySQL یک سیستم مدیریت پایگاه داده رابطه‌ای محبوب است که در پروژه‌های وب کاربرد زیادی دارد و از SQL استفاده می‌کند.

Microsoft SQL Server

SQL Server محصول شرکت Microsoft است و در بسیاری از سیستم‌های سازمانی و تجاری استفاده می‌شود.

Oracle Database

Oracle Database یکی از سیستم‌های مدیریت پایگاه داده سازمانی شناخته‌شده است و در پروژه‌های بزرگ و سامانه‌های حساس مورد استفاده قرار می‌گیرد.

PostgreSQL

PostgreSQL یک سیستم مدیریت پایگاه داده رابطه‌ای و شیءگرا با قابلیت‌های پیشرفته است که در بسیاری از پروژه‌های حرفه‌ای مورد استفاده قرار می‌گیرد.

SQLite

SQLite یک پایگاه داده سبک و مبتنی بر فایل است و در پروژه‌هایی که به یک سرور دیتابیس جداگانه نیاز ندارند، کاربرد زیادی دارد.

IBM Db2

Db2 یکی از محصولات پایگاه داده IBM است که در محیط‌های سازمانی و تجاری استفاده می‌شود.

Amazon RDS

Amazon RDS یک سرویس مدیریت‌شده پایگاه داده در زیرساخت AWS است. RDS خودش یک موتور پایگاه داده مستقل محسوب نمی‌شود؛ بلکه امکان استفاده مدیریت‌شده از موتورهایی مانند MySQL، PostgreSQL و چند سیستم دیگر را فراهم می‌کند.


چرا MySQL در پروژه‌های PHP محبوب است؟

MySQL سال‌هاست در پروژه‌های وب مورد استفاده قرار می‌گیرد و در اکوسیستم PHP نیز کاربرد گسترده‌ای دارد.

برخی دلایل رایج استفاده از MySQL در پروژه‌های PHP عبارت‌اند از:

  • سازگاری مناسب با PHP
  • پشتیبانی از SQL
  • مناسب بودن برای بسیاری از پروژه‌های وب
  • ابزارهای متعدد برای مدیریت پایگاه داده
  • پشتیبانی گسترده در سرویس‌های میزبانی وب
  • جامعه کاربری بزرگ
  • امکان استفاده در پروژه‌های کوچک تا سیستم‌های بزرگ‌تر

البته انتخاب دیتابیس باید بر اساس نیاز واقعی پروژه انجام شود و نمی‌توان گفت MySQL برای تمام پروژه‌ها بهترین انتخاب است.


ارتباط PHP با MySQL در پروژه‌های واقعی

فرض کنید یک فرم ثبت‌نام داریم:

نام
ایمیل
رمز عبور

کاربر اطلاعات را وارد می‌کند.

فرآیند کلی می‌تواند به این شکل باشد:

کاربر
   ↓
فرم HTML
   ↓
PHP
   ↓
اعتبارسنجی اطلاعات
   ↓
SQL Query
   ↓
MySQL
   ↓
ذخیره اطلاعات

وقتی کاربر بعداً وارد حساب خود می‌شود، PHP می‌تواند اطلاعات مورد نیاز را از MySQL دریافت کند و نتیجه را به کاربر نمایش دهد.


روش‌های ارتباط PHP با MySQL

در PHP روش‌های مختلفی برای ارتباط با MySQL وجود دارد.

دو روش شناخته‌شده عبارت‌اند از:

MySQLi

MySQLi یکی از APIهای PHP برای کار با MySQL است.

مثال:

<?php

$connection = new mysqli(
    "localhost",
    "username",
    "password",
    "database"
);

if ($connection->connect_error) {
    die("Connection failed: " . $connection->connect_error);
}

echo "Connected successfully";

?>

PDO

روش دیگر استفاده از PDO است.

PDO یک API عمومی‌تر برای دسترسی به پایگاه داده‌ها در PHP است و از چندین سیستم پایگاه داده پشتیبانی می‌کند.

مثال:

<?php

$dsn = "mysql:host=localhost;dbname=my_database;charset=utf8mb4";

$pdo = new PDO($dsn, "username", "password");

$pdo->setAttribute(
    PDO::ATTR_ERRMODE,
    PDO::ERRMODE_EXCEPTION
);

echo "Connected successfully";

?>

استفاده از Prepared Statement

هنگام دریافت اطلاعات از کاربر و ارسال آن به دیتابیس، نباید مقادیر ورودی را به شکل ناامن مستقیماً داخل Query قرار دهیم.

یکی از روش‌های مهم برای افزایش امنیت Queryها استفاده از Prepared Statement است.

برای مثال با PDO:

$stmt = $pdo->prepare(
    "SELECT * FROM users WHERE email = :email"
);

$stmt->execute([
    "email" => $email
]);

این روش به جلوگیری از بسیاری از مشکلات SQL Injection کمک می‌کند و در برنامه‌های واقعی باید هنگام کار با داده‌های ورودی کاربر به آن توجه ویژه داشت.


اهمیت امنیت در ارتباط PHP و Database

ارتباط PHP با دیتابیس فقط به ذخیره اطلاعات محدود نمی‌شود؛ امنیت داده‌ها نیز اهمیت زیادی دارد.

در پروژه‌های واقعی باید مواردی مانند موارد زیر را جدی گرفت:

  • استفاده از Prepared Statements
  • اعتبارسنجی ورودی کاربران
  • عدم ذخیره رمز عبور به صورت متن ساده
  • استفاده از password_hash() برای Hash کردن رمز عبور
  • محدود کردن دسترسی کاربر دیتابیس
  • عدم قرار دادن اطلاعات حساس دیتابیس در کد عمومی
  • مدیریت صحیح خطاها
  • استفاده از HTTPS برای ارتباطات وب
  • پشتیبان‌گیری منظم از داده‌های مهم

به عنوان مثال برای ذخیره رمز عبور نباید آن را به صورت Plain Text در دیتابیس قرار داد:

$passwordHash = password_hash(
    $password,
    PASSWORD_DEFAULT
);

سپس هنگام ورود کاربر می‌توان Hash ذخیره‌شده را با password_verify() بررسی کرد.


ارتباط Iterable با کار با Database

Iterable در پروژه‌های PHP می‌تواند هنگام کار با داده‌های دیتابیس نیز مفید باشد.

فرض کنید تابعی داریم که قرار است مجموعه‌ای از نتایج را دریافت و نمایش دهد:

function displayUsers(iterable $users)
{
    foreach ($users as $user) {
        echo $user["name"] . "<br>";
    }
}

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

این نوع طراحی باعث می‌شود تابع به یک ساختار خاص وابستگی کمتری داشته باشد.


جمع‌بندی

در این بخش با دو موضوع مهم در PHP آشنا شدیم: Iterable و Database.

iterable یک Type در PHP است که برای مقادیری استفاده می‌شود که قابلیت پیمایش با foreach را دارند. Arrayها، Iteratorها و Generatorها نمونه‌هایی از داده‌های قابل پیمایش هستند.

برای مثال:

function printItems(iterable $items)
{
    foreach ($items as $item) {
        echo $item;
    }
}

همچنین می‌توان از iterable به عنوان Return Type استفاده کرد:

function getItems(): iterable
{
    return ["A", "B", "C"];
}

در بخش دیتابیس نیز یاد گرفتیم که Database برای ذخیره و مدیریت اطلاعات استفاده می‌شود و MySQL یکی از سیستم‌های مدیریت پایگاه داده رابطه‌ای شناخته‌شده است.

همچنین باید تفاوت بین SQL و MySQL را به خاطر داشته باشیم:

SQL
↓
زبان کار با پایگاه داده

MySQL
↓
سیستم مدیریت پایگاه داده

PHP نیز می‌تواند از طریق ابزارهایی مانند MySQLi و PDO با MySQL ارتباط برقرار کند و اطلاعات را ذخیره، دریافت، ویرایش و حذف کند.

در پروژه‌های حرفه‌ای، آشنایی با این مفاهیم در کنار مباحثی مانند OOP، PDO، SQL، امنیت دیتابیس، Prepared Statements و طراحی پایگاه داده، پایه مهمی برای ساخت وب‌سایت‌ها و نرم‌افزارهای مبتنی بر PHP محسوب می‌شود.

پیشنهاد ما:آموزش رایگان PHP

اشتراک گذاری :
مریم گوهرزاد
نویسنده

مریم گوهرزاد

مدرس و بنیانگذار هلدینگ آرتا رسانه. برنامه نویس و محقق حوزه بلاکچین و توسعه‌دهنده بلاکچین | متخصص Solidity | توسعه‌دهنده وب Full-Stackمن یک توسعه‌دهنده علاقه‌مند به فناوری‌های بلاکچین و وب ۳ هستم و در زمینه Solidity، توسعه قراردادهای هوشمند و ساخت برنامه‌های غیرمتمرکز (DApps) فعالیت می‌کنم. تمرکز من بر طراحی و پیاده‌سازی راهکارهایی است که در کنار بهره‌گیری از فناوری‌های نوین، عملکرد مناسب، امنیت و تجربه کاربری مطلوبی ارائه دهند.در کنار تخصص در حوزه بلاکچین، به عنوان یک توسعه‌دهنده وب Full-Stack نیز در طراحی و توسعه وب‌سایت‌ها و برنامه‌های تحت وب فعالیت می‌کنم. تجربه کار در بخش‌های Front-End و Back-End به من این امکان را داده است که پروژه‌ها را از مرحله ایده و طراحی تا توسعه و اجرا، با دیدی جامع دنبال کنم. در فرآیند توسعه، توجه ویژه‌ای به کدنویسی تمیز، معماری مناسب، طراحی واکنش‌گرا، عملکرد مطلوب و تجربه کاربری روان دارم.

TEST_VALUE_123
https://t.me/artarasaneh
tel:09193426251
https://wa.me/+989193426251
https://instagram.com/artarasaneh_com