__toString و __debugInfo
جزء من قسم Object Oriented Programming في رحلة 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() على كائن ما. هذا مفيد لإخفاء البيانات الحساسة أو إظهار القيم المحسوبة أثناء تصحيح الأخطاء:
<?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 الحساس، ويتم قناع رقم الحساب جزئيًا - وهو أمر مثالي لتصحيح الأخطاء بشكل آمن.
التحدي
سهلدعونا نبني نظاماً لإدارة بيانات الاعتماد يوضح كلاً من الطرق السحرية (magic methods) __toString() و __debugInfo(). ستقوم بإنشاء فئة (class) تعرض معلومات سهلة القراءة للمستخدم عند طباعتها، مع حماية البيانات الحساسة أثناء عملية التصحيح (debugging).
ستقوم بتنظيم الكود الخاص بك عبر ملفين:
Credential.php— أنشئ فئةCredentialتقوم بتخزين معلومات تسجيل الدخول بشكل آمن. استخدم خاصية constructor promotion لتعريف خصائص خاصة (private properties) لكل من$username(سلسلة نصية)، و$password(سلسلة نصية)، و$lastLogin(سلسلة نصية). قم بتنفيذ طريقتين سحريتين:__toString()— تعيد سلسلة نصية سهلة القراءة:"User: [username] (Last login: [lastLogin])". لاحظ أن كلمة المرور لا يتم كشفها أبداً في التمثيل النصي.__debugInfo()— تعيد مصفوفة لـvar_dump()تعرض اسم المستخدم كما هو، وتخفي كلمة المرور بإظهار"[PROTECTED]"فقط، وتعرض تاريخ آخر تسجيل دخول بشكل طبيعي.
main.php— قم بتضمين ملف Credential. ستتلقى ثلاثة مدخلات: اسم المستخدم، وكلمة المرور، وتاريخ آخر تسجيل دخول. أنشئ كائناً (instance) منCredentialبهذه القيم. أولاً، قم بعمل echo لكائن credential مباشرة (هذا سيؤدي لاستدعاء__toString()). ثم في سطر جديد، استخدمvar_dump()على الكائن لرؤية مخرجات التصحيح المحمية.
توفر طريقة __toString() وسيلة نظيفة وآمنة لعرض بيانات الاعتماد دون كشف كلمة المرور. وتضمن طريقة __debugInfo() أنه حتى أثناء عملية التصحيح، تظل المعلومات الحساسة مخفية — وهي ممارسة بالغة الأهمية عند التعامل مع بيانات المصادقة.
ورقة مرجعية
تحدد الطريقة __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() على كائن ما. وهي تعيد مصفوفة من أزواج المفتاح والقيمة لعرضها:
<?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);
// يعرض رقم الحساب المقنع والرمز السري المخفي
هذه الطرق مفيدة لإخفاء البيانات الحساسة أو تخصيص مخرجات الكائن لسياقات مختلفة.
جرّب بنفسك
<?php
require_once 'Credential.php';
// قراءة المدخلات
$username = trim(fgets(STDIN));
$password = trim(fgets(STDIN));
$lastLogin = trim(fgets(STDIN));
// TODO: إنشاء كائن (instance) من Credential باستخدام قيم المدخلات
// TODO: طباعة كائن الاعتماد (يستدعي __toString())
// TODO: استخدم var_dump() على الكائن لرؤية مخرجات التصحيح المحمية
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
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)