الجزء التاسع – المفاهيم المتقدمة في PHP: البرمجة الكائنية (OOP) وأنماط التصميم (Design Patterns) – سلسلة FSWD – PHP

أولاً: البرمجة الكائنية (Object-Oriented Programming – OOP)
البرمجة الكائنية هي طريقة لتنظيم الكود حول الكائنات (Objects) بدلاً من الإجراءات (Procedures). الكائنات هي وحدات تحتوي على بيانات (تسمى الخصائص – Properties) ودوال (تسمى الأساليب – Methods) يمكن أن تتفاعل مع البيانات.
الـ OOP توفر العديد من المفاهيم الأساسية التي تجعل الكود أكثر مرونة وقابلية لإعادة الاستخدام والتوسع.
المفاهيم الأساسية في البرمجة الكائنية:
-
الفئات (Classes):
-
الفئة هي قالب لإنشاء الكائنات. تحدد الفئة الخصائص والأساليب التي ستتمتع بها الكائنات.
-
-
الكائنات (Objects):
-
الكائن هو نسخة من الفئة، ويحتوي على البيانات والأساليب المحددة في الفئة.
-
-
التوريث (Inheritance):
-
يمكن لفئة أن ترث الخصائص والأساليب من فئة أخرى.
-
-
التغليف (Encapsulation):
-
إخفاء البيانات الداخلية وحمايتها من التلاعب الخارجي. يتم ذلك باستخدام التعديلات مثل
public
,protected
, وprivate
.
-
-
التعددية الشكلية (Polymorphism):
-
إمكانية استخدام الأساليب بنفس الاسم ولكن مع سلوكيات مختلفة في فئات مختلفة.
-
كيفية إنشاء فئة (Class) وكائن (Object):
مثال على فئة وكائن
<?php
// تعريف فئة
class Car {
// الخصائص
public $make;
public $model;
public $year;
// دالة (أسلوب) لتعيين البيانات
public function setDetails($make, $model, $year) {
$this->make = $make;
$this->model = $model;
$this->year = $year;
}
// دالة لعرض البيانات
public function displayDetails() {
echo "السيارة: " . $this->year . " " . $this->make . " " . $this->model . "<br>";
}
}
// إنشاء كائن من الفئة
$car1 = new Car();
$car1->setDetails("Toyota", "Corolla", 2022);
$car1->displayDetails();
?>
شرح الكود:
-
قمنا بإنشاء فئة Car تحتوي على ثلاث خصائص (
$make
,$model
,$year
) ودالتين (setDetails()
وdisplayDetails()
). -
استخدمنا
new Car()
لإنشاء كائن من الفئة. -
قمنا بتعيين القيم إلى الخصائص باستخدام دالة
setDetails()
. -
قمنا بعرض التفاصيل باستخدام دالة
displayDetails()
.
التوريث (Inheritance):
التوريث يسمح لفئة أن ترث الخصائص والأساليب من فئة أخرى.
مثال على التوريث
<?php
// فئة أساسية
class Animal {
public $name;
public function setName($name) {
$this->name = $name;
}
public function speak() {
echo $this->name . " makes a sound.<br>";
}
}
// فئة مشتقة ترث من الفئة الأساسية
class Dog extends Animal {
public function speak() {
echo $this->name . " barks.<br>"; // نغير السلوك هنا
}
}
// إنشاء كائنات من الفئات
$animal = new Animal();
$animal->setName("Generic Animal");
$animal->speak();
$dog = new Dog();
$dog->setName("Rex");
$dog->speak();
?>
شرح الكود:
-
فئة Animal تحتوي على خصائص ودوال لتعيين الاسم وإصدار الصوت.
-
فئة Dog ترث من فئة Animal وتقوم بتعديل دالة
speak()
لتصدر صوت الكلب بدلاً من الصوت العام. -
تم استخدام الكود لإنشاء كائنات من الفئتين واختبار التوريث.
التغليف (Encapsulation):
التغليف هو طريقة إخفاء التفاصيل الداخلية للكود عن المستخدم، عن طريق استخدام المستوى العام public
أو المستوى الخاص private
.
مثال على التغليف
<?php
class BankAccount {
// الخصائص الخاصة
private $balance = 0;
// دالة عامة للإيداع
public function deposit($amount) {
if ($amount > 0) {
$this->balance += $amount;
}
}
// دالة عامة لسحب المال
public function withdraw($amount) {
if ($amount > 0 && $amount <= $this->balance) {
$this->balance -= $amount;
}
}
// دالة عامة لعرض الرصيد
public function getBalance() {
return $this->balance;
}
}
// إنشاء كائن من الفئة
$account = new BankAccount();
$account->deposit(1000);
$account->withdraw(500);
echo "رصيد الحساب: " . $account->getBalance() . " جنيه<br>";
?>
شرح الكود:
-
تم استخدام الخصائص
private
لضمان عدم التلاعب بها من خارج الكائن. -
الدوال
deposit()
وwithdraw()
توفر واجهة للتفاعل مع الرصيد. -
دالة
getBalance()
لعرض الرصيد.
ثانيًا: أنماط التصميم (Design Patterns)
أنماط التصميم هي حلول معتمدة لمشاكل متكررة في البرمجة. سنغطي نمطي Singleton و Factory في هذا الشرح.
1. نمط Singleton:
نمط Singleton يضمن أن هناك كائن واحد فقط من الفئة طوال مدة حياة التطبيق.
مثال على Singleton
<?php
class Singleton {
// خصائص ثابتة لتخزين الكائن
private static $instance;
// جعل المُنشئ private لتجنب إنشاء كائنات أخرى
private function __construct() {}
// دالة لإرجاع الكائن الوحيد
public static function getInstance() {
if (self::$instance == null) {
self::$instance = new Singleton();
}
return self::$instance;
}
public function displayMessage() {
echo "أنا الكائن الوحيد في التطبيق!<br>";
}
}
// استخدام Singleton
$singleton1 = Singleton::getInstance();
$singleton1->displayMessage();
$singleton2 = Singleton::getInstance();
echo $singleton1 === $singleton2 ? "نفس الكائن" : "كائنات مختلفة"; // يطبع "نفس الكائن"
?>
شرح الكود:
-
يتم تخزين الكائن الوحيد في الخاصية الثابتة
private static $instance
. -
يتم منع إنشاء كائنات جديدة باستخدام مُنشئ خاص
private
. -
دالة
getInstance()
تتحقق من وجود الكائن، وإذا لم يكن موجودًا، تنشئه. -
تم اختبار الكود عن طريق إنشاء كائنين ومقارنتهما.
2. نمط Factory:
نمط Factory يُستخدم لإنشاء كائنات بدون الحاجة لمعرفة تفاصيل كيفية إنشائها.
مثال على Factory
<?php
// فئة الأساس
class Animal {
public function speak() {
return "Animal makes a sound";
}
}
// فئة مخصصة للكلب
class Dog extends Animal {
public function speak() {
return "Dog barks";
}
}
// فئة مخصصة للقط
class Cat extends Animal {
public function speak() {
return "Cat meows";
}
}
// مصنع لإنشاء الكائنات
class AnimalFactory {
public static function createAnimal($type) {
if ($type == "dog") {
return new Dog();
} elseif ($type == "cat") {
return new Cat();
} else {
return new Animal();
}
}
}
// استخدام المصنع لإنشاء كائنات
$dog = AnimalFactory::createAnimal("dog");
echo $dog->speak(); // Dog barks
$cat = AnimalFactory::createAnimal("cat");
echo $cat->speak(); // Cat meows
?>
شرح الكود:
-
تم استخدام Factory لإنشاء كائنات من فئات مختلفة بناءً على نوع الحيوان الذي نطلبه.
-
دالة
createAnimal()
في فئة AnimalFactory تقرر الفئة المناسبة لإنشائها بناءً على المدخلات.
ملخص:
-
OOP في PHP تعزز القابلية لإعادة الاستخدام والتنظيم من خلال المفاهيم الأساسية مثل الفئات، الكائنات، التوريث، التغليف، و التعددية الشكلية.
-
أنماط التصميم مثل Singleton و Factory توفر حلولاً مرنة ومتوافقة مع متطلبات التطبيق.
كود متكامل
<?php
// OOP Example: Singleton
class Singleton {
private static $instance;
private function __construct() {}
public static function getInstance() {
if (self::$instance == null) {
self::$instance = new Singleton();
}
return self::$instance;
}
public function displayMessage() {
echo "أنا الكائن الوحيد في التطبيق!<br>";
}
}
// Factory Example
class Animal {
public function speak() {
return "Animal makes a sound";
}
}
class Dog extends Animal {
public function speak() {
return "Dog barks";
}
}
class AnimalFactory {
public static function createAnimal($type) {
if ($type == "dog") {
return new Dog();
}
return new Animal();
}
}
// استخدام Singleton
$singleton = Singleton::getInstance();
$singleton->displayMessage();
// استخدام Factory
$dog = AnimalFactory::createAnimal("dog");
echo $dog->speak(); // Dog barks
?>
💰 هل تبحث عن طريقة سهلة للربح من الإنترنت؟
ابدأ الآن واكسب أموالًا حقيقية من خلال خطوات بسيطة! 🌟
اضغط وابدأ الربح