English 中文(简体)
PHP数据库和OOP做法
原标题:Database and OOP Practices in PHP
  • 时间:2009-11-11 17:09:51
  •  标签:

很难解释这种情况,但请见这一例子。

我已经编辑了一个网页,我开始使用一个数据库。 我将这一类别作为职能参数,发送给需要查阅数据库的任何职能。

我知道这种做法是坏的,但目前我并不知道如何以任何其他方式这样做。 请帮助我。

class sms {

    function log_sms($message, $db) {

        $sql = "INSERT INTO `smslog` SET
            `mesasge` =  $message 
            ";
        $db->query($sql);

        if ($db->result)
            return true;
        return false;
    }

}

然后在主页上。

$db = new db(username,pass,localhost,dbname);

$sms = new sms;

$sms->log_sms($message, $db);

是否有比这更好的办法?

最佳回答

如何解决受扶养人问题(目标A要求目标B):

构造注射

  class Sms { 
        function __construct($db) ....
  }

  $sms = new Sms (new MyDbClass);

套用注射

  class Sms { 
        protected $db;
  }
  $sms = new Sms;
  $sms->db = new MyDbClass;

登记册模式

 class Registry {
     static function get_db() {
          return new MyDbClass;
 }}

 class Sms {
      function doSomething() {
          $db = Registry::get_db();
          $db->....
  }}

服务地点模式

 class Loader {
     function get_db() {
          return new MyDbClass;
 }}

 class Sms {
      function __construct($loader) {
         $this->loader = $loader;

      function doSomething() {
          $db = $this->loader->get_db();
          $db->....
  }}

  $sms = new Sms(new Loader);

自动集装箱依赖注射,例如见。 http://www.sitepoint.com/blogs/2009/05/11/bucket-is-a-minimal-dependency-injection-container-for-php

   interface DataSource {...}
   class MyDb implements DataSource {...}

    class Sms {
        function __construct(DataSource $ds) ....


    $di = new Dependecy_Container;
    $di->register( DataSource ,  MyDb );
    $sms = $di->get( Sms );      

a)

此前给你的福勒文章确实值得阅读。

问题回答

对于开户人来说,你可以在需要利用数据库的每个班种中作出受保护的美元b变量。 然后,你可以将b款转给班级建筑商。 更新后的法典:

$db = new db(username,pass,localhost,dbname);
$sms = new sms($db);
$sms->log_sms($message);

class sms {

    protected $db;

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

    public function log_sms($message) {
        $sql = "INSERT INTO `smslog` SET
                `mesasge` =  $message 
                ";
        $this->db->query($sql);

        if ($this->db->result)
                return true;
        return false;
    }
}

这一例子见PHP 5。

Singleton is also good practice in application design. They are very useful to avoid repeated queries or calculations during one call. Passing Database object to every method or constructor is not a very good idea, use Singleton instead.

扩大贵国数据库,或在贵重类别内插入静态方法。 (我还将呼吁在拆房方法内进行装配)

class database extends db
{
    public static function instance()
    {
        static $object;

        if(!isset($object))
        {
            global $config;

            $object = new db($config[ username ],$config[ pass ],$config[ localhost ],[ dbname ]);
        }

        return $object;
    }
}

2. 改变方法

class sms {

    public static function log($message) {

        $sql = "INSERT INTO `smslog` SET `mesasge` =  $message ";

        database::instance()->query($sql);

        return (bool) database::instance()->result;
    }
}

接下来,你们需要把烟ms挂成像这样的静态呼声。

sms::log($message);

或者,你可以有一个固定的班子,有两个名单,一个是现有的连接,另一个是已移交的连接,而只是有一个连接库。

或者,如果你使用像MySQL这样具有快速联系时间的某种东西,那么就在你的数据库类别中建立了联系,那么这种功能所需要的所有问询就会结束。 这是我的首选做法。





相关问题
热门标签