2015-03-18 2 views
0

Я пытаюсь передать объект в качестве параметра для конструктора в классе, таких как:PHP использование переменной объекта класса

class godtoolkit{ 
    protected $var; 
    public $explanation; 

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

    public function armageddon(){ 
     $this -> var -> close(); 
     $this -> explanation = "The World Ended!"; 
     return true; 
    } 
} 

$goddemands = new godtoolkit($mysqli); // $mysqli is a normal mysqli connection 
if($goddemands -> armageddon()){ // Is this closing my database? 
    echo($goddemands -> explanation); 
} 

Вопрос очевидна в примере кода, имейте в виду, что это пример но запрашивает именно то, что мне нужно.

+1

В чем вопрос? Почему вызов close закрывает ваше соединение? –

+0

@RaelGugelminCunha Ну, вопрос в том, что '$ this -> var -> close();' фактически закрывает мое соединение mysqli? – d3nm4k

+0

Поскольку атрибут '$ var' объекта имеет ваш объект' $ mysqli', передается в конструкторе, и вы вызываете 'close()' на нем, а '$ mysqli-> close()' закрывает ваше соединение. –

ответ

1

Короткие: Да, это закроет соединение MySQLi.

Почему: Важно отметить, что в PHP, Объекты всегда передается по ссылке. То есть переменная на самом деле является ссылкой на пространство памяти, которое представляет этот объект, и везде, где значение этой переменной идет, оно всегда будет указывать на одно и то же пространство в памяти и, следовательно, на один и тот же объект.

Пример:

Ниже показана разница между прохождением по копии, пройти по ссылке, и как объекты работы:

function copy_increment($int) { 
    $int++; 
} 

function reference_increment(&$int) { 
    $int++; 
} 

function object_increment($object) { 
    $object->int++; 
} 

function maybe_destroy($object) { 
    unset($object); 
} 

$object = new StdClass(); 
$object->int = 1; 
$int_val = 1; 

var_dump($int_val); // 1 

copy_increment($int_val); // Not passed by reference 

var_dump($int_val); // 1 

reference_increment($int_val); // Passed by reference 

var_dump($int_val); // 2 

var_dump($object); // int = 1 

object_increment($object); // Always passed by reference 

var_dump($object); // int = 2 

// But here you can see that the parameters are 
// still copies, but copies of the pointer and 
// un-setting only effects the current scope. 
maybe_destroy($object); 

var_dump($object); // int = 2 

Вы можете увидеть это в действии here. Что это значит в вашем случае? Это означает, что да, когда вы передаете соединение MySQLi и храните его, а затем закройте его, он обязательно закроет все копии этого объекта.

Существует поймать здесь в том, что вы можете объекты клон, но MySQLi является то, что они называют «не-клон-объект в состоянии», и это будет убивать ваше приложение, если вы пытаетесь ... :-(

ПРИМЕЧАНИЕ: Соединение MySQLi не должно быть явно закрыто, и соединение прекратится, когда объект будет уничтожен (в конце приложения или во время сбора мусора), поэтому вам никогда не придется явным образом нажимаю на него.

Другим вариантом может быть фабричный класс или функция, которая строит соединение по требованию. объект к конструктору и сохранить уникальное соединение с этим объектом. Я не могу сразу подумать, почему это было бы полезно, но было бы довольно легко настроить и позволит вам закрыть соединения в течение всего дня. ;-)

Действительно, вам не нужно закрывать его вручную, особенно если вы только начинаете.

+0

Я фактически создаю функцию обработчика ошибок внутри этого класса, и что я хочу достичь, это закрыть базу данных при возникновении ошибки (избегая переполнения). Вот почему мне нужно вручную закрыть соединение mysqli, и я не знал, возможно ли иметь объект внутри объекта и как правильно обращаться к данным с помощью 2x '->'. – d3nm4k

+0

Я бы предложил использовать Исключения вместо закрытия соединения. Вы можете перенести большинство (если не все) выполнения вашего приложения в блок catch try и при ошибке выкинуть исключение. Это позволит вам регистрировать исключение и предотвращать любое последующее выполнение приложения одновременно. Проблема с закрытием внутреннего соединения БД заключается в том, что у вас может быть код где-то еще, который пытается выполнить на БД, и это вызовет больше проблем ... – Mike

0

Да, вызов armageddon() закроет соединение mysqli, переданное в конструкторе вашего класса.

+0

Кроме того, в настоящее время не ясно, как объекты работают с этим объектом в объектной вещи, можете ли вы сказать мне, закрывает ли соединение внутри класса или глобально закрывает его. – d3nm4k

+0

Он работает так же, как и обычная переменная.Соединение становится закрытым глобальным из любой области, которую вы вызываете mysqli-> close() – sota

+0

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

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