مقدمة إلى البرمجة الموجهة للكائنات
البرمجة الموجهة للكائنات (OOP) هي نموذج برمجة ينظم الكود حول الكائنات بدلاً من الدوال والمنطق. تساعدك على كتابة كود أكثر قابلية للصيانة وإعادة الاستخدام والتوسع.
المفاهيم الأساسية للـ OOP:
- الصنف (Class): مخطط أو قالب لإنشاء الكائنات
- الكائن (Object): مثيل من صنف بقيم محددة
- الخاصية (Property): متغيرات تنتمي إلى صنف
- الدالة (Method): وظائف تنتمي إلى صنف
إنشاء أول صنف لك
يتم تعريف الصنف باستخدام الكلمة المفتاحية class. لننشئ صنف مستخدم بسيط:
<?php
class User {
// الخصائص (السمات)
public $name;
public $email;
public $age;
// الدالة
public function introduce() {
return "مرحباً، أنا " . $this->name . " وعمري " . $this->age . " سنة.";
}
public function isAdult() {
return $this->age >= 18;
}
}
?>
نصيحة: الكلمة المفتاحية $this تشير إلى مثيل الكائن الحالي. استخدمها للوصول إلى الخصائص والدوال داخل الصنف.
إنشاء الكائنات (Instantiation)
بمجرد أن يكون لديك صنف، يمكنك إنشاء كائنات منه باستخدام الكلمة المفتاحية new:
<?php
// إنشاء كائن User جديد
$user1 = new User();
$user1->name = "أحمد";
$user1->email = "ahmed@example.com";
$user1->age = 25;
echo $user1->introduce(); // النتيجة: مرحباً، أنا أحمد وعمري 25 سنة.
echo $user1->isAdult() ? "بالغ" : "قاصر"; // النتيجة: بالغ
// إنشاء كائن User آخر
$user2 = new User();
$user2->name = "سارة";
$user2->email = "sara@example.com";
$user2->age = 16;
echo $user2->introduce(); // النتيجة: مرحباً، أنا سارة وعمري 16 سنة.
?>
دالة البناء (Constructor)
البناء هو دالة خاصة تعمل تلقائياً عند إنشاء كائن. إنها مثالية لتهيئة الخصائص:
<?php
class User {
public $name;
public $email;
public $age;
// البناء
public function __construct($name, $email, $age) {
$this->name = $name;
$this->email = $email;
$this->age = $age;
}
public function introduce() {
return "مرحباً، أنا {$this->name} وعمري {$this->age} سنة.";
}
}
// الآن يمكننا إنشاء كائنات في سطر واحد
$user1 = new User("أحمد", "ahmed@example.com", 25);
$user2 = new User("سارة", "sara@example.com", 16);
echo $user1->introduce();
?>
تسمية البناء: في PHP، يتم تسمية البناء __construct() (مع شرطتين سفليتين). يسمى هذا "دالة سحرية."
مثال عملي: صنف المنتج
لننشئ مثالاً أكثر عملية لنظام تجارة إلكترونية:
<?php
class Product {
public $name;
public $price;
public $quantity;
public $category;
public function __construct($name, $price, $quantity, $category) {
$this->name = $name;
$this->price = $price;
$this->quantity = $quantity;
$this->category = $category;
}
// حساب القيمة الإجمالية
public function getTotalValue() {
return $this->price * $this->quantity;
}
// التحقق من التوفر
public function isInStock() {
return $this->quantity > 0;
}
// تطبيق خصم
public function applyDiscount($percentage) {
$discount = $this->price * ($percentage / 100);
$this->price -= $discount;
return "تم تطبيق خصم {$percentage}%. السعر الجديد: $" . $this->price;
}
// عرض معلومات المنتج
public function displayInfo() {
$status = $this->isInStock() ? "متوفر" : "غير متوفر";
return "
<div class='product'>
<h3>{$this->name}</h3>
<p>السعر: \${$this->price}</p>
<p>الكمية: {$this->quantity}</p>
<p>الفئة: {$this->category}</p>
<p>الحالة: {$status}</p>
<p>القيمة الإجمالية: \$" . $this->getTotalValue() . "</p>
</div>
";
}
}
// إنشاء المنتجات
$laptop = new Product("Dell XPS 13", 999, 5, "إلكترونيات");
$book = new Product("برمجة PHP", 29.99, 0, "كتب");
echo $laptop->displayInfo();
echo $laptop->applyDiscount(10); // خصم 10%
echo $book->displayInfo();
?>
شرح الكلمة المفتاحية $this
الكلمة المفتاحية $this أساسية في OOP. تشير إلى الكائن الحالي:
<?php
class Counter {
public $count = 0;
public function increment() {
$this->count++; // الوصول إلى خاصية الكائن الحالي
return $this->count;
}
public function decrement() {
$this->count--;
return $this->count;
}
public function reset() {
$this->count = 0;
return $this; // إرجاع الكائن الحالي للربط المتسلسل
}
}
$counter1 = new Counter();
$counter2 = new Counter();
$counter1->increment(); // $counter1->count = 1
$counter1->increment(); // $counter1->count = 2
$counter2->increment(); // $counter2->count = 1
echo $counter1->count; // النتيجة: 2
echo $counter2->count; // النتيجة: 1
?>
الربط المتسلسل: بإرجاع $this من دالة، يمكنك ربط استدعاءات دوال متعددة: $obj->method1()->method2()->method3()
تصريحات الأنواع (Type Hints)
تسمح لك PHP بتحديد أنواع البيانات للمعاملات والقيم المرجعة:
<?php
class Calculator {
// تلميحات النوع للمعاملات والقيمة المرجعة
public function add(int $a, int $b): int {
return $a + $b;
}
public function divide(float $a, float $b): float {
if ($b == 0) {
throw new Exception("القسمة على صفر");
}
return $a / $b;
}
public function multiply(int|float $a, int|float $b): int|float {
return $a * $b; // أنواع الاتحاد PHP 8+
}
}
$calc = new Calculator();
echo $calc->add(5, 3); // النتيجة: 8
echo $calc->divide(10.5, 2); // النتيجة: 5.25
echo $calc->multiply(4, 2.5); // النتيجة: 10
?>
التحقق من نوع الكائن
يمكنك التحقق مما إذا كان الكائن مثيلاً لصنف:
<?php
class User {
public $name;
}
class Product {
public $name;
}
$user = new User();
$product = new Product();
// التحقق من نوع الكائن
if ($user instanceof User) {
echo "هذا كائن User";
}
if ($product instanceof Product) {
echo "هذا كائن Product";
}
// الحصول على اسم الصنف
echo get_class($user); // النتيجة: User
?>
تمرين:
أنشئ صنف BankAccount مع الميزات التالية:
- خصائص:
accountNumber, accountHolder, balance
- بناء يهيئ جميع الخصائص (الرصيد الافتراضي 0)
- دالة
deposit($amount) تضيف إلى الرصيد
- دالة
withdraw($amount) تطرح من الرصيد (تحقق من كفاية الأموال)
- دالة
getBalance() تُرجع الرصيد الحالي
- دالة
displayStatement() تعرض معلومات الحساب
أنشئ حسابين واختبر جميع الدوال.
أفضل الممارسات
- التسمية: استخدم PascalCase لأسماء الأصناف (UserProfile, ProductManager)
- المسؤولية الواحدة: يجب أن يكون لكل صنف غرض واحد واضح
- أسماء ذات معنى: استخدم أسماء وصفية للخصائص والدوال
- الاتساق: اتبع اصطلاحات تسمية وبرمجة متسقة
- التوثيق: أضف تعليقات لشرح المنطق المعقد
الأخطاء الشائعة التي يجب تجنبها
احذر من هذه الأخطاء الشائعة:
- نسيان $this: استخدم دائماً
$this-> للوصول إلى الخصائص/الدوال
- نسيان كلمة new: يجب استخدام
new لإنشاء الكائنات
- عامل السهم الخاطئ: استخدم
-> للكائنات، وليس ::
- خصائص غير معرفة: هيئ الخصائص قبل استخدامها
الملخص
في هذا الدرس، تعلمت:
- ما هي الأصناف والكائنات في PHP
- كيفية إنشاء أصناف بخصائص ودوال
- كيفية إنشاء كائنات باستخدام الكلمة المفتاحية
new
- كيفية استخدام البناء لتهيئة الكائنات
- كيفية استخدام الكلمة المفتاحية
$this
- تصريحات الأنواع لمزيد من أمان الكود
- أفضل الممارسات لـ PHP الموجهة للكائنات
بعد ذلك، سنتعلم عن معدلات الوصول والتغليف لجعل كودنا أكثر أماناً وقابلية للصيانة!