تسمح لك طرق الوصول الخاصة بـ PHP5 بتقييد الوصول إلى أعضاء الفصل، وهذه ميزة جديدة في PHP5، ولكنها موجودة بالفعل في العديد من اللغات الموجهة للكائنات. مكتبة الفئات الموجهة
مثل C++ وJava، تحتوي PHP على ثلاث طرق وصول: عامة وخاصة ومحمية، بالنسبة لطريقة الوصول لعضو الفصل، يمكن أن تكون إحداها إذا لم تحدد طريقة الوصول، يكون الوصول افتراضيًا الطريقة عامة. يمكنك أيضًا تحديد طريقة وصول للأعضاء الثابتين عن طريق وضع طريقة الوصول قبل الكلمة الأساسية الثابتة (مثل العامة الثابتة)
التي يمكن الوصول إليها دون قيود يمكنك استدعاء أسلوب عام من أي مكان في البرنامج النصي الخاص بك. في الإصدارات السابقة من PHP، كانت جميع الأساليب والخصائص عامة، مما جعل الكائنات تبدو وكأنها مصفوفات منظمة بشكل جيد
ومرئية فقط داخل الفصل خاصية خاصة خارج طريقة الفئة التي توجد بها، وبالمثل، يمكن فقط للطرق الموجودة في نفس الفئة استدعاء طريقة
خاصة يمكن للفئة الوصول إلى الأعضاء الخاصين. انظر المثال 6.8، يقارن الأسلوب يساوي بين عنصرين من عناصر الواجهة. يقارن عامل التشغيل == بين عنصرين من نفس الفئة، ولكن في هذا المثال، يكون لكل مثيل كائن معرف فريد والسعر. لاحظ كيف يصل أسلوب يساوي إلى الخاصية الخاصة لمثيل عنصر واجهة مستخدم
آخر
classWidget
{
اسم خاص $؛
سعر خاص $؛
معرف $ الخاص؛
وظيفة عامة __construct($name, $price)
{
$this->name = $name;
$this->price = floatval($price);
$this->id = uniqid();
}
// يتحقق مما إذا كانت الواجهتان متماثلتين التحقق مما إذا كانت الواجهتان متماثلتين
الوظيفة العامة تساوي ($ القطعة)
{
العودة (($this->name == $widget->name)AND
($هذا->السعر == $القطعة->السعر));
}
}
$w1 = new Widget('Cog', 5.00);
$w2 = new Widget('Cog', 5.00);
7.00
);
إذا($w1->يساوي($w2))
{
print("w1 وw2 متماثلانn");
}
//خطأ شنيع
إذا($w1->يساوي($w3))
{
print("w1 وw3 متماثلانn");
}
//FALSE, == يتضمن المعرف في المقارنة
if($w1 == $w2) // غير متساويين لأن المعرفات مختلفة
{
print("w1 وw2 متماثلانn");
}
?>
إذا كنت جديدًا في البرمجة الشيئية، فربما تتساءل عن الغرض من استخدام الأعضاء الخاصين، وقد تتذكر أفكار التغليف والاقتران، التي ناقشناها في بداية هذا الفصل يمكن إخفاؤها داخل الفصل دون الوصول إليها عن طريق التعليمات البرمجية خارج الفصل، كما أنها تساعد في تحقيق اقتران فضفاض. إذا لم يتمكن الكود الموجود خارج بنية البيانات من الوصول مباشرة إلى الخصائص الداخلية، فلن تكون هناك علاقة
ضمنية لا يزال من الممكن مشاركة الخصائص الخاصة عن طريق التعليمات البرمجية الخارجية، والحل هو استخدام زوج من الطرق العامة، أحدهما هو الحصول على (الحصول على قيمة الخاصية)، والآخر هو تعيين (تعيين قيمة الخاصية، ويقبل المنشئون أيضًا الخصائص). القيمة الأولية يسمح ذلك بالاتصال بين الأعضاء من خلال واجهة ضيقة ومؤهلة جيدًا، وهذا يوفر أيضًا فرصة لتغيير القيمة التي تم تمريرها إلى الطريقة، لاحظ في المثال 6.8 كيف يفرض المُنشئ السعر ليكون رقمًا عائمًا (floadval). )).
يمكن الوصول إلى الأعضاء المحميين من خلال جميع الطرق في نفس الفئة وفي الفئات الموروثة. تنتهك الخصائص العامة روح التغليف لأنها تسمح للفئات الفرعية بالاعتماد على كتابة سمة محددة للطريقة المحمية ولا يجلب هذا القلق يجب أن يكون استخدام الطريقة المحمية واضحًا بشأن بنية فئتها الأصلية.
لاحظ أن Widget لديها الآن طريقة محمية تسمى getName. إذا حاول مثيل Widget استدعاء الطريقة المحمية، فسيحدث خطأ: $w1->getName(. ) ينشئ خطأً، لكن طريقة getName في الفئة الفرعية يمكن أن تستدعي هذه الطريقة المحمية بالطبع، لإثبات أن طريقة Widget::getName محمية، يبدو هذا المثال بسيطًا جدًا في المواقف الفعلية فهم البنية الداخلية للكائن.
<?php
classWidget
{
اسم خاص $؛
سعر خاص $؛
معرف $ الخاص؛
وظيفة عامة __construct($name, $price)
{
$this->name = $name;
$this->price = floatval($price);
$this->id = uniqid();
}
// يتحقق مما إذا كانت الواجهتان متماثلتين
الوظيفة العامة تساوي ($ القطعة)
{
العودة (($this->name == $widget->name)AND
($هذا->السعر == $القطعة->السعر));
}
الدالة المحمية getName()
{
return($this->name);
}
}
شيء الطبقة يمتد القطعة
{
الخاصة $color
($color)
{
$this->color = $color;
}
الوظيفة العامة getColor()
{
return($this->color);
}
الوظيفة العامة getName()
{
return(parent::getName());
}
}
$w1 = new Widget('Cog', 5.00);
$w2 = new Thing('Cog', 5.00);
$w2->setColor('Yellow');
//TRUE (لا يزال!) النتيجة لا تزال صحيحة
إذا($w1->يساوي($w2))
{
print("w1 وw2 متماثلانn");
}
// طباعة إخراج الترس Cog
طباعة($w2->getName());
?>
قد تغير الفئة الفرعية طريقة الوصول إلى الطريقة عن طريق تجاوز طريقة الفئة الأصلية، ومع ذلك، لا تزال هناك بعض القيود إذا قمت بتجاوز عضو فئة عامة، فيجب أن تظل عامة في الفئة الفرعية عضو، يمكن أن يظل محميًا أو يصبح عامًا. لا يزال الأعضاء الخاصون مرئيين فقط في الفصل الحالي. سيؤدي الإعلان عن عضو بنفس اسم العضو الخاص في الفصل الأصلي إلى إنشاء عضو مختلف في الفصل الحالي لا يمكنك تجاوز عضو خاص.
الكلمة الأساسية النهائية هي طريقة أخرى لتقييد الوصول إلى أساليب الأعضاء. لا يمكن للفئة الفرعية تجاوز الطريقة التي تم وضع علامة نهائية عليها في فئة الأصل.