2012-03-02 4 views
0

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

Thanks

+1

Вы можете прочитать этот вопрос и принято отвечать: http://stackoverflow.com/questions/9227400/php-singleton-database-connection-is- this-code-bad-practice – summea

+0

Я согласен с summea, лично я нахожу, что процесс инъекции зависимостей проще реализовать, чем singleton. – Kisaro

ответ

2

Подключение к базе данных не должно входить в конструктор. У вас должен быть класс ConnectionFactory, который будет подключаться к базе данных и возвращать новый объект DatabaseConnection.

<?php 

class ConnectionFactory { 
    public static function newConnection($credentials) { 
     //Connect to database 
     $connection = new PDO(/* Credentials */); 
     return $connection; 
    } 
} 

$connection = ConnectionFactory::newConnection(CREDENTIALS); 
1

Привет, у вас есть два варианта.

Ваш лучший выбор - создание singleton class. Это класс, который ссылается на себя, чтобы вы никогда не могли создать больше одного из них. Если вы попытаетесь создать более одного из них, он вернет текущую инициализированную версию.

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

например.

$db = new Database(); // call this once to create 
// don't do this again 
$anotherdb = new Database(); 
// just use the db object from before 
$db->query("..."); 

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

Если вы посмотрите в Интернете, вы найдете примеры других классов баз данных, на которые нужно смотреть.

Посмотрите также на фреймворки, такие как codeigniter, они используют свои собственные классы баз данных. Возможно, стоит посмотреть, как они работают.

+1

Синглы - зло. И что, если ему нужно подключаться более одного раза (к другой базе данных с разными учетными данными)? –

+0

Я слышал, что синглтоны злы, но у меня никогда не было проблем. И после программирования iOS (цель c) я считаю, что синглтоны очень полезны. Вы можете создавать синглеты с несколькими соединениями. Создайте статическую переменную для хранения каждого соединения. В любом случае, это ответ на помощь ОП. –

0

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

$connection = new PDO(...); 

$first = new Foo($connection); 
$second = new Bar($connection); 

Таким образом, оба экземпляра имеют доступ к одному и тому же соединению.

Вы также могли бы извлечь выгоду из просмотра этого видео: The Clean Code Talks - Don't Look For Things!

Смежные вопросы