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