Главная > Программирование > РНР: настольная книга программиста
<< Предыдущий параграф
Следующий параграф >>
<< Предыдущий параграф Следующий параграф >>
Макеты страниц

15.15. Ссылки внутри конструктора

Для более корректной работы с классами, т. е. с его данными класса, создатель РНР ввел такую привлекательную вещь, как ссылки внутри конструктора. Собственно говоря, не зная данных возможностей и не изучая этот параграф, вы не создадите себе какой-либо пробел в знаниях. Все, что можно сделать при помощи ссылок внутри конструктора, аналогично тем операциям, которые вы умеете делать без ссылок. Ссылки, как правило, позволяют манипулировать с самим адресом. Это очень важно понять, так как иногда происходят ошибки при выполнении программы, если разработчик не знает этого. Использование ссылок внутри конструктора может привести к запутанному результату. Это также одна из причин, почему они не получают особого распространения, хотя иногда применяются. Приведенный пример познакомит вас с синтаксисом применения ссылок:

<?

class simp {

    function foo($name) {

        // создание ссылки внутри global массива $globalref

        global $globalref;

        $globalref[] = &$this;

        // назначение name, чтобы передать переменную

        $this->setName($name);

        // и вызов ее обратно

        $this->echoName();

    }

    function echoName($name) {

        echo "<br>",$this->Name;

    }

    function setName ($name) {

        $this->Name = $name;

    }

}

?>

Данная программа весьма проста. Обратите внимание, что ссылка обозначается символом &. Приведем пример, который покажет принципы различия применения переменных и ссылок:

$num = new foo('constructor');

$num->echoName();

$globalref[0]->echoName();

В данном примере приведены переменные и способы обращения ИХ к классу. Результат работы программы будет следующий :

constructor

constructor

constructor

Теперь создадим аналогичный фрагмент скрипта, но с использованием ссылки:

$num2 = & new fоо ('constructor');

$num2->echoName() ;

$globalref[1]->echoName();

Результат работы программы будет

constructor

constructor

constructor

Заметьте, что переменная $num и массив $globalref[0], вызываемый как переменная _NOT_, являются не одной и той же переменной. Это потому, что оператор «new» по умолчанию возвращает не ссылку, а копию.


ВНИМАНИЕ

В РНР 4 не существует никаких принципиально важных различий использования копирования переменных вместо ссылок (т. е. своего рода операции присвоения). Однако в большинстве случаев лучше работать с копиями переменных, чем со ссылками. Дело в том, что для того чтобы создать переменную, необходимо затратить некоторое время при обработке кода. А на копию переменных не затрачивается какое бы то ни было время. Исключение составляет работа с массивами или большими объектами при условии, что происходит изменение массива, а в последствии самого процесса и объекта. В этом случае самым рациональным решением является использование ссылок, что поможет производить изменения значений одновременно.


Приведем пример, иллюстрирующий все вышесказанное:

// сейчас мы изменим name и вы сможете увидеть,

// что $num и $globalref[0] изменили свои значения

$num->setName('set from outside');

// как было упомянуто ранее, дело обстоит не так

$num->echoNarae();

$globalref[0]->echoName();

/* результат :

set on object creation

set from outside */

// посмотрите на различия между $num2 и $globalref[1] $num2->setName('set from outside');

// тут $num2->Name, а массив $globalref[1]->Name аналогично

$num2->echoName();

$globalref[1]->echoName();

В результате выполнения программы на экран будет выведено:

set from outside

set from outside

<< Предыдущий параграф Следующий параграф >>
Оглавление