Ссылки могут использоваться в сочетании с функциями. Например, рассмотрим ситуацию, в которой желательно возвращать более одного значения из функции. Вернуть более одного значения с помощью оператора return невозможно, к тому же может быть нежелательным использование глобальных переменных. С помощью ссылок вы можете вернуть столько значений, сколько нужно, причем в относительно понятной манере.
Чтобы определить параметр функции как ссылку, предварите имя переменной параметра префиксом & и передавайте функции ссылку при вызове, как показано на листинге 1.28.
Листинг 1.28. Передача параметра по ссылке в РНР
function reference_test($var, &$result, &$result2) ( $result = "Это возвращаемое значение #1"; $result2 = "Вы передали $var как параметр"; return 42; } $res = reference_test(10, &$resl, &$res2); echo "Значение \$res равно '$res' "; echo "Значение \$resl равно '$resl' "; echo "Значение \$res2 равно c$res2' "; ?>
Это выдаст такой результат:
Значение $res равно '42'
Значение $resl равно 'Это возвращаемое значение #1'
Значение $res2 равно 'Вы передали 10 как параметр'
Чтобы лучше понять, как работает этот сценарий, пройдем его строка за строкой.
Во-первых, объявлено, что функция reference_test () принимает три параметра.
Первый параметр $val — это стандартный параметр РНР, в то время как оставшиеся два — $result и $result2 — являются параметрами-ссылками. Когда вызывается функция reference_test (), ей передается три параметра. Первый — константное значение 10, а остальные два — ссылки на переменные $resl и $res2. При вызове устанавливается связь между переменными $resultl и $result2 с одной стороны и $resl и $res2 — с другой (поскольку они друг на друга ссылаются). Поэтому, когда внутри функции изменяются значения $ r e s u l t и $result2, связанные с ними переменные $resl и $res2 также изменяются. Функция по-прежнему возвращает целую константу 42, которая затем, как и ожидается, присваивается переменной $res.
НА ЗАМЕТКУ
Не волнуйтесь, если поначалу сценарий покажется непонятным. Ссылки — это одна из наиболее сложных для понимания концепций в РНР, потому требуется некоторая практика, чтобы разобраться в них.
Также следует отметить, что вы не должны передавать параметры по ссылке во время выполнения и в объявлении функции. Размещение ссылок в любом из этих двух случаев будет иметь один и тот же эффект. Единственная разница в том, что если параметры-ссылки объявлены в самой функции, то при всех ее вызовах параметры будут передаваться по ссылке.
Наряду с передачей переменных в функции по ссылке, РНР поддерживает возвращаемые ссылочные переменные. В примере, представленном в листинге 1.29, эта концепция применяется для создания функции, возвращающей ссылку на базе значений переданных параметров.
Листинг 1.29. Возврат значения по ссылке
function Sfind_var($one, $two, $three) { if(($one > 0) && ($one <= 10)) return $one; if(($two > 0) && ($two <= 10)) return $two; if(($three > 0) && ($three <= 10)) return $three; } $c_one = 'foo'; $c_two = 42; $c_three = 4; $right_var = &find_var($c_one, $c_two, $c_three); $right_var++; echo "Значение \$c_three и \$right_var равны: "; echo "$c_three и $right_var \n"; ?>
Когда этот код выполняется, функция find_var () определяет, какие из трех параметров находятся в диапазоне от 1 до 10, и возвращает ссылку на эту переменную, которая затем может быть привязана к переменной $right var. В результате, когда $right_var увеличивается, также будет увеличена только та переменная, которая соответствует требованиям (а именно — $c_three):Значение $c_three и $right var равны: 5 и 5
|