Анимация
JavaScript
|
Главная Библионтека Функция Serialize() возвращает строку, являющуюся упакованным эквивалентом некоего объекта $obj, переданного во втором параметре. string Serialize(mixed $Obj) При этом совершенно не важно, что это за объект: массив, целое число Да что угодно. Например: $A=array("a"=>"aa", "b"=>"bb", "c"=>array("x"=>"xx")); $st=Serialize($A); echo $st; выведется что-то типа нечто: a:2:{s:1:"a";s:2:"aa";s:1:"b";s:2:"bb";s:1:"c";a:1:{s:1:"x";s:2:"xx";}} Вообще-то, я не уверен, что в будущих версиях PHP такой формат "упаковки" сохранится неизменным, хотя это очень и очень вероятно. Функция Unserialize(), наоборот, принимает в лице своего параметра $st строку, ранее созданную при помощи Serialize(), и возвращает целиком объект, который был упакован. mixed Unserialize(string $st) Например: $a=array(1,2,3); $s=Serialize($a); $a="bogus"; echo count($a); выводит 1 $a=Unserialize($s); echo count($a); выводит 3 Еще раз отмечу: сериализовать можно не только массивы, но и вообще что угодно. Однако в большинстве случаев все-таки используются массивы. Механизм сериали-зации часто применяется также и для того, чтобы сохранить какой-то объект в базе данных, и тогда без сериализации практически не обойтись. глава 11 Функции и области видимости По синтаксису описания функций PHP, на мой взгляд, довольно близок к идеальной концепции, которую многие программисты лелеют в своем воображении. Вот несколько основных достоинств этой концепции: □ вы можете использовать параметры по умолчанию (а значит, функции с переменным числом параметров); □ области видимости переменных внутри функций представляются в древовидной форме, как и в других языках программирования; □ существует удобная инструкция return, которой так не хватает в Паскале; □ тип возвращаемого значения может быть любым; □ как мы увидим дальше, функции можно использовать не только по их прямому назначению, но и для автоматизации создания "библиотекарей" и даже написания своего собственного интерфейса библиотечных файлов. К сожалению, разработчики PHP не предусмотрели возможность создания локальных функций (то есть одной внутри другой), как это сделано, скажем, в Паскале или в Watcom C++. Однако кое-какая эмуляция локальных функций все же есть: если функцию B() определить в теле функции A(), то она, хоть и не став локальной, все же будет "видна" для программы ниже своего определения. Замечу для сравнения, что похожая схема существует и в языке Perl. Впрочем, как показывает практика программирования на Си (вот уже 30 лет), это не такой уж серьезный недостаток. В системе определения функций в PHP есть и еще один небольшой недочет, который особенно неприятен тем, кто до этого программировал на других языках. Дело в том, что все переменные, которые объявляются и используются в функции, по умолчанию локальны для этой функции. При этом существует только один (и при том довольно некрасивый) способ объявления глобальных переменных - инструкция global (на самом деле есть и еще один, через массив $globals, но об этом чуть позже). С одной стороны, это повышает надежность функций в смысле их независимости от основной программы, а также гарантирует, что они случайно не изменят и не создадут глобальных переменных. С другой стороны, разработчики PHP вполне могли бы предугадать нужность инструкции, по которой все переменные функции становились бы по умол- пример функции Как водится, сразу начну с примера. Предположим, нам необходимо в программе очень часто находить в массиве-списке наибольший элемент, который в то же время меньше какого-то, наперед заданного числа. А именно, нас интересует его номер в массиве (если такого числа в массиве нет, то номер полагается равным -1). Напишем для этой цели функцию (такое описание называется определением функции, и оно, конечно, должно быть единственным в пределах сценария). i Листинг 11.1. Пример функции function GetMaxNum($arr, $max="") { проходимся по всем элементам массива for($i=0,$n=-1; $i<count($arr); { если этот элемент нам пока подходит, запоминаем его if((!Isset($m) $arr[$i]>$m) && ($max==="" $arr[$i]<$max)) { сюда мы попадаем, когда очередной элемент больше текущего, либо же текущего элемента еще не существует ( первый проход) $m=$arr[$i]; запоминаем текущий элемент $n=$i; запоминаем его номер return $n; В отличие от других языков программирования, функцию можно задавать не только в определенном месте программы, но и прямо среди других операторов. Например, вполне можно было бы поместить нашу функцию GetMaxNum() прямо в середину кода, скажем, так: echo "Программа function GetMaxNum($arr,$max) { ... тело функции ... echo " Программа продолжается!"; ( Замечание При таком подходе транслятор, дойдя до определения функции, просто проверит его корректность и оттранслирует во внутреннее представление, но не бу- чанию глобальными - это существенно упростило бы программирование сложных сценариев. 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 |