المفاهيم المتقدمة في البرمجة الكائنية في PHP: التعدد الشكلي والتغليف
تاريخ النشر:
مقدمة
في المقالة السابقة، استعرضنا أساسيات البرمجة الكائنية (OOP) في PHP مثل الكائنات، الصفوف، الوراثة، والتجريد. في هذه المقالة، سنتعمق أكثر في المفاهيم المتقدمة في OOP، بما في ذلك التعدد الشكلي (Polymorphism) والتغليف (Encapsulation).
التعدد الشكلي (Polymorphism)
التعدد الشكلي هو مفهوم يسمح للدوال بالتصرف بطرق مختلفة بناءً على الكائن الذي تستدعى عليه. يمكن تحقيق التعدد الشكلي من خلال الوراثة والتجريد. إليك مثال على ذلك:
<?php
interface Shape {
public function area();
}
class Circle implements Shape {
private $radius;
public function __construct($radius) {
$this->radius = $radius;
}
public function area() {
return pi() * pow($this->radius, 2);
}
}
class Rectangle implements Shape {
private $width;
private $height;
public function __construct($width, $height) {
$this->width = $width;
$this->height = $height;
}
public function area() {
return $this->width * $this->height;
}
}
function printArea(Shape $shape) {
echo "Area: " . $shape->area() . "\n";
}
$circle = new Circle(5);
$rectangle = new Rectangle(4, 6);
printArea($circle); // يعرض: Area: 78.539816339745
printArea($rectangle); // يعرض: Area: 24
?>
في هذا المثال، لدينا واجهة Shape
مع دالة area
. كلا الصفين Circle
وRectangle
يطبقان هذه الواجهة، وكل منهما لديه طريقته الخاصة لحساب المساحة. الدالة printArea
تأخذ كائنًا من نوع Shape
وتستدعي دالة area
، مما يوضح التعدد الشكلي.
التغليف (Encapsulation)
التغليف هو مفهوم يخفي تفاصيل التنفيذ الداخلية للصف عن المستخدمين، مما يسمح بالتحكم في كيفية الوصول إلى البيانات وتعديلها. يتم تحقيق التغليف باستخدام محددات الوصول مثل private
، protected
، وpublic
. إليك مثال:
<?php
class BankAccount {
private $balance;
public function __construct($initialBalance) {
$this->balance = $initialBalance;
}
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(100);
$account->deposit(50);
$account->withdraw(30);
echo "Balance: " . $account->getBalance(); // يعرض: Balance: 120
?>
في هذا المثال، يتم تحديد خاصية $balance
كمحدد الوصول private
، مما يعني أنه لا يمكن الوصول إليها مباشرة من خارج الصف. يتم تعديل $balance
من خلال الدوال deposit
وwithdraw
، ويتم عرض قيمتها باستخدام الدالة getBalance
. هذا يضمن أن الرصيد لا يمكن تعديله إلا من خلال العمليات المحددة.