PHP中的数据库和OOP实践

Ati*_*din -1 php database oop

很难解释这种情况,但请看例子.

我编写了一个加载页面的网站,我初始化了一个数据库类.我将此类作为函数参数发送给需要访问数据库的任何函数.

我知道这是不好的方法,但目前我不知道如何以任何其他方式做到这一点.你能帮我么.

class sms {

    function log_sms($message, $db) {

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

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

}
Run Code Online (Sandbox Code Playgroud)

然后在主页上..

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

$sms = new sms;

$sms->log_sms($message, $db);
Run Code Online (Sandbox Code Playgroud)

有没有比这更好的方法?

use*_*291 8

有多种选择如何解决依赖问题(对象A需要对象B):

构造函数注入

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

  $sms = new Sms (new MyDbClass);
Run Code Online (Sandbox Code Playgroud)

二传手注射

  class Sms { 
        protected $db;
  }
  $sms = new Sms;
  $sms->db = new MyDbClass;
Run Code Online (Sandbox Code Playgroud)

'注册'模式

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

 class Sms {
      function doSomething() {
          $db = Registry::get_db();
          $db->....
  }}
Run Code Online (Sandbox Code Playgroud)

'服务定位器'模式

 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);
Run Code Online (Sandbox Code Playgroud)

自动化基于容器的依赖注入,请参阅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');      
Run Code Online (Sandbox Code Playgroud)

仅举几例;)

我之前给你的福勒的文章也非常值得一读