Как обернуть __construct () вокруг mysqli_connect ()? - PullRequest
1 голос
/ 24 июня 2011

Вот mysqli_connect (), как определено в руководстве по PHP:

mysqli_connect([ string $host = ini_get("mysqli.default_host")
               [, string $username = ini_get("mysqli.default_user")
               [, string $passwd = ini_get("mysqli.default_pw")
               [, string $dbname = ""
               [, int $port = ini_get("mysqli.default_port")
               [, string $socket = ini_get("mysqli.default_socket") ]]]]]] )

Должен ли я просто сделать это для всех аргументов?:

class MyClass {
    private $conn;

    public function __construct($host = '') {
        if($host == '') {
            $host = ini_get('mysqli.default_host');
        }

        $this->conn = mysqli_connect($host);
    }
}

Если я сделаю это для всехаргументы метода это правильно обернуть mysqli_connect ()?Есть ли более элегантный способ сделать это?

РЕДАКТИРОВАТЬ :

После того, как вы увидели ответ Франциоса и немного подумали об этом, кажется, что это лучший способ сделать это.:

class MyClass {
    private $conn;

    public function __construct($host = '',
                                $username = '',
                                $passwd = '',
                                $dbname = '',
                                $port = 0,
                                $socket = '') {
        $this->conn = call_user_func_array('mysqli_connect', func_get_args());
    }
}

Будет ли это правильно?Единственное, что меня беспокоит, это $ port, потому что это не строка.

Ответы [ 3 ]

2 голосов
/ 24 июня 2011

Вы можете использовать call_user_func_array, предполагая, что ваш класс ожидает, что параметры будут точно такими же, как mysqli_connect.

class MyClass
{
  private $conn;

  public function __construct()
  {
    $this->conn = call_user_func_array('mysqli_connect', func_get_args());
  }
}

С учетом сказанного, чем большеэлегантный способ просто расширить класс MySQLi:

class MyClass extends MySQLi
{
  // Custom functions that extend the functionality of MySQLi can go here.
}
0 голосов
/ 28 июня 2014
class connection {
    public  $input;
    public  $db_name = "dbname"; 
    public  $host = "localhost"; 
    public  $user       = "user"; 
    public  $ids        = "password"; 

    function __construct() {

        $this->dbc = mysqli_connect($this->host, $this->user, $this->ids, $this>db_name) or die("Error " . mysqli_error($con)); 
    }


    public function view_connection() {
        $sql = "SELECT * FROM tablename WHERE column = '$this->input' ";
        $cart_result = @mysqli_query($this->dbc, $sql) or die("Couldn't get cart!");

        while ($row = mysqli_fetch_array($cart_result)) {       
            $this->id = $row["id"];
            echo "This is the id - " .$this->id;
        }
    }
}
0 голосов
/ 24 июня 2011

Ну, есть много способов снять шкуру с кошки, и много способов кодировать класс. Вы в правильном направлении, хотя!

class MyClass {
  private $conn;
  private $host;  // defined as class variable to be used in connect()

  public function __construct($host = null) {
    if(isset($host)) {
       $this->host = $host;           
    }else{
       $this->host = ini_get('mysqli.default_host');        
    }

  }
  public function connect(){
      $this->conn = mysqli_connect($this->host);    
  }      

}    

// calling code ...
$db = new MyClass;
$db->connect();

Некоторые предпочитают использовать метод подключения в отдельном методе, конструктор должен выполнять как можно меньше работы. Это значительно облегчает тестирование ваших классов.

Еще одна деталь, более относящаяся к обслуживанию, чем к вашему актуальному вопросу, - это параметры. Я бы посоветовал передать необязательный массив в качестве аргументов вместо того, чтобы перечислять все параметры по отдельности в конструкторе.

IE:

$dbSettings = array('host'     => 'localhost',
                    'username  => 'john',
                    'passwd'   => 'secret',
                    'database' => 'myDB'    
               );

    // class constructor now has one parameter only, with [type-hinting](http://php.net/manual/en/language.oop5.typehinting.php) as an added bonus ..

        public function __construct(Array $dbSettings = null) {
           if(isset($dbSettings)){
             // assign values passed through the array
             $this->host = $dbSettings['host'];                                     
           }else{
             // assign values through ini settings ...
             $this->host = ini_get("mysqli.default_host");                  
           }

        }        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...