Массив может и не может
Вы всегда должны использовать кавычки
вокруг индекса ассоциативного массива. Например, пишите $foo['bar'], а не $foo[bar].
Но почему не верна запись $foo[bar]? Вы могли встретить в старых скриптах такой
синтаксис:
$foo[bar] = 'enemy'; echo $foo[bar]; // etc |
Программное
обеспечение ЭВМ разделяют на общее, или системное
Это
неправильно, но работает. Тогда почему неправильно? Суть в том, что этот код содержит
неопределённую константу (bar), а не строку 'bar' (обратите внимание на кавычки),
и PHP может в дальнейшем определить константу, которая, к несчастью для вашего
кода, имеет то же самое имя. Это работает, поскольку неопределённая константа
конвертируется в строку с тем же именем. Испанская
архитектура
Как указано в разделе синтаксис, между квадратными скобками
('[' и ']') должно иметься выражение. Это означает, что вы можете
записать:
Это пример использования return-значения
функции в качестве индекса массива. PHP знает также и о константах, и вы можете
увидеть спереди E_*. Искусство
Тибета — страны в Центральной Азии, расположенной на Тибетском нагорье, —
тесно связано с буддизмом. Буддизм распространился в Тибете в VII столетии, но
наибольшее влияние приобрёл с XV—XVI вв. Светским и духовным правителем страны
стал далай-лама («океан премудрости»). В Тибете в то время были возведены многочисленные
монастыри. Анализ видов и кинетических
параметров движений Равномерное движение Поступательным называют такое движение
твердого тела, при котором всякая прямая линия на теле при движении остается параллельной
своему начальному положению
$error_descriptions[E_ERROR] = "A fatal error has occured"; $error_descriptions[E_WARNING]
= "PHP issued a warning"; $error_descriptions[E_NOTICE] = "This is just an informal
notice"; |
Обратите внимание, что E_ERROR это
такой же идентификатор, как и bar в первом примере. Но последний пример
равносилен записи:
$error_descriptions[1] = "A fatal error has occured"; $error_descriptions[2]
= "PHP issued a warning"; $error_descriptions[8] = "This is just an informal notice"; |
поскольку E_ERROR равна 1, etc.
Тогда как может
работать $foo[bar]? Это работает, поскольку bar, по причине
своего синтаксиса, ожидается как константное выражение. Однако в этом случае константа
с именем bar не существует. PHP теперь принимает, что вы обозначили bar
литерально как строку "bar", но что вы забыли указать кавычки.
S
sem_acquire sem_get
sem_release sem_remove
serialize sesam_affected_rows
sesam_commit sesam_connect
sesam_diagnostic sesam_disconnect
sesam_errormsg sesam_execimm
sesam_fetch_array sesam_fetch_result
sesam_fetch_row sesam_field_array
sesam_field_name sesam_free_result
sesam_num_fields sesam_query
sesam_rollback sesam_seek_row
sesam_settransaction session_cache_expire
session_cache_limiter session_decode
session_destroy session_encode
session_get_cookie_params session_id
session_is_registered session_module_name
session_name session_register
session_save_path session_set_cookie_params
Возвращаемые функциями значения TRUE/FALSE
Большая
часть внутренних функций переписаны таким образом, чтобы возвращать TRUE
при успехе и FALSE при неудаче, в отличие от 0 и -1 в PHP/FI 2.0,
соответственно.
Это новое поведение даёт более логичный код вроде $fp
= fopen("/your/file") or fail("darn!");. Поскольку в PHP/FI 2.0 не было чётких
правил относительно того, что функции должны возвращать при неудаче, большая часть
таких скриптов, должна, вероятно, быть проверена вручную после использования конвертера
из 2.0 в 3.0.
Пример C-9. Миграция
из 2.0: return-значения, старый код
$fp = fopen($file, "r"); if ($fp == -1); echo("Could not open $file
for reading<br>\n"); endif; | |
Пример C-10. Миграция из 2.0: return-значения, новый код
$fp = @fopen($file, "r") or print("Could not open $file for reading<br>\n"); |
|
session_set_save_handler
session_start session_unregister
session_unset session_write_close
set_error_handler set_file_buffer
set_magic_quotes_runtime set_time_limit
setcookie setlocale
settype shell_exec
shm_attach shm_detach
shm_get_var shm_put_var
shm_remove shm_remove_var
shmop_close shmop_delete
shmop_open shmop_read
shmop_size shmop_write
show_source shuffle
similar_text sin
sinh sizeof sleep
snmp_get_quick_print snmp_set_quick_print
snmpget snmprealwalk
snmpset snmpwalk
snmpwalkoid socket_accept
socket_bind socket_close
socket_connect socket_create
socket_create_listen socket_create_pairsocket_get_statussocket_getpeername
socket_getsockname socket_iovec_add
socket_iovec_alloc socket_iovec_delete
socket_iovec_fetch socket_iovec_free
socket_iovec_set socket_last_error
socket_listen socket_read
socket_readv socket_recv
socket_recvfrom socket_recvmsg
socket_select socket_send
socket_sendmsg socket_sendto
Числа с плавающей точкой
Числа с плавающей точкой ("float", "double"
или "real") могут специфицироваться с использованием следующих видов синтаксиса:
$a = 1.234; $a = 1.2e3; $a = 7E-10; |
Размер
float зависит от платформы, хотя максимально возможна величина ~1.8e308 с точностью,
грубо, 14 десятичных цифр (то есть 64 битный IEEE-формат).
| Точность "с плавающей точкой" |
| Весьма
часто простые дроби вроде 0.1 или 0.7 не могут конвертироваться
в их внутренние двоичные представления без потери точности. Это может привести
к парадоксальным результатам: например, floor((0.1+0.7)*10) обычно возвращает
7 вместо ожидаемого 8 как результат внутреннего представления
приблизительного числа 7.9999999999.... Причиной является то, что
невозможно точно выразить некоторые дроби в десятичной нотации конечным количеством
цифр. Например, 1/3 в десятичной форме имеет вид 0.3333333... Итак,
никогда не полагайтесь на точность результата с плавающей точкой до последней
цифры и никогда не проверяйте равенство чисел с плавающей точкой. Если вам нужна
действительно высокая точность вычислений, вы должны использовать math-функции
произвольной точности или gmp. |
socket_set_blocking
socket_set_nonblock socket_set_timeoutsocket_shutdown
socket_strerror socket_write
socket_writev sort
soundex split spliti
sprintf sql_regcase
sqrt srand sscanf
stat str_pad str_repeat
str_replace str_rot13
strcasecmp strchr
strcmp strcoll strcspn
strftime strip_tags
stripcslashes stripslashes
stristr strlen strnatcasecmp
strnatcmp strncasecmp
strncmp strpos strrchr
strrev strrpos strspn
strstr strtok strtolower
strtotime strtoupper
strtr strval substr
substr_count substr_replace
swf_actiongeturl swf_actiongotoframe
swf_actiongotolabel swf_actionnextframe
swf_actionplay swf_actionprevframe
swf_actionsettarget Целые числа
integer
это число из набора Z = {..., -2, -1, 0, 1, 2, ...}
Синтаксис
Целые
числа могут специфицироваться в десятеричной (база 10), 16-ричной (база 16) или
8-ричной (база 8) нотации с необязательным знаком (- или +).
Если вы используете
8-ричную нотацию, первым символом числа должен быть 0 (нуль), для 16-ричной
нотации первыми символами числа будут 0x.
Пример 6-1. Целочисленные литералы
$a = 1234; # 10-ричное число $a = -123; # отрицательное число $a
= 0123; # 8-ричное число (экивалентно 10-ричному 83) $a = 0x1A; # шестнадцатеричное
число (экивалентно 10-ричному 26) | |
Размер
integer зависит от платформы, хотя максимальное значение около 2 миллионов является
обычным (то есть 32-битное знаковое). PHP не поддерживает беззнаковые integer.
Переполнение
Если вы специфицируете число за рамками диапазона типа
integer, оно будет интерпретировано как float. Также, если вы выполняете
операцию, которая даёт в результате число за пределами диапазона типа integer,
будет возвращено float.
$large_number = 2147483647; var_dump($large_number); // на выходе:
int(2147483647) $large_number = 2147483648; var_dump($large_number); // на выходе:
float(2147483648) // это подходит также для специфицированных 16-ричных чисел:
var_dump( 0x80000000 ); // на выходе: float(2147483648) $million = 1000000; $large_number
= 50000 * $million; var_dump($large_number); // на выходе: float(50000000000) |