ما فائدة إستخدام Private في متغيرات الكلاس؟

السلام عليكم :)

لنفرض أن لدي كلاس يقوم بإضافة طالب جديد إلى قاعدة البيانات .. على سبيل المثال بلغة البي اتش بي:

<?php
class Student
{
    private $name;

public function registerStudent($name)
{
    // add local variable 'name' to database.
}
}
?>

الكود الثاني:

<?php
class Student
{
private $name;

 public function registerStudent($name)
{
    $name = $this->name;
    // add local variable 'name' to database.
}
}
?>

سؤالي ما الفرق بين المثالين؟ هل هناك فرق؟ اذا لم يكن هناك فرق فما فائدة private $name;

شكراً جزيلاً

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

16

دعك الآن من مثالك.

في البرمجة بنمط OOP ننظر دائما الى "كائنات" وعلاقات بينها. الكائن يتكون من مجموعة من المتغيرات Member Variable والتي تمثل حالة الكائن، ودوال Functions/Methods تسهل عملية الوصول الى هذه المتغيرات.

أحد مفاهيم OOP هو الكبسلة Encapsulation وهو يحتمل مفهومين، ما يهمنا هو أحدهم وهو إخفاء حالة الكائن (المتغيرات الداخلية) عن مستخدم الفئة.

لماذا؟ لان الوصول المباشر الى المتغير يسبب عدة مشاكل منها إرتباطات كثيرة وصعوبة في حماية المتغير من أي قيم.

في مثالك أعلاه ، لو قمنا بجعل المتغير $name كـ public ، فإن ذلك يعني أن مستخدم الفئة بمجرد إنشاء كائن منها فإنه يستطيع التعديل المباشر على القيمة.

لاحقا، لو طلب منك إجراء Validation أو تحقق على الأسماء ، ومنع تسجيل الأسماء التي تبدأ بأرقام ، فإنك ستضطر الى البحث في مشروعك بالكامل عن أي عملية إنشاء كائن من هذا النوع وفيها تسجيل الإسم ، ومن ثم ستلجأ الى طريقة لكي تتأكد من هذا الشرط الجديد.

لكنك لو استخدمت مبادئ ال OOP وقمت بجعل المتغير private ووفرت لمستخدم الفئة method كما في مثالك، فإنه بكل تأكيد يمكنك إنشاء التحقق Validation في مكان واحد فقط.

أيضا المشكلة الأخرى في حالة استخدامك للمتغير كـ public ، في حالة تم توسعة المشروع ، وكانت هناك حوجة الى تغيير $name الى object من أي نوع، فإنك ستواجه نفس المشكلة أعلاه ، بسبب علاقة الإرتباط القوية.

أتمنى أن يكون الفرق بين public/private قد اتضح.

ولإختصار ما سبق : نستخدم private لإخفاء حالة الكائن/الفئة عن مستخدمها، وهذا أحد مفاهيم OOP.

نعود الآن الى مثالك، أولا يجب أن تعرف أن هناك عدة أنواع من الكائنات المتعارف عليها. مثلا هناك كائنات تمثل مصطلح أو مفهوم واقعي، هناك كائنات تحمل قيم فقط، هناك كائنات تستخدم للوصول الى قاعدة بيانات، وهكذا.

في مثالك السابق، لا حاجة الى انشاء المتغير $name اذا كانت الفئة تستخدم فقط كفئة مساعدة للتعامل مع قاعدة بيانات، أيضا ربما لن تحتاج الى إنشاء كائن منها ويكفي أن تجعل جميع الدوال فيها static.

أما أن أردت أن تستخدم الفئة لكي تحمل معلومات الطالب، وكذلك لتوفير دوال للوصول الى قاعدة البيانات، فإن هذا الكائن هو مشابه لأحد الأنماط المعروفة وهي Active Record. وفيها تمثل حقول قاعدة البيانات كمتغيرات في الفئة ويتم توفير الدوال الأساسية CRUD. وفي هذه الحالة ستحتاج الى المتغيرات كـ private وكذلك توفير setter/getter للوصول اليها

اشكرك جزيل الشكر واتضح لي الفرق الان.

14

الكلاس الأول فقط عرفت متغير خاص ولم تعطيه اي قيمة

الكلاس الثاني مبدئيا هو خطأ لانه من المعمول به هو اعطاء المتغير $this->name قيمة $name لكي يتم استخدامه في كامل الكلاس والكلاسات المشتقة

بمعنى يكون هكذا $this->name=$name; (انسخ الكود لتراه بشكل صحيح)

طيب لماذا نستخدم private الجواب بسيط وهو عدم اعطاء اي قيمة للمتغير من خارج الكلاس لاسباب مختلفة واعطيك مثال بسيط

لنفرض انك تريد ان يكون المتغير عبارة عن نص ولهذا انت تقوم معالجة القيمة قبل تخزينها في المتغير $this->name اما اذا اعطيهpublic فانه يمكن لاي احد ان يقوم ياعطاءه قيمة من خارج الكلاس

راجع دروس oop

صحيح كلامك بالنسبة للتصحيح وأخطأت في كتابة الكود. الحقيقة لم أفهم المثال لو تقدر تعيده بصيغة أخرى أكون لك من الشاكرين.

اعتقد انك فهمت من خلال ردود الاخوة.. صحيح ؟

صحيح اشكركم جميعاً على ردودكم المفيدة

14

الأصل في إستعمل private و public هو التحكم في إمكانية تغيير المتغيرات من خارج الكلاس

مثال لإستعمال متغير private و اخر public

<?php
class Student
    {
        private $name;

    public function registerStudent($name)
    {
        // add local variable 'name' to database.
    }
}
$s1 = new Student();
echo $s1->name; //خطأ
?>

/**********************************************************************/

<?php
class Student
    {
        public $name;

    public function registerStudent($name)
    {
        // add local variable 'name' to database.
    }
}
$s1 = new Student();
echo $s1->name; //صحيح
?>

الأفضل أن تدرس طريقة البرمجة بنمط oop لتفهم أكثر

جميل جداً لكن ما فائدة البرايفت؟ هل ممكن مثال معين استطيع فهم الفرق بينهم بالمنطق وليس بالكود؟ شكراً