2010-05-19 75 views
0

我是PHP新手。扩展mysqli并使用多个类

我想创建类数据库并从它调用其他类。我是否正确地做这件事?

级数据库:

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(); 

是正确的方式还是应该做另一种方式?

谢谢。

+0

似乎有什么不对您的代码。我不确定你在这里问什么。 作为一个方面说明,我建议不要扩展mysqli并将其组合到您的课堂中。它没有出现,因为你在这一点上获得了延伸它的任何东西。 – tylermac 2010-05-19 13:24:31

+0

感谢您的评论。我担心的是$ db-> users() - > test();.我可以用__call()创建新的类,或者我应该每次都做一些像$ u = new db_users(); $ U->试验(); – Mikk 2010-05-19 13:30:20

回答

2

你可以这样做,没有什么不对(我经常做类似的事情)。我建议的唯一的事情就是使用异常,而不是芯片(这样你可以安全地处理错误)......

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); 
} 
1

没有什么错与创建类这家工厂的风格。我会在其中放置一些异常处理。

我唯一的担心是在你的子类中扩展数据库。

所以我修改如下:

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'; 
    } 
} 
+0

谢谢你做了一些测试,并理解,为什么扩展子类不是一个好主意。 – Mikk 2010-05-19 16:47:17