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