سؤال

أنا جديد على الاشياء PHP OOP.

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

قاعدة بيانات الفصل:

class database extends mysqli {

private $classes = array();

public function __construct() {
parent::__construct('localhost', 'root', 'password', 'database');
    if (mysqli_connect_error()) {
    $this->error(mysqli_connect_errno(), mysqli_connect_error());
    }
}

public function __call($class, $args) {
    if (!isset($this->classes[$class])) {
    $class = 'db_'.$class;
    $this->classes[$class] = new $class(); 
    }
return $this->classes[$class];
}

private function error($eNo, $eMsg) {
die ('MySQL error: ('.$eNo.': '.$eMsg);
}

}

فئة DB_USERS:

class db_users extends database {

public function test() {
echo 'foo';
}

}

وكيف أستخدمه

$db = new database();
$db->users()->test();

هل هي الطريقة الصحيحة أم يجب أن يتم ذلك بطريقة أخرى؟

شكرًا لك.

هل كانت مفيدة؟

المحلول

يمكنك القيام بذلك بهذه الطريقة ، لا حرج في ذلك (أفعل شيئًا مشابهًا كثيرًا). الشيء الوحيد الذي أقترحه هو استخدام استثناءات بدلاً من الموت (بهذه الطريقة يمكنك التعامل بأمان مع الخطأ) ...

protected function error($eNo, $eMsg, $extra = '') {
    throw new Exception('MySQL error: ['.$eNo.'] '.$eMsg.': '.$extra);
}

بالإضافة إلى ذلك ، أود أن أقترح تحميل طريقة الاستعلام أيضًا

public function query($sql, $result_mode = MYSQLI_STORE_RESULT) {
    $result = parent::query($sql, $result_mode);
    if ($result === false) {
         $this->error($this->errno, $this->errstr, $sql);
    }
    return $result;
}

أود أن أقترح أيضًا تخزين نسخة من كائن $ DB داخل فئة الطفل. لذا:

class db_users extends database {
    protected $db = null;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    public function test() {
        echo 'foo';
    }
}

ثم ، في __call:

if (!isset($this->classes[$class])) {
    $class = 'db_'.$class;
    $this->classes[$class] = new $class($this); 
}

نصائح أخرى

لا حرج في أسلوب المصنع هذا لإنشاء الفصول الدراسية. سأضع بعض الاستثناء معالجة فيه.

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

لذلك سأعدل على النحو التالي:

public function __call($className, $args) {
    if (!isset($this->classes[$class])) {
        if(include_once('db_'.$class)) {
            $class = 'db_'.$class;
            $this->classes[$class] = new $class($this);
        } else {
            throw new Exception("Db class not found");
        }
    }

    return $this->classes[$class];
}

وفئة المستخدمين على النحو التالي:

public class db_users {
    private $db;

    public __constructor($db) {
        $this->db = $db;
    }

    public function test() {
        return 'Foo';
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top