النتائج 1 إلى 8 من 8

الموضوع: سؤال بتوريث كلاس

  1. #1
    عضو نشيط جدا
    تاريخ التسجيل
    Jan 2008
    المشاركات
    450

    سؤال بتوريث كلاس



    السلام علكيم
    لدى كلاس للتعامل مع قواعد البيانات , الـ __construct الخاص به يتلقى مصفوفة بمعلومات الإتصال بقاعدة البيانات ومن داخله يقوم بالإتصال وينشئ متغير بالـ Connection لإستخدامه مع باقى الدوال بالكلاس .
    انشأت كلاس اخر يرث من الأول وعندما استخدمت دالة به لم يفلح الأمر .
    كود PHP:
    class mysql{
        public 
    $connection;
        function 
    __construct($config){
            
    $this->connection mysql_connect($config['host'], $config['user'], $config['pass']);
            
    mysql_select_db($this->connection$config['db']);
        }
        function 
    query($q){
            
    mysql_query($q$this->connection);
        }
    }
    class 
    data extends mysql{
        function 
    __construct($config){
            
    parent::__construct($config)
        }
        function 
    get($q){
            
    $this->query($q);
        }
    }
    $db = new mysql($config);
    $data = new data($config); 
    كيف استطيع ان اورث الـ $connection للكلاس الثانى دون ان اتصل مرة اخرى ( استخدم الـ Construct الأول ) , اقصد دون إستخدام التالى :
    كود PHP:
            parent::__construct($config








  2. #2
    عضو فعال
    تاريخ التسجيل
    Jun 2008
    المشاركات
    1,600


    تستطيع ان تحفظ متغير الاتصال في متغير في الكلاس الاب على شكل protected ثم تعيد استخدامه متى شئت
    وهذا ما فعلته انت ولكنك لم تستخدم المتغير في البناء (constructor)

    هل لك ان توضح الهدف من هذه الكلاسات لإنني لم افهم بعد ما الهدف من الكلاس data اذ انني توقعت العكس
    أي ان mysql ترث من data






  3. #3
    عضو نشيط جدا
    تاريخ التسجيل
    Jan 2008
    المشاركات
    512


    اذا صح فهمي للسؤال فيمكنك اضافة شرط لينشيء الاتصال اذا لم يكن موجود
    كود PHP:
    if($this->connection !== null){
        
    parent::__construct();







    __________________
    محمد حمود.

  4. #4
    عضو نشيط جدا
    تاريخ التسجيل
    Jan 2008
    المشاركات
    450


    تستطيع ان تحفظ متغير الاتصال في متغير في الكلاس الاب على شكل protected ثم تعيد استخدامه متى شئت
    وهذا ما فعلته انت ولكنك لم تستخدم المتغير في البناء (constructor)

    هل لك ان توضح الهدف من هذه الكلاسات لإنني لم افهم بعد ما الهدف من الكلاس data اذ انني توقعت العكس
    أي ان mysql ترث من data
    جربت ولم يفلح الأمر ..
    الكلاس الأول مسؤل عن الإتصال وإجراء الإستعلامات ( به حوالى 30 دالة اخرى ) , الكلاس الأخر مسؤل عن التعامل مع هذه الدوال وجلب المعلومات بشكل معين اريده .

    الحل الوحيد الذى فلح معى هو الموضح بالأعلى ( الإتصال مرة اخرى ... للحصول على الـ Connection للكلاس الأخر .. ) , الموضوع ببساطة انى لا استطيع توريث هذا المتغير للكلاس الثانى . !!

    مشكورين






  5. #5
    عضو نشيط جدا
    تاريخ التسجيل
    Jan 2008
    المشاركات
    450


    اذا صح فهمي للسؤال فيمكنك اضافة شرط لينشيء الاتصال اذا لم يكن موجود
    كود PHP:
    if($this->connection !== null){
        
    parent::__construct();

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






  6. #6
    عضو نشيط جدا
    تاريخ التسجيل
    Jan 2008
    المشاركات
    512


    عزيزي، طالما تم التوريث فالمتغير connection يمكن استخدامه كأي متغير local في كلاس data بدون الحاجة لتعريفه من جديد

    كود PHP:
    class a{
        public 
    $data;
        
        function 
    __construct(){
            
    $this->data 'aaa';
        }
        
    }

    class 
    extends a{
        
        function 
    __construct(){
            
    $this->data 'bbb';
            echo 
    $this->data// bbb
            
            
    parent::__construct();
            echo 
    $this->data// aaa
        
    }
        
    }

    $data = new b(); 
    و يمكنك وضع الشرط في data ليطلب دالة الconstructior في حالة عدم طلبها مسبقا.

    --------

    اما اذا كنت تقصد تعريف متغيرين بنفس الاسم في كل كلاس مع المحافظة على محتوياتهم فيمكنك عملهم private
    و في هذه الحالة كل كلاس سيكون لها متغير اتصال خاص بها. و يتم التعامل معه ب $this->connection





    التعديل الأخير تم بواسطة mr_m ; 02-12-2009 الساعة 04:34 PM
    __________________
    محمد حمود.

  7. #7
    عضو فعال
    تاريخ التسجيل
    Jun 2008
    المشاركات
    1,600


    لكي لا تقوم بالاتصال مرتين عرف الكائن الابن فقط ولا تعرف الكائن الاب لأن ذلك بدون اي فائدة فالكائن الابن يرث دوال الأب.

    ما قاله الاخ mr_m صحيح ولكن المشكلة عندك في الدالة mysql_select_db فأنت لم تعطها البارمترات الصحيحة لذلك لم تعمل جيدًا

    جرب الكود في الاسفل ترى كيف انك تستطيع توريث المتغير test
    وقعت هنا في خطأ امني على ما اظن فلا يجب عليك تعريف متغيرات public وانما protected وذلك لأن اي شخص ممكن ان يعمل include للكلاس ويصل إلى متغير الاتصال بقاعدة البيانات ثم يقوم بارسال الاستعلامات التي يريد وبالتالي اختراق الموقع.
    لتجاوز هذا الامر هناك عدة امور يجب عملهما:
    1- عمل الكلاس كله برايفت لكلاس العرض inner class
    2-اذا كنت تريد عرض المعلومات فقط يمكنك انشاء مستخدم له صلاحيات ال select فقط وانشاء مستخدم آخر لاضافة البيانات
    3- منع الملف من ان يتم تضمينه على يد سكربتات خارجية
    4- وضع طبقة حماية في الدالة query اي ان تمنع عرض البيانات من جداول معينة عن طريق فحص اسم الجدول الذي يتم عليه الاستعلام.

    تصحيح الكود
    لائم اسم القاعدة والجداول والحقول حسب احتياجاتك

    كود PHP:
    <?php
    class mysql{
        protected 
    $connection;
        protected 
    $test;
        function 
    __construct($config){
            
    $this->connection mysql_connect($config['host'], $config['user'], $config['pass']);
            
    mysql_select_db$config['db']);
            
    $this->test "aaa";
        }
        function 
    query($q){
            return  
    mysql_query($q$this->connection);
            
        }
    }
    class 
    data extends mysql{
        function 
    __construct($config){
            
    parent::__construct($config);
        }
        function 
    get($q){
           
    $query $this->query($q);
           while (
    $row mysql_fetch_array($query))
            echo 
    $row['id'];
            echo 
    $this->test;
        }
    }
    $config = Array(
    "host"=>"localhost",
    "user"=>"root",
    "pass"=>"",
    "db"=>"auth"
    );

    $data = new data($config);  
    $data->get("select * from auth");
    ?>






    التعديل الأخير تم بواسطة ahmad sadiq ; 03-12-2009 الساعة 01:31 AM

  8. #8
    عضو نشيط جدا
    تاريخ التسجيل
    Jan 2008
    المشاركات
    450


    مشكورين والله ,تمت










ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  

أضف موقعك هنا| اخبار السيارات | حراج | شقق للايجار في الكويت | بيوت للبيع في الكويت | دليل الكويت العقاري | مقروء | شركة كشف تسربات المياه | شركة عزل اسطح بالرياض | عزل فوم بالرياض| عزل اسطح بالرياض | كشف تسربات المياة بالرياض | شركة عزل اسطح بالرياض