Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
web_l6_PHP.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
164.14 Кб
Скачать

Жорсткі посилання в php

Жорстке посилання представляє собою просто змінну, яка є синонімом іншої змінної. Багаторівневі посилання (тобто, посилання на посилання змінної, як це можна робити, наприклад, у Perl) не підтримуються. Так що не варто сприймати жорсткі посилання серйозніше, ніж синоніми.

Щоб створити жорстке посилання, потрібно використовувати оператор & (амперсанд). Наприклад:

$a = 10;

$b = & $a; // тепер $b - те ж саме, що і $a

$b = 0; // насправді $a = 0

echo "b = $b, a = $a"; / / Виводить: "b = 0, a = 0"

Посилатися можна не тільки на змінні, але й на елементи масиву (цим жорсткі посилання вигідно відрізняються від символічних). Наприклад:

$a = array ('a' => 'aaa', 'b' => 'bbb');

$b = & $a ['b']; // тепер $b - те ж, що й елемент з індексом 'b' масиву

$b = 0; / / насправді $a ['b'] = 0;

echo $a ['b']; // Виводить 0

Втім, елемент масиву, для якого планується створити символічне посилання, може і не існувати. Як у наступному випадку:

$a = array ('a' => 'aaa', 'b' => 'bbb');

$b = & $a ['c']; // тепер $b - те ж, що й елемент з індексом 'c' масиву

echo "Елемент з індексом 'c': (". $a ['c'].")";

В результаті виконання розглянутого скрипта, хоча посиланням $b і не було нічого присвоєно, в масиві $a створиться новий елемент з ключем c і значенням - порожній рядком (ми можемо це визначити за результатом роботи echo). Тобто, жорстке посилання на самому ділі не може посилатися на неіснуючий об'єкт, а якщо робиться така спроба, то об'єкт створюється.

Примітка: Якщо прибрати рядок, в якій створюється жорстке посилання, то буде виведено повідомлення про те, що елемент з ключем c не визначено в масиві $а.

Жорсткі посилання зручно застосовувати при передачі параметрів для функції користувача і повернення значення з неї.

Символічні посилання (змінні на змінні)

Символічне посилання - це всього лише рядкова змінна, що зберігає ім'я іншої змінної. Щоб дістатися до значення змінної, на яку посилається символічне посилання, необхідно застосувати додатковий знак $ перед ім'ям посилання. Розглянемо приклад:

$A = 10;

$B = 20;

$C = 30;

$P = "А"; / / або $Р = "В" або $Р = "С" (присвоюємо $p ім'я іншої змінної)

echo $$Р; // виводить змінну, на яку посилається $Р, тобто $А

$$P = 100; / / присвоює $А значення 100

Ми бачимо, що для того, щоб використовувати звичайну рядкову змінну як посилання, потрібно перед нею поставити ще один символ $. Це говорить інтерпретатору, що треба взяти не значення самої $Р, а значення змінної, ім'я якої зберігається у змінній $Р.

Символічні посилання (змінні на змінні) використовуються досить рідко.

Жорсткі посилання і призначені для функцій користувача Передача значень за посиланням

Ви можете передавати змінні в функцію користувача по посиланню, якщо ви хочете дозволити функції модифікувати свої аргументи. У такому випадку, функція користувача зможе змінювати аргументи. Синтаксис такий:

<? Php

function foo (& $var)

{

$var + +;

}

$a = 5;

foo ($a);

// $a тут дорівнює 6

?>

Зауважте, що у виклику функції відсутній знак посилання - він є тільки у визначенні функції. Цього достатньо для коректної передачі аргументів за посиланням.

Ще один цікавий приклад:

<? Php

function funct (& $string)

{

$string .= 'а ця всередині.';

}

$str = 'Цей рядок за межами функції,';

funct ($str);

echo $ str; // Виведе 'Цей рядок за межами функції, а ця всередині.'

?>

За посиланням можна передавати:

  • Змінні, наприклад foo ($ a)

  • Оператор new, наприклад foo (new foobar ())

  • Лінки, які повертаються функцією, наприклад:

<? Php

function & bar ()

{

$a = 5;

return $a;

}

foo (bar ());

?>

Будь-яке інше вираження не повинно передаватися по посиланню, так як результат не визначений. Наприклад, наступна передача за посиланням є неправильною:

<? Php

function bar () // Операція & відсутня

{

$a = 5;

return $a;

}

foo (bar ());

foo ($a = 5); // Вираз, а не змінна

foo (5); // Константа, а не змінна

?>

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]