بالإضافة إلى تقييد الوصول، تحدد طريقة الوصول أيضًا الطريقة التي سيتم استدعاؤها بواسطة الفئة الفرعية أو الخاصية التي سيتم الوصول إليها بواسطة الفئة الفرعية، والعلاقة بين استدعاءات الوظائف والوظيفة نفسها، والعلاقة بين وصول الأعضاء وعناوين الذاكرة المتغيرة. يسمى ملزمة.
هناك نوعان رئيسيان من الربط في لغات الكمبيوتر - الربط الثابت والربط الديناميكي. يحدث الربط الثابت بين هياكل البيانات وهياكل البيانات قبل تنفيذ البرنامج، ويحدث الربط الثابت في وقت الترجمة، وبالتالي لا يمكن الاستفادة من أي معلومات وقت التشغيل. وهو يستهدف استدعاءات الوظائف ونص الوظيفة، أو المتغيرات وكتل الذاكرة. نظرًا لأن PHP لغة ديناميكية، فهي لا تستخدم الارتباط الثابت. ولكن يمكن محاكاة الارتباط الثابت.
يستخدم الربط الديناميكي المعلومات المتوفرة فقط في وقت التشغيل لطلبات الوصول التي تم إنشاؤها أثناء وقت التشغيل. في التعليمات البرمجية الموجهة للكائنات، يعني الارتباط الديناميكي أن القرار بشأن الطريقة التي يتم استدعاؤها أو الخاصية التي سيتم الوصول إليها سوف يعتمد على الفئة نفسها وليس على نطاق الوصول.
تشبه إجراءات الأعضاء العامين والمحميين إجراءات الوظائف في الإصدارات السابقة من PHP، وذلك باستخدام الربط الديناميكي. هذا يعني أنه إذا وصلت إحدى الطرق إلى عضو فئة تم تجاوزه في فئة فرعية وهو مثيل للفئة الفرعية، فسيتم الوصول إلى عضو الفئة الفرعية (بدلاً من الوصول إلى العضو في الفئة الأصلية).
انظر إلى المثال 6.10. يُخرج هذا الكود "مرحبًا! أنا ابن." لأنه عندما تستدعي PHP getSalutation، فهي نسخة من Son، والتي تحل محل التحية في Father تشغيل الطريقة المتجاوزة مشابه جدًا. في Son، تكون المكالمات لتحديد الهوية مرتبطة بهذه الطريقة.
حتى لو تم إضعاف طريقة الوصول من محمية إلى عامة في فئة فرعية، فسيظل الربط الديناميكي يحدث وفقًا لمبدأ استخدام طرق الوصول، فمن المستحيل تعزيز قيود الوصول على أعضاء الفئة، لذلك تغيير طريقة الوصول من عامة إلى عامة. المحمية لا قد تستمر.
القائمة 6.10 فئة الربط الديناميكي للربط الديناميكي
الأب
{
protected $salutation = "مرحبًا!"; // تحياتي
الوظيفة العامة getSalutation()
{
طباعة("$this->salutationn");
$this->identify();
}
تحديد الوظيفة المحمية ()
{
طباعة("أنا الأب.
ن");
}
}؛
فئة الابن تمتد إلى الأب
{
protected $salutation = "مرحبًا!"
;
{
طباعة ("أنا ابن.
ن");
}
};
$obj = new Son();
$obj->getSalutation(); //الإخراج مرحبًا!
?>
//ملاحظة: لم يتم تجاوز getSalutation() في الفئة الفرعية، ولكن لا يزال هناك بالفعل getSalutation() و$salutation() في هذه الفئة
// مرتبط ديناميكيًا بطريقة getSalutation () في مثيل فئة الابن الفرعية، لذلك يتم استدعاء طريقة getSalutation () لمثيل Son،
// سيتم استدعاء تحية العضو وتعريفه () في فئة الابن بدلاً من تحية العضو وتعريفه () في الفئة الأصلية.
الأعضاء الخاصون موجودون فقط داخل الفصل الذي يتواجدون فيه، على عكس الأعضاء العامين والمحميين، PHP يحاكي الربط الثابت، راجع المثال 6.11. إنه يطبع "مرحبًا! أنا أب." على الرغم من أن الفئة الفرعية تقوم بالكتابة فوق قيمة التحية، إلا أن البرنامج النصي يربط هذا->التحية بالفئة الحالية "الأب". وينطبق مبدأ مماثل على الطريقة الخاصة لتحديد ().
قائمة 6.11 فئة الأعضاء الملزمة والخاصة
الأب
{
خاص $salutation = "مرحبًا!";
الوظيفة العامة getSalutation()
{
طباعة("$this->salutationn");
$this->identify();
}
تحديد الوظيفة الخاصة ()
{
طباعة("أنا الأب.
ن");
}
}
فئة الابن تمتد للأب
{
خاص $salutation = "مرحبًا!";
تحديد الوظيفة الخاصة ()
{
طباعة ("أنا ابن.
ن");
}
}
$obj = new Son();
$obj->getSalutation(); //الإخراج مرحباً بك يا أبي!
?>
تتمثل ميزة الارتباط الديناميكي في أنه يسمح للفئات الموروثة بتغيير سلوك الفئة الأصلية مع الحفاظ على واجهة الفئة الأصلية ووظائفها، راجع المثال 6.12 نظرًا لاستخدام الارتباط الديناميكي، تم استدعاء إصدار isAuthorized يمكن تحديد حذف المستخدم حسب نوع الكائن. إذا كان مستخدمًا عاديًا، فسيؤدي استدعاء PHP إلى User::isAuthorized إلى إرجاع FALSE إذا كان مثيلًا لـ AuthorizedUser، فإن استدعاء PHP AuthorizedUser::isAuthorized سيسمح لـdeleteUser بالتنفيذ بسلاسة.
//haohappy ملاحظة: لتوضيح الأمر في جملة واحدة، هذا هو نوع الكائن وطريقة ربط السمة، عند استدعاء طريقة موجودة في كل من الفئة الأصلية والفئة الفرعية أو الوصول إلى إحدى السمات، ستحدد أولاً نوع الكائن. ينتمي المثيل إلى، ثم يستدعي الأساليب والخصائص في الفئة المقابلة
قائمة 6.12 فوائد
فئة الربط الديناميكي User //User
{
الوظيفة المحمية هيAuthorized() // سواء كان مستخدمًا تمت مصادقته
{
إرجاع (خطأ) ؛
}
public function getName() // احصل على الاسم
{
return($this->name);
}
الوظيفة العامةdeleteUser($username) //حذف المستخدم
{
إذا(!$this->isAuthorized())
{
طباعة ("أنت غير مصرح لك.
ن");
إرجاع (خطأ) ؛
}
// احذف المستخدم
طباعة ("تم حذف المستخدم.
ن")؛
}
}
فئة AuthorizedUser تمتد المستخدم //Authentication user
{
الوظيفة المحمية هيAuthorized () // الكتابة فوق isAuthorized ()
{
return(TRUE);
}
}
$user = مستخدم جديد;
$admin = new AuthorizedUser;
// غير مصرح به
$user->deleteUser("Zeev");
//مصرح به
$admin->deleteUser("Zeev");
>
لماذا يحاكي أعضاء الفصل الخاص الارتباط الثابت؟ للإجابة على هذا السؤال، عليك أن تتذكر لماذا تحتاج إلى أن يكون لديك أعضاء خاصون، متى يكون من المنطقي استخدامهم بدلاً من الأعضاء المحميين
فقط إذا كنت لا تريد ذلك
؟الفئات الفرعية المراد توريثها تُستخدم فقط عند تغيير سلوك فئة أصل أو تخصيصه، وهذا أقل شيوعًا مما قد تعتقد، بشكل عام، يجب أن يسمح التسلسل الهرمي الجيد للكائنات بتخصيص معظم الوظائف أو تحسينها أو تغييرها بواسطة الفئات الفرعية - وهذا أحدها. من أسس البرمجة الشيئية. هناك حاجة إلى أساليب أو متغيرات خاصة في مواقف معينة، مثل عندما تكون متأكدًا من أنك لا تريد السماح لفئة فرعية بتغيير جزء معين من الفئة الأصلية.