__toString و __debugInfo
جزء من قسم البرمجة كائنية التوجه في رحلة PHP على Coddy. الدرس 45 من 91.
تتيح لك طريقة __toString() تحديد كيفية تمثيل كائن كسلسلة نصية. يتم استدعاء هذه الطريقة تلقائيًا عند استخدام كائن في سياق سلسلة نصية، كما هو الحال مع echo أو تسلسل السلاسل النصية.
<?php
class User {
public function __construct(
private string $name,
private string $email
) {}
public function __toString(): string {
return $this->name . " (" . $this->email . ")";
}
}
$user = new User("Alice", "alice@example.com");
echo $user;
الإخراج:
Alice (alice@example.com)تتحكم الدالة __debugInfo() في المعلومات التي تظهر عند استخدام var_dump() على object. وهذا مفيد لإخفاء البيانات الحساسة أو إظهار القيم المحسوبة أثناء تصحيح الأخطاء:
<?php
class BankAccount {
public function __construct(
private string $accountNumber,
private float $balance,
private string $pin
) {}
public function __debugInfo(): array {
return [
'accountNumber' => '****' . substr($this->accountNumber, -4),
'balance' => $this->balance,
'pin' => '[HIDDEN]'
];
}
}
$account = new BankAccount("1234567890", 1500.00, "9876");
var_dump($account);
الناتج:
object(BankAccount)#1 (3) {
["accountNumber"]=>
string(8) "****7890"
["balance"]=>
float(1500)
["pin"]=>
string(8) "[HIDDEN]"
}لاحظ كيف تُرجع __debugInfo() مصفوفة من أزواج المفتاح والقيمة التي تستبدل تفريغ الخصائص الافتراضي. يتم إخفاء رمز PIN الحساس، ويتم إخفاء جزء من رقم account - وهذا مثالي لتصحيح الأخطاء بشكل آمن.
التحدي
سهللنبنِ نظامًا لإدارة بيانات الاعتماد يوضّح كلًا من طريقتَي السحر __toString() و__debugInfo(). ستنشئ فئة تعرض معلومات سهلة الفهم للمستخدم عند طباعتها، مع حماية البيانات الحساسة أثناء تصحيح الأخطاء.
ستنظّم الشيفرة عبر ملفين:
Credential.php: أنشئ فئةCredentialتخزّن معلومات login بأمان. استخدم ترقية المُنشئ لتعريف الخصائص الخاصة لـ$username(من النوع string)، و$password(من النوع string)، و$lastLogin(من النوع string). نفّذ طريقتين سحريتين:__toString(): تُعيد سلسلة نصية سهلة الفهم:"User: [username] (Last login: [lastLogin])". لاحظ أن password لا يتم كشفه مطلقًا في التمثيل النصي.__debugInfo(): تُعيد array لـvar_dump()تعرض username كما هو، وتحجب password عبر إظهار"[PROTECTED]"فقط، وتعرض تاريخ last login بشكل عادي.
main.php: ضمّن ملف Credential. ستتلقى ثلاث قيم إدخال: اسم username، وpassword، وتاريخ last login. أنشئ كائنًا منCredentialباستخدام هذه القيم. أولًا، اطبع كائن credential مباشرةً باستخدام echo (يؤدي ذلك إلى تشغيل__toString()). ثم في سطر جديد، استخدمvar_dump()على الكائن لرؤية ناتج التصحيح المحمي.
توفّر طريقة __toString() أسلوبًا نظيفًا وآمنًا لعرض credential دون كشف password. وتضمن طريقة __debugInfo() بقاء المعلومات الحساسة مخفية حتى أثناء تصحيح الأخطاء: وهي ممارسة بالغة الأهمية عند العمل مع بيانات المصادقة.
جرّب بنفسك
<?php
require_once 'Credential.php';
// اقرأ المدخلات
$username = trim(fgets(STDIN));
$password = trim(fgets(STDIN));
$lastLogin = trim(fgets(STDIN));
// TODO: أنشئ مثيلاً من Credential بقيم الإدخال
// TODO: اطبع كائن credential (يشغّل __toString())
// TODO: استخدم var_dump() على الكائن لرؤية مخرجات التصحيح المحمية
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات OOP
الملفات الخارجيةمقدمة في OOPClasses مقابل Objectsالكلمة المفتاحية $thisالـ Methodsالـ Propertiesالمنشئ (__construct)الهادم (__destruct)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسيةالكلمة المفتاحية parent::إعادة تعريف الدوال (Method Overriding)الكلمة المفتاحية finalالأصناف المجردة (Abstract Classes)مراجعة - هيكلية الموظفين7التغليف (Encapsulation)
العام، المحمي، الخاص (Public, Protected, Private)نظرة متعمقة على معدلات الوصولدوال Getters و Settersإخفاء المعلوماتميزة Constructor Promotion (8.0)مراجعة - نظام سجلات الطلاب10مفاهيم البرمجة كائنية التوجه المتقدمة
التركيب مقابل الوراثةحقن التبعيةالأصناف المجهولةالتعدادات (PHP 8.1)الألياف (PHP 8.1)تعمق في استنساخ الكائناتالمولدات والمكررات13أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المستودع2مساحات الأسماء والتحميل التلقائي
مقدمة إلى مساحات الأسماءالكلمة المفتاحية useمعيار التحميل التلقائي PSR-4أداة التحميل التلقائي Composerملخص - مشروع منظم5الواجهات والعقود
مقدمة إلى الواجهاتتنفيذ الواجهاتتنفيذ واجهات متعددةالواجهة مقابل الـ Abstract Classالـ Type Hinting مع الواجهاتملخص - حاسبة الأشكال8الميثودات السحرية (Magic Methods)
مقدمة في الميثودات السحرية__toString و __debugInfo__get, __set, __isset, __unset__call و __callStatic__clone واستنساخ الكائنات__serialize و __unserializeمراجعة - Custom Collection3خصائص الكلاس
خصائص الـ Instance مقابل الخصائص الساكنة (Static)الثوابت في الكلاساتالدوال والخصائص الساكنة (Static)الخصائص الخاصة (Private) والمحمية (Protected)خصائص للقراءة فقط (Readonly) في PHP 8.1مراجعة - مدير الحساب البنكي6تعدد الأشكال (Polymorphism)
مراجعة إعادة تعريف الدوال (Method Overriding)تعدد الأشكال عبر الـ Interfacesتلميح النوع (Type Hinting) وأنواع الاتحاد (Union Types)الربط الاستاتيكي المتأخر (Late Static Binding)ملخص - معالج الدفع (Payment Processor)تدرّب بنفسك: مترجم PHP عبر الإنترنت