-1

طريقة استخدام كائن من كلاس داخل دالة داخل كلاس؟

السلام عليكم ورحمة الله وبركاته

انا بستخدم SQLite3 بقوم بانشاء كائن منها يحمل العنوان بتاع ملف قاعدة البيانات عندما استخدمه داخل دالة لا يعمل

وقومت باستخدام Global معه ايضاً لكن فى وجود كود عادى ليس كلاس او دالة يعمل طبيعى

  • ما هى طرق استخدام كائن داخل كلاس او دالة

  • قومت بعمل كلاس فى ملف اخر وتوريثه الى الملف المراد استخدام فيه sqlite ولكن لا يرى الدوال الداخلية له

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

التعليقات

  • أولاً لم تحدد اللغة التي تستخدمها للتعامل مع SQLite ؟ ولكن طالما ذكرت Global في تعريف مدى المتغير فنحن مع PHP

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

  • لا حاجة لك في إستخدام Global داخل الفئة -class- تستطيع الوصول لخصائص الفئة من خلال الكلمة المحجوزة <-this$ ثم اسم الخاصية -متغيرات الفئة- بدون العلامة $ داخل أي مكان ضمن الفئة.

  • مثال لإنشاء فئة بسيطة للتعامل مع قواعد البيانات SQLite باسم dbClass وداخل باني الفئة -constructor- سيتم إنشاء كائن من الـ SQLite وإسناده لخاصية عامة في الفئة -متغير عام- باسم sqliteObj$ ليتم حفظ الكائن بها لإعادة إستخدامه عبر this كما في الدالة query أو أي دالة أخرى تقوم بإنشاءها داخل الفئة كالتالي:

    class dbClass
    {
    
        public $sqliteObj;
    
        public function __construct()
        {
            $this->sqliteObj = new SQLite3('dbClass.db');
        }
    
        public function query($query)
        {
            return $this->sqliteObj->query($query);
        }
    }
    $obj = new dbClass();
    $row = $obj->query('SELECT * FROM tableName');
    while ($row = $results->fetchArray()) {
        var_dump($row);
    }
    
  • نعم اللغة php

  • تمام انشاء الكلاس - انا عاوز استخدم كائن من الكلاس ده داخل كلاس اخر داخله دالة يعنى داخل دالة داخل كلاس اخر

  • قمت بعمل وراثه من الكلاس ده ولكن لم يتم تنفيذ الامر مثل امر الادخال فى ظل ان الامر ينجح عندما استخدمه خارج الدالة

  • قمت بعمل استدعاء لملف الكلاس عن طريق require لأقوم بانشاء كائن منه ولكن لم يرى الكلاس

  • المشكلة كلها هنا استخدام الدوال بنجاه داخل دالة داخل كلاس اخر

  • ضع الكود الذي كتبته لفعل هذا الأمر.

*class dbclass{

public $sqldb;
public function __construct(){
    $this->sqldb = new SQLite3('db.db');
}
public function dbinsert($insert){
    return $this->sqldb->exec($insert);
}

} $a = new dbclass(); $te = $a->dbinsert("INSERT INTO send(id,phone,type,send,date) VALUES (NULL,'222233344','text',0,'1/1/1')"); if($te){ echo 'inserted';

}else{echo ' Dont Inserted';}*

هذا الكوك مثلاً بدون تعقيده امر الادخال لا ينفذ

وعندما اضع الامر مباشرة داخل sqlite ينفذ خارج php

  • اعتقد حل هذه المشكلة ستحل المشكلة الاخرى

class dbclass{

public $sqldb;
public function __construct(){
    $this->sqldb = new SQLite3('db.db');
}
public function dbinsert($insert){
    return $this->sqldb->exec($insert);
}

} $a = new dbclass(); $te = $a->dbinsert("INSERT INTO send(id,phone,type,send,date) VALUES (NULL,'222233344','text',0,'1/1/1')"); if($te){ echo 'inserted';

}else{echo ' Dont Inserted';}

  • ما المشكلة الكود يعمل بشكل جيد ؟

    class dbclass
    {
        public $sqldb;
    
        public function __construct()
        {
            $this->sqldb = new SQLite3('db.db');
        }
    
        public function dbinsert($insert)
        {
            return $this->sqldb->exec($insert);
        }
    } 
    
    $a = new dbclass(); 
    $te = $a->dbinsert("INSERT INTO send (id, phone, type, send, date) VALUES (NULL,'222233344','text',0,'1/1/1')");
    
    if($te){ 
        echo 'inserted';
    }else{
        echo ' Dont Inserted';
    }
    

يعمل بشكل جيد ولكن عند استخدامه داخل كلاس اخر لا يعمل

بمعنى اجى اورث الكلاس ده واستدعى دالة dbinsert لم يعمل

  • وهذا كود لإستخدام دوال الفئة عبر الوراثة:

    class dbclass
    {
        public $sqldb;
    
        public function __construct()
        {
            $this->sqldb = new SQLite3('db.db');
        }
    
        public function dbinsert($insert)
        {
            return $this->sqldb->exec($insert);
        }
    } 
    
    class newClass extends dbclass
    {
        public function __construct()
        {
            parent::__construct();
        }
    
        public function run()
        {
            $te = $this->dbinsert("INSERT INTO send (id, phone, type, send, date) VALUES (NULL,'222233344','text',0,'1/1/1')");
    
            if($te){ 
                echo 'inserted';
            }else{
                echo ' Dont Inserted';
            }
        }
    }
    
    $obj = new newClass();
    $obj->run();
    

الاكلاس الاول فى ملف لوحدة قمت باستدعاءه عن طريق require وبعدين ورثته جربها كده

  • لا يهم إن كان في ملف أو في نفس الصفحة في كلتا الحالتين الكود واحد، وضع الفئات في ملفات منفصلة ما هو إلا عملية تنظيم للأكواد وإستهلاك الموارد فقط ليس إلا.

تعبتك معلشى -- اعتقد ان فى مشكلة تانية لو هى شغاله عندك علشان لما باجى استدعى الدالة فى دالة داخل الكلاس لا تعمل غداً هجربها

  • وهذا نفس الكود داخل دالة ضمن فئة جديدة:

    class dbclass
    {
        public $sqldb;
    
        public function __construct()
        {
            $this->sqldb = new SQLite3('db.db');
        }
    
        public function dbinsert($insert)
        {
            return $this->sqldb->exec($insert);
        }
    } 
    
    class newClass
    {
        public function __construct(){}
    
        public function run()
        {
            $a = new dbclass(); 
            $te = $a->dbinsert("INSERT INTO send (id, phone, type, send, date) VALUES (NULL,'222233344','text',0,'1/1/1')");
    
            if($te){ 
                echo 'inserted';
            }else{
                echo ' Dont Inserted';
            }
        }
    }
    
    $obj = new newClass();
    $obj->run();
    

واذا كان الكلاس الأول الى اسمه dbclass فى ملف لوحده؟

  • انا قمت بتوريثه ولكنه لم يقم بالادخال!
  • عليك إستدعات باني الفئة الـ dbclass من خلال الكلمة المحجوزة parent داخل باني الفئة الوارثة للفئة dbclass كالتالي:

    parent::__construct();
    

والمثال كامل في الرد:

الكود لا يظهر بشكل افضل من هذا

  • قمت بتغير sqlite الى mysql باستخدام mysqli

  • وعندما اكتب الامر مباشرة داخل phpmyadmin ينجح عملية الادخال ولكن مثال باستخدام الكود التالى لا ينجح

*class con

{

public $con;
public function __construct(){
    $con = mysqli_connect('localhost', 'root', '', 'whatsapp');

    if (mysqli_connect_errno())
    {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }}
public function conQuery($conQuery){
    return mysqli_query($this->con,$conQuery);
}

} $c = new con(); $r = "INSERT INTO send(id, phone, type, send, date) VALUES (null,'22222222','text',0,'1/1/1')"; $e = mysqli_query($c->con,$r); if ($e) { echo 'ok'; } else { echo 'no'; }*