2013-06-03 2 views
4

У меня есть вопрос об использовании PDO, на который я не смог найти ответ. Вероятно, это тоже работает для соединений mysql/mysqli.Производит ли дублирование объекта PDO несколько соединений?

В основном включает мой проект, я создаю объект PDO с помощью

$pdo = new PDO('connection here'); 

Ну, у меня есть класс, который необходим доступ к базе данных. Итак, вместо использования «global $ pdo;» внутри каждой функции я сделал следующее.

class MyClass(){ 
    private $db = null; 
    __construct(){ 
     global $pdo; 
     $this->db = $pdo; 
    } 
    function example(){ 
     $sql = 'A Query'; 
     $this->db->prepare($sql); 
    } 
} 

Во всяком случае, мой вопрос, это делает это создает 2 соединения с базой данных, так как я фактически дублируя $ PDO, установив класс $ дб вар равный ему? Основная причина, по которой я спрашиваю, заключается в том, что я вижу, что это происходит много в нашей системе, и я заинтересован в создании слишком большого количества подключений к MySQL и избавлении системы от ненужных подключений.

Как часть вторая, имеет ли следующая причина дублирование, и могу ли я пройти мимо ref? Я немного боюсь попробовать его и заставить что-то сломать.

Изменить

function MyFunction($member_id, $pdo){ 
    //do something. 
} 

Для

function MyFunction($member_id, &$pdo){ 
    //do something 
} 

Спасибо!

+4

Только что ответили ранее: [Назначение объекта PHP против клонирования] (http://stackoverflow.com/questions/16893949/php-object-assignment-vs-cloning). Ответ должен устранить вашу путаницу. – deceze

+0

Это тот же объект, что и объекты всегда хранятся со ссылками – Voitcus

+0

С другой стороны, связано ли соединение, возвращенное из старой школы mysql_connect(), под эти правила? – GameCharmer

ответ

3

Как упоминалось в комментариях, вы не дублируете объект PDO в этом коде, вы просто назначаете дополнительную переменную для ссылки на один и тот же объект.

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

Передача по ссылке необходима только в том случае, если вы действительно хотите изменить переменную и иметь изменения, распространяемые обратно; присвоение полностью нового объекта $pdo внутри функции будет считаться модификацией переменной, но манипулирование объектом не будет.

Контр-интуитивно, назначая по ссылке часто хуже за производительность, так как он побеждает оптимизацию «копировать на запись» в механизме PHP, которая позволяет отдельным переменным с одинаковым значением совместно использовать одну и ту же память.

0

Он не будет создавать два подключения. Для подтверждения вы можете использовать: xdebug_debug_zval.Проверьте руководство по использованию php для использования. Вы можете проверить результат с помощью helkp ниже кода: xdebug_debug_zval ('pdo'); и xdebug_debug_zval ('db');

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