Traits in PHP
Traits in PHP
قائمة المصطلحات والتعريفات:
المقدمة:
في البرمجة الكائنية في PHP، تعد السمات أداة قوية لتحسين إعادة استخدام الكود وتقليل التكرار. تساعد أيضا على مشاركة الدالة والخصائص بين الفئات المختلفة دون الحاجة إلى الوراثة المتعددة
تهدف هذه الوثيقة إلى شرح مفهوم السمات (Traits) في لغة PHP، وتوضيح كيفية استخدامها لتحسين تصميم التطبيقات البرمجية وجعلها أكثر تنظيما وقابلة لإعادة الاستخدام.
ما هي السمات (Traits)؟
تسمح لنا بإضافة طرق وخصائص إلى الفئات بدون استخدام الوراثة. يمكن استخدام السمات لتعريف طرق يتم مشاركتها عبر فئات متعددة، مما يساعدنا في تقليل تكرار الكود.
كيفية استخدام السمات في PHP
يتم تعريف السمة باستخدام الكلمة المحجوزة trait. الفئة التي ترغب في استخدام السمة تقوم باستيرادها باستخدام الكلمة المحجوزة use.
<?php
trait Logger {
public function log($message) {
echo "[LOG]: " . $message;
}
}
class User {
use Logger;
public function createUser($name) {
$this->log("Creating user: " . $name);
}
}
$user = new User();
$user->createUser("Muhmad"); // [LOG]: Creating user: Muhmad
?>
السمات والوراثة المتعددة:
على الرغم من أن PHP لا تدعم الوراثة المتعددة بشكل مباشر، إلا أن السمات توفر حلا بديلا لهذه المشكلة. يمكن للفئة أن تستورد سمات متعددة، مما يتيح لها استخدام وظائف متنوعة من مصادر مختلفة.
<?php
trait Logger {
public function log($message) {
echo "[LOG]: " . $message;
}
}
trait Notifier {
public function notify($message) {
echo "[NOTIFY]: " . $message;
}
}
class User {
use Logger, Notifier;
public function createUser($name) {
$this->log("Creating user: " . $name);
$this->notify("User created: " . $name);
}
}
$user = new User();
$user->createUser("Muhmad");
// [LOG]: Creating user: Muhmad
// [NOTIFY]: User created: Muhmad
?>
معالجة تعارضات الأسماء في السمات
في حالة وجود تعارض أسماء بين طرق السمات المختلفة، يمكن حل التعارض باستخدام الكلمة المحجوزة insteadof لتحديد أي الدالة سيتم استخدامها، وas لإعادة تسمية الدالة.
<?php
trait Logger {
public function log($message) {
echo "[LOG]: " . $message;
}
}
trait Debugger {
public function log($message) {
echo "[DEBUG]: " . $message;
}
}
class User {
use Logger, Debugger {
Logger::log insteadof Debugger;
Debugger::log as debugLog;
}
public function createUser($name) {
$this->log("Creating user: " . $name);
$this->debugLog("Debugging user creation.");
}
}
$user = new User();
$user->createUser("Muhmad");
// [LOG]: Creating user: Muhmad
// [DEBUG]: Debugging user creation.
?>
أمثلة
نظام تسجيل الدخول
<?php
trait Authenticator {
public function authenticate($username, $password) {
echo "Authenticating user: " . $username;
}
}
class User {
use Authenticator;
public function login($username, $password) {
$this->authenticate($username, $password);
}
}
$user = new User();
$user->login("Muhmad-Omar", "password123_R"); // Authenticating user: Muhmad-Omar
?>
ليست هناك تعليقات: