
البرمجة كائنية التوجه في PHP
البرمجة الشيئية، والمعروفة أيضًا باسم OOP، هي أحد أهم أساليب البرمجة المستخدمة في تطوير PHP الحديث. فهو يساعد المطورين على تنظيم التعليمات البرمجية في هياكل قابلة لإعادة الاستخدام ويجعل صيانة التطبيقات أسهل أثناء نموها.
في PHP، يُستخدم OOP بكثرة في أطر عمل مثل Laravel وSymfony والعديد من أنظمة الواجهة الخلفية الاحترافية الأخرى. يعد فهم OOP خطوة مهمة قبل العمل بعمق مع تطبيقات PHP الحديثة.
تشرح هذه المقالة موضوعات PHP OOP الرئيسية الموضحة في مسار التعلم: ما هو OOP، الفئات والكائنات، والمنشئات، والمدمرات، ومعدلات الوصول، والميراث، والثوابت، والفئات المجردة، والواجهات، والسمات، والأساليب الثابتة، والخصائص الثابتة، ومساحات الأسماء، والأشياء القابلة للتكرار.
PHP ما هو OOP
OOP يرمز إلى البرمجة الشيئية. إنه أسلوب برمجة ينظم التعليمات البرمجية حول الكائنات بدلاً من الوظائف والمتغيرات فقط.
يمكن أن يمثل الكائن شيئًا ما في التطبيق، مثل مستخدم أو منتج أو منشور أو فاتورة أو أمر أو رسالة أو ملف. يمكن أن يحتوي كل كائن على بيانات وسلوك.
في OOP، عادةً ما يتم تخزين البيانات في الخصائص، بينما يُكتب السلوك عادةً كطرق.
على سبيل المثال، قد يحتوي كائن المستخدم على خصائص مثل الاسم والبريد الإلكتروني والدور. وقد تحتوي أيضًا على طرق مثل تسجيل الدخول، أو تسجيل الخروج، أو updateProfile، أو hasPermission.
OOP مفيد لأنه يساعد المطورين:
تنظيم التعليمات البرمجية في هياكل واضحة.
إعادة استخدام المنطق عبر التطبيق.
تقليل التعليمات البرمجية المتكررة.
نموذج مفاهيم التطبيق الحقيقي بشكل أكثر وضوحا.
جعل المشاريع الكبيرة أسهل للصيانة.
العمل بشكل أفضل مع أطر عمل PHP الحديثة.
PHP الفئات/الكائنات
الفصل هو مخطط لإنشاء الكائنات. فهو يحدد الخصائص والأساليب التي يمكن أن يمتلكها الكائن.
الكائن هو مثيل لفئة. هذا يعني أن الفئة تصف البنية، في حين أن الكائن هو النسخة الفعلية القابلة للاستخدام التي تم إنشاؤها من تلك البنية.
<?php
class User {
public $name;
public $email;
public function sayHello() {
return "Hello, " . $this->name;
}
}
$user = new User();
$user->name = "Adnan";
$user->email = "adnan@example.com";
echo $user->sayHello();
?>في هذا المثال، مستخدم هو الفصل، و $user هو كائن تم إنشاؤه من تلك الفئة.
ال $this تشير الكلمة الأساسية إلى الكائن الحالي. يتم استخدامه داخل الفصل للوصول إلى خصائص الكائن وأساليبه.
الفئات والكائنات هي أساس PHP OOP. معظم مفاهيم OOP المتقدمة مبنية عليها.
PHP المنشئ
المُنشئ هو أسلوب خاص يتم تشغيله تلقائيًا عند إنشاء كائن جديد. في PHP، تتم تسمية الأسلوب المنشئ __construct().
يتم استخدام المنشئين بشكل شائع لتعيين القيم الأولية لخصائص الكائن.
<?php
class User {
public $name;
public $email;
public function __construct($name, $email) {
$this->name = $name;
$this->email = $email;
}
public function getInfo() {
return $this->name . " - " . $this->email;
}
}
$user = new User("Adnan", "adnan@example.com");
echo $user->getInfo();
?>بدلاً من إنشاء الكائن أولاً ثم تعيين كل خاصية يدويًا، يسمح المنشئ بتمرير القيم مباشرة عند إنشاء الكائن.
تعتبر المنشئات مفيدة لحقن التبعية والتكوين الأولي والقيم المطلوبة وإعداد الكائن قبل استخدامه.
PHP المدمر
المدمر هو أسلوب خاص يتم تشغيله تلقائيًا عند تدمير كائن أو عند انتهاء البرنامج النصي. في PHP، تتم تسمية الأسلوب المدمر __destruct().
يمكن استخدام أدوات التدمير لمهام التنظيف، مثل إغلاق الموارد، أو كتابة السجلات النهائية، أو تحرير البيانات المؤقتة.
<?php
class Logger {
public function __construct() {
echo "Logger started.";
}
public function __destruct() {
echo "Logger finished.";
}
}
$logger = new Logger();
?>في العديد من تطبيقات PHP الحديثة، لا يتم استخدام أدوات التدمير كثيرًا مثل المُنشئات، ولكنها لا تزال جزءًا من دورة حياة OOP.
يجب على المطورين استخدام أدوات التدمير بعناية وتجنب وضع منطق عمل بالغ الأهمية داخلها، لأن توقيت تنفيذها يمكن أن يعتمد على كيفية انتهاء البرنامج النصي.
PHP معدّلات الوصول
تتحكم معدّلات الوصول في المكان الذي يمكن الوصول منه إلى الخصائص والأساليب. يوفر PHP ثلاثة معدلات وصول رئيسية: عام, محمي، و خاص.
عام: يمكن الوصول إليها من أي مكان.
محمي: يمكن الوصول إليها داخل الفصل وفئات الطفل.
خاص: لا يمكن الوصول إليها إلا داخل نفس الفئة.
<?php
class User {
public $name;
protected $role;
private $password;
public function setPassword($password) {
$this->password = $password;
}
public function getPassword() {
return $this->password;
}
}
$user = new User();
$user->name = "Adnan";
$user->setPassword("secret");
?>تعتبر معدّلات الوصول مهمة لأنها تحمي البيانات الداخلية وتتحكم في كيفية تفاعل الأجزاء الأخرى من التطبيق مع الكائن.
في التطوير الاحترافي PHP، غالبًا ما تظل الخصائص خاصة أو محمية، بينما يتم استخدام الأساليب العامة للتحكم في الوصول إليها. وهذا ما يسمى التغليف.
PHP الميراث
يسمح الوراثة لفئة واحدة بإعادة استخدام الخصائص والأساليب من فئة أخرى. تحتوي الفئة الأصل على منطق مشترك، بينما يمكن للفئة الفرعية توسيع هذا المنطق أو تخصيصه.
في PHP، يتم إنشاء الميراث باستخدام يمتد الكلمة الرئيسية.
<?php
class Person {
public $name;
public function sayHello() {
return "Hello, " . $this->name;
}
}
class Student extends Person {
public $grade;
public function study() {
return $this->name . " is studying.";
}
}
$student = new Student();
$student->name = "Adnan";
echo $student->sayHello();
echo $student->study();
?>في هذا المثال، طالب الطبقة ترث من شخص فصل. وهذا يعني أنه يمكن للطالب استخدام الخصائص والأساليب المحددة في الشخص.
يكون الوراثة مفيدًا عندما تشترك فئات متعددة في السلوك المشترك. ومع ذلك، يجب على المطورين تجنب الإفراط في استخدام الميراث لأنه قد يجعل الحفاظ على التعليمات البرمجية أكثر صعوبة إذا أصبح التسلسل الهرمي للفئة معقدًا للغاية.
PHP الثوابت
ثوابت الفئة هي قيم ثابتة تنتمي إلى فئة ما. وهي مفيدة للقيم التي لا ينبغي تغييرها، مثل الأدوار والحالات والأنواع والحدود والقيم الشبيهة بالتكوين.
يتم تعريف ثوابت الفئة باستخدام ثابت الكلمة الرئيسية.
<?php
class UserRole {
const ADMIN = "admin";
const EDITOR = "editor";
const USER = "user";
}
echo UserRole::ADMIN;
?>يتم الوصول إلى ثوابت الفئة باستخدام عامل دقة النطاق ::.
داخل نفس الفئة، يمكن الوصول إلى الثوابت باستخدام self::.
<?php
class Status {
const ACTIVE = "active";
public function getActiveStatus() {
return self::ACTIVE;
}
}
?>تساعد الثوابت على تجنب السلاسل المتكررة ذات الترميز الثابت وتجعل التعليمات البرمجية أكثر نظافة وأمانًا.
PHP دروس مجردة
الفئة المجردة هي فئة لا يمكن إنشاؤها مباشرة ككائن. وهي مصممة ليتم تمديدها من قبل فئات أخرى.
يمكن أن تحتوي الفئات المجردة على طرق عادية وأساليب مجردة. لا تحتوي الطريقة المجردة على نص في الفئة المجردة ويجب تنفيذها بواسطة الفئة الفرعية.
<?php
abstract class PaymentGateway {
abstract public function pay($amount);
public function currency() {
return "USD";
}
}
class StripePayment extends PaymentGateway {
public function pay($amount) {
return "Paid " . $amount . " using Stripe.";
}
}
$payment = new StripePayment();
echo $payment->pay(100);
echo $payment->currency();
?>تكون الفئات المجردة مفيدة عندما تريد تحديد بنية مشتركة مع الاستمرار في إجبار الفئات الفرعية على تنفيذ سلوك معين.
على سبيل المثال، قد تشترك بوابات الدفع المختلفة في بعض الطرق الشائعة، ولكن قد تحتاج كل بوابة إلى التنفيذ الخاص بها لمعالجة الدفع.
PHP واجهات
تحدد الواجهة العقد الذي يجب أن تتبعه الفئات. يحتوي على إعلانات الطريقة بدون أجسام الطريقة.
عندما يقوم الفصل بتنفيذ واجهة، يجب أن يوفر الطرق المطلوبة التي تحددها تلك الواجهة.
<?php
interface Notifier {
public function send($message);
}
class EmailNotifier implements Notifier {
public function send($message) {
return "Sending email: " . $message;
}
}
class SmsNotifier implements Notifier {
public function send($message) {
return "Sending SMS: " . $message;
}
}
?>تكون الواجهات مفيدة عندما تتبع الفئات المختلفة نفس البنية ولكن تطبق المنطق بشكل مختلف.
على سبيل المثال، يمكن لإشعارات البريد الإلكتروني وإشعارات الرسائل النصية القصيرة وإشعارات الدفع تنفيذ نفس واجهة Notifier أثناء إرسال الرسائل بطرق مختلفة.
تعد الواجهات مهمة جدًا في تطوير PHP الحديث لأنها تدعم التعليمات البرمجية المرنة والقابلة للاختبار والمترابطة بشكل غير محكم.
PHP السمات
تسمح السمات للمطورين بإعادة استخدام الأساليب عبر فئات متعددة دون استخدام الوراثة. تشبه السمة مجموعة من الأساليب القابلة لإعادة الاستخدام والتي يمكن إدراجها في الفصل.
يتم تعريف السمات باستخدام سمة الكلمة الأساسية واستخدامها داخل الفصل الدراسي مع يستخدم الكلمة الرئيسية.
<?php
trait HasSlug {
public function generateSlug($title) {
return strtolower(str_replace(" ", "-", $title));
}
}
class Post {
use HasSlug;
}
$post = new Post();
echo $post->generateSlug("Learning PHP OOP");
?>تكون السمات مفيدة عندما تحتاج الفئات المختلفة إلى نفس السلوك المساعد ولكنها لا تنتمي بشكل طبيعي إلى نفس التسلسل الهرمي للميراث.
على سبيل المثال، قد تحتاج نماذج متعددة إلى إنشاء سبيكة ثابتة، أو التسجيل، أو التنسيق، أو أساليب فائدة مشتركة.
يجب استخدام السمات بعناية. إذا أصبحت السمة كبيرة جدًا أو تحتوي على الكثير من المنطق غير ذي الصلة، فقد يؤدي ذلك إلى صعوبة فهم التعليمات البرمجية.
PHP الأساليب الثابتة
تنتمي الطريقة الثابتة إلى الفئة نفسها، وليس إلى كائن معين. هذا يعني أنه يمكنك استدعاء أسلوب ثابت دون إنشاء كائن من الفئة.
يتم تعريف الأساليب الثابتة باستخدام ثابت الكلمة الرئيسية.
<?php
class MathHelper {
public static function add($a, $b) {
return $a + $b;
}
}
echo MathHelper::add(5, 10);
?>يتم الوصول إلى الأساليب الثابتة باستخدام عامل دقة النطاق ::.
يتم استخدامها غالبًا للطرق المساعدة وفئات الأدوات المساعدة والمنسقات البسيطة والعمليات التي لا تحتاج إلى حالة الكائن.
داخل طريقة ثابتة، لا يمكنك استخدامها $this لأنه لا يوجد مثيل كائن. بدلاً من ذلك، يمكن للطرق الثابتة الوصول إلى الخصائص الثابتة أو الطرق الثابتة الأخرى باستخدام self::.
PHP الخصائص الثابتة
تنتمي الخاصية الثابتة إلى الفئة نفسها بدلاً من كائن معين. وهذا يعني أن القيمة تتم مشاركتها عبر الفصل بدلاً من تخزينها بشكل منفصل في كل مثيل كائن.
<?php
class Counter {
public static $count = 0;
public function __construct() {
self::$count++;
}
}
new Counter();
new Counter();
new Counter();
echo Counter::$count;
?>في هذا المثال، في كل مرة يتم إنشاء كائن جديد، تكون الخاصية ثابتة $count يزيد. تتم مشاركة القيمة على مستوى الفصل.
يمكن أن تكون الخصائص الثابتة مفيدة للعدادات، أو التكوين المشترك، أو القيم المخزنة مؤقتًا، أو الحالة على مستوى الفئة.
ومع ذلك، يجب استخدام الحالة الثابتة بعناية في التطبيقات الكبيرة لأنها قد تجعل الاختبار وتصحيح الأخطاء أكثر صعوبة إذا تغيرت الحالة بشكل غير متوقع.
PHP مساحات الأسماء
تساعد مساحات الأسماء في تنظيم الفئات والواجهات والسمات والوظائف في مجموعات منطقية. كما أنها تمنع تعارض الأسماء بين الفئات التي قد يكون لها نفس الاسم.
في تطبيق كبير، قد يكون لدى العديد من الفئات أسماء شائعة مثل المستخدم أو وحدة التحكم أو الخدمة أو الطلب أو الاستجابة. تسمح مساحات الأسماء بوجود هذه الأسماء في أجزاء مختلفة من التطبيق دون تعارض.
<?php
namespace App\Models;
class User {
public function getName() {
return "Adnan";
}
}
?>يمكن استيراد فئة من مساحة الاسم باستخدام يستخدم الكلمة الرئيسية.
<?php
use App\Models\User;
$user = new User();
echo $user->getName();
?>تعد مساحات الأسماء ضرورية في مشاريع PHP الحديثة. تستخدم أطر العمل مثل Laravel وSymfony مساحات الأسماء لتنظيم وحدات التحكم والنماذج والخدمات والبرامج الوسيطة والطلبات والوظائف والعديد من الفئات الأخرى.
PHP العناصر القابلة للتكرار
التكرار هو القيمة التي يمكن تكرار استخدامها foreach. في PHP، تكون المصفوفات قابلة للتكرار، ويمكن أيضًا أن تكون الكائنات قابلة للتكرار إذا قامت بتنفيذ الواجهات الصحيحة.
ال قابل للتكرار يمكن استخدام type كنوع معلمة دالة لقبول المصفوفات أو الكائنات التي يمكن التكرار من خلالها.
<?php
function printItems(iterable $items) {
foreach ($items as $item) {
echo $item;
}
}
printItems(["PHP", "Laravel", "Symfony"]);
?>تكون العناصر القابلة للتكرار مفيدة عندما يجب أن تعمل الدالة مع أي بنية بيانات تشبه القائمة، وليس فقط المصفوفات العادية.
يدعم PHP أيضًا المولدات التي يمكنها إرجاع قيم قابلة للتكرار باستخدام التابع أَثْمَر الكلمة الرئيسية.
<?php
function numbers() {
yield 1;
yield 2;
yield 3;
}
foreach (numbers() as $number) {
echo $number;
}
?>تكون المولدات مفيدة عند التعامل مع البيانات الكبيرة لأنها يمكنها إنتاج قيم واحدة تلو الأخرى دون تحميل كل شيء في الذاكرة مرة واحدة.
كيف تعمل مفاهيم PHP OOP معًا
في تطبيقات PHP الحقيقية، غالبًا ما يتم استخدام مفاهيم OOP معًا. قد تحتوي الفئة على خصائص خاصة ومنشئ وثوابت وأساليب ومساحة اسم. قد يقوم بتنفيذ واجهة، واستخدام سمة، وتوسيع فئة مجردة، وإرجاع بيانات قابلة للتكرار.
يجمع المثال التالي عدة مفاهيم OOP في بنية بسيطة.
<?php
namespace App\Services;
interface ReportGenerator {
public function generate(): iterable;
}
trait HasTimestamp {
public function currentTime() {
return date("Y-m-d H:i:s");
}
}
abstract class BaseReport {
const FORMAT = "text";
protected $title;
public function __construct($title) {
$this->title = $title;
}
abstract public function generate(): iterable;
}
class SalesReport extends BaseReport implements ReportGenerator {
use HasTimestamp;
public static $count = 0;
public function __construct($title) {
parent::__construct($title);
self::$count++;
}
public function generate(): iterable {
yield $this->title;
yield "Generated at: " . $this->currentTime();
yield "Format: " . self::FORMAT;
}
}
$report = new SalesReport("Monthly Sales Report");
foreach ($report->generate() as $line) {
echo $line;
}
?>يستخدم هذا المثال مساحة الاسم، والواجهة، والسمات، والفئة المجردة، وثابت الفئة، والمنشئ، والخاصية الثابتة، والميراث، والمخرجات القابلة للتكرار. يوضح كيف يمكن أن تعمل مفاهيم OOP معًا لإنشاء تعليمات برمجية منظمة.
لماذا OOP مهم في PHP الحديث
يعتمد تطوير PHP الحديث بشكل كبير على OOP. عادة ما يتم تنظيم الأطر والحزم والمكتبات والتطبيقات المهنية حول الفئات والواجهات والخدمات ووحدات التحكم والنماذج والكائنات القابلة لإعادة الاستخدام.
في Laravel، على سبيل المثال، وحدات التحكم عبارة عن فئات، والنماذج عبارة عن فئات، والطلبات عبارة عن فئات، والوظائف عبارة عن فئات، والبرامج الوسيطة عبارة عن فئات، وغالبًا ما تتم كتابة الخدمات كفئات. إن فهم OOP يجعل من السهل فهم كيفية عمل إطار العمل.
يدعم OOP أيضًا اختبارًا أفضل وبنية أكثر نظافة. عندما يتم تنظيم التعليمات البرمجية في كائنات وعقود واضحة، يصبح من الأسهل استبدال أجزاء من التطبيق، وكتابة اختبارات الوحدة، وصيانة المشروع بمرور الوقت.
خاتمة
تعد البرمجة كائنية التوجه PHP مهارة أساسية لبناء تطبيقات PHP الحديثة والمهنية. تساعد المفاهيم مثل الفئات، والكائنات، والمنشئات، والمدمرات، ومعدلات الوصول، والميراث، والثوابت، والفئات المجردة، والواجهات، والسمات، والأساليب الثابتة، والخصائص الثابتة، ومساحات الأسماء، والتكرارات المطورين على كتابة تعليمات برمجية أكثر وضوحًا وقابلة لإعادة الاستخدام.
قد يبدو OOP معقدًا في البداية، ولكن كل مفهوم يصبح أسهل عند التدرب عليه بأمثلة بسيطة. ابدأ بالفئات والكائنات، ثم انتقل تدريجيًا إلى المُنشئات ومعدلات الوصول والميراث والواجهات والسمات ومساحات الأسماء.
بعد فهم PHP OOP، الخطوة التالية هي تطبيق هذه المفاهيم في مشاريع وأطر عمل حقيقية مثل Laravel، حيث يتم استخدام OOP في كل جزء من التطبيق تقريبًا.

