Анимация
JavaScript
|
Главная Библионтека Обратите внимание на то, что при описании myecho() мы указали пустые скобки в качестве списка параметров, словно функция не получает ни одного параметра. На самом деле в PHP при вызове функции можно указывать параметров больше, чем задано в списке аргументов - в этом случае никакие предупреждения не выводятся (но если фактическое число параметров меньше, чем указано в описании, PHP выдаст сообщение об ошибке). "Лишние" параметры как бы игнорируются, в результате пустые скобки в myecho() позволяют нам в действительности передать ей сколько угодно параметров. Для того чтобы все же иметь доступ к "проигнорированным" параметрам, существуют три встроенные в PHP функции, которые я сейчас подробно опишу. □ int func num args() Возвращает общее число аргументов, переданных функции при вызове. □ mixed func get arg(int $num) Возвращает значение аргумента с номером $num, заданного при вызове функции. Нумерация, как всегда, отсчитывается с нуля. □ list func get args() Возвращает список всех аргументов, указанных при вызове функции. Думаю, что применение этой функции оказывается практически всегда удобнее, чем первых двух. Перепишем наш пример с применением последней функции (листинг 11.7): i Листинг 11.7. Использование fuct get args () function myecho() { foreach(func get args() as $v) { for($j=0; $j<@$i; echo " "; echo "$v<br>\n"; @$i++; в1водим строки "лесенкой" myecho("Меркурий", "Венера", "Земля", "Марс"); Мы используем здесь цикл foreach для перебора аргументов, а также оператор отключения ошибок @, чтобы PHP не "ругался" на то, что переменная $i не определена при первом "обороте" цикла. локальные переменные Наконец-то мы подошли вплотную к вопросу о "жизни и смерти" переменных. Действительно, во многих приводимых выше примерах мы рассматривали аргументы функции (передаваемые по значению, а не по ссылке) как некие временные объекты, которые создаются в момент вызова и исчезают после окончания функции. Например (листинг 11.8): i Листинг 11.8. Локальные переменные (параметры) $a=100; Глобальная переменная, равная 100 function Test($a) { echo $a; в1водим значение параметра $a Этот параметр не имеет к глобальной $a никакого отношения! $a++; изменяется только локальная копия значения, переданного в $a Test(1); в1водит 1 echo $a; в1водит 100 - глобальная $a, конечно, не изменилась В действительности такими же свойствами будут обладать не только аргументы, но и все другие переменные, инициализируемые или используемые внутри функции. Вот пример (листинг 11.9): i Листинг 11.9. Локальные переменные function Silly() { $i=rand(); запис1вает в $i случайное число echo $i; в1водит его на экран Эта $i не имеет к $i никакого отношения! for($i=0; $i!=10; Silly(); Здесь переменная $i в функции будет не той переменной $i, которая используется в программе для организации цикла. Поэтому, собственно, цикл и проработает только 10 "витков", напечатав 10 случайных чисел (а не будет крутиться долго и упорно, пока "в рулетке" функции rand() не выпадет 10. Собственно говоря, это нас устраивает. Действительно, мало ли какие имена переменных использует функция для своих личных целей... Какое до этого дело программе (которая вообще может быть написана другим человеком)? Вот и получается, что каждая функция - "узник" в своем тесном мирке, живущий и обменивающийся с " окружающим миром" через свои параметры и возвращаемое значение. глобальные переменные Если вы, прочитав последние строки, уже начали испытывать сочувствие к функциям в PHP (или, если вы прикладной программист, сочувствие к разработчикам PHP), то спешу вас заверить: разумеется, в PHP есть способ, посредством которого функции могут добраться и до любой глобальной переменной в программе (не считая, конечно, передачи параметра по ссылке). Однако для этого они должны проделать определенные действия, а именно: до первого использования в своем теле внешней переменной объявить ее "глобальной" (листинг 11.10): i Листинг 11.10. Использование global function Silly() { global $i; $i=rand(); echo $i; for($i=0; $i!=10; Silly(); Вот теперь-то переменная $i будет везде едина: что в функции, что во внешнем цикле (для последнего это приведет к немедленному его "зацикливанию", во всяком случае, на ближайшие несколько минут, пока rand() не выкинет 10). А вот еще один пример, который показывает удобство использования глобальных переменных внутри функции (листинг 11.11): i Листинг 11.11. Пример функции $Monthes[1]="Январь"; $Monthes[1]="Февраль"; ... и т. д. $Monthes[12]="Декабрь"; Возвращает название месяца по его номеру. Нумерация начинается с 1! function GetMonthName($n) { global $Monthes; return $Monthes[$n]; echo GetMonthName(2); в1водит "Февраль" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 [ 62 ] 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |