2014-02-21 3 views
-2

Мне было интересно об этом в течение нескольких недель. Моя практика кода заключается в создании нескольких классов (вставка, обновление, удаление и т. Д.), А затем создание функций внутри этого.PHP, использующий лучший код

Проблема заключается в том, что для каждой функции я сделать что-то вроде:

public function clients(){ 
    $db = new mysqli($this->host, $this->user, $this->pass, $this->db); 
    if ($db->connect_errno) { 
     printf("Connecting error" . $db->connect_error); 
     return false; 
     exit(); 
    } 
    $db->set_charset("utf8"); 

    $visibile = true; 

    $query = $db->prepare("SELECT * FROM clients WHERE visible = ?"); 
    $query->bind_param("i", $visible); 
    $query->execute(); 
    $query->bind_result($id, $name, $address, $photo); 
    $query->store_result(); 
    $rows = array(); 

    while($query->fetch()){ 

     $rows[] = array("id" => $id, "name" => $name, "address" => $address, "photo" => $photo); 
    } 

    $query->close(); 
    $db->close(); 

    return $rows; 
} 

Я думал о сокращении этого code..at наименьшую соединение в начале каждой функции.

// currently call 
include_once('select.php'); 
$select = new select(); 

$rows = $select->clients(); 

Что-то лучше было бы

$select = new select(); 
$rows = $select->connect()->clients(); 

Или еще лучше

$rows = $connect->select()->clients(); 

Я знаю, что это возможно, я просто не знаю, как. Или есть даже лучший подход, чем этот?

+2

Возникли классы, имена которых глаголы это вы структурирование вещи странно определенный знак , Какие данные и методы вы инкапсулируете в «Выбрать» или «Обновить»? – geoffspear

+0

Вторичный @Wooble. Ваша структура классов, безусловно, странная, но начать работу с принципами DI станет хорошим первым шагом. – deceze

+0

Почему это странно? Лучше читать '$ select-> clients()' и '$ insert-> clients ($ name)', чем '$ variable-> insert_clients()'. – user3243925

ответ

1

Dependency injection!

$db  = new mysqli(...); 
$select = new Select($db); 
$select->clients(); 

class Select { 

    protected $db; 

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

    public function clients() { 
     $this->db->... 
     ... 
    } 

} 

Преимущества очевидны, мы надеемся. Вы можете поделиться одним экземпляром $db среди не только всех ваших методов, но и всех ваших классов. Он также не жестко кодирует спецификацию базы данных внутри класса.

+1

Я перестану писать свой ответ, потому что это в значительной степени то, что я бы сказал. Однако для удобства я бы рекомендовал, чтобы OP создавал класс «База данных», который свечи создают соединение «mysqli». Поэтому вы бы сказали '$ db = new Database(); $ select = new Select ($ db); ' – Sam

+1

@Sam Зависит от того, хотите ли вы также * абстрактный * соединитель вашей базы данных, но да, конечно, неплохая идея. Может, и фабрика. – deceze

0

Вы должны сделать соединение первым над классом, ввести его в свой класс. Затем в конструкторе вы связываете соединение с var. Наконец, вы можете использовать соединение в любой функции вашего класса.

class Select { 
    public function __construct(mysqli $db) { 
     $this->db = $db; 
    } 
    public function clients() { 
     $query = $this->db->prepare(); 
    } 
} 

$db = new mysqli(); // Make connection 

$class = new Select($db); // Pass the database variable into the class 
+0

Подключение к каждой странице? Я не думаю, что это лучшее решение. См. Ответ, который я обозначил как правильно. – user3243925

+0

Конечно, это не то, что я предлагаю, он должен быть установлен выше, с которого начинается ваш класс. Это тот же самый ответ, что и принятый. – vonUbisch

+0

Вы правы, я снова прочитал ответ, и все то же самое. Хотя я этого не хочу. Я хочу иметь возможность в '__construct()' инициализировать mysqli. – user3243925

0

Я пойду с Repository PatternDependency Injection). Вы найдете дополнительную информацию there.

Цель состоит в том, чтобы иметь класс, пригодный для использования любым другим классом бизнес-логики, который предлагает простой способ сохранения и извлечения объектов.

Вы будете в конечном итоге с:

class Database 
{ 
    public function select(...) 
    ... 
} 

И ваше хранилище (где используется база данных)

class ClientsRepository // probably : implements RepositoryInterface 
{ 
    protected $db; 

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

    public function findAll() 
    { 
     // use $this->db to select * 
    } 
} 
Смежные вопросы