Статьи,обзоры,справочники по PHP

Альтернативный синтаксис для управляющих элементов.

PHP позволяет использовать альтернативный синтаксис для некоторых управляющих элементов: namely, if, while, for, foreach, и switch.
В общем, суть альтернативного синтаксиса сводится к тому, что вместо открывающейся фигурной скобки { ставите двоеточие (:) и вместо закрывающейся фигурной скобки ставите endif; , endwhile; , endfor; , endforeach;
или ecdswitch; соотвественно.
A равно 5-ти

Альтернативный синтаксис также распространяется на else и elseif. Здесь пример:
if ($a == 5): print "a equals 5"; print "..."; elseif ($a == 6): print "a equals 6"; print "!!!"; else: print "a is neither 5 nor 6"; endif;

Разборщик - мной подразумевается под этим термином механизм обрабатывающий последовательно (символ за символом)
данные на входе и выделяющий в этих данных PHP блоки для дальнейшего их выполнения интерпретатором PHP.

(строго говоря PHP не является компилятором, хотя его так иногда называют - он не переводит программу в машинные коды. PHP начиная с версии 4 перед исполнением программы переводит её полностью или частично в своё внутреннее представление, благодаря чему работает сильно быстрее, чем более ранние версии PHP)

PHP блок - это программа на языке PHP или часть программы, которая начинается с открывающего тега (слова) вида <... и заканчивается закрывающим тегом (словом) вида ...>. Под троеточием подразумеваются любые символы или их отсутствие, в разделе "PHP блоки в HTML" смотрите какие теги допустимы для выделения PHP блока.

Интерпретатор - программа последовательно выполняющая команды. Я использую этот термин в смысле, что php выполяет (то есть интерпретирует) php программу, состоящую из php блоков.

Примечательно, что все PHP блоки выполняются, как единая программа, тогда как вывод результата работы каждого PHP блока ( осуществляемый командами echo() или print() )
происходит для каждого блока отдельно. Однако, программа ниже работать не будет, так как перед каждым тегом ?> автоматически ставится ;


This is true. здесь вы не ждали HTML кода, он допустим, но приведёт к ошибке, так как перед else (то есть после }) будет стоять ; This is false.
Для более глубокого понимания вышесказанного рассмотрим простой пример:

\n"; } ?> Первый HTML вывод.
\n"; tst(); ?> HTML вывод сразу после второго PHP блока.
Как вы думаете, где будет строка "PHP Вывод в функции", вначале HTML файла или вторая с конца?

Оказывается, результатом будет такой документ:

Первый HTML вывод.
PHP вывод сразу после HTML вывода
PHP Вывод в функции
HTML вывод сразу после второго PHP блока.


Объясняется это тем, что вывод функциями вывода, такими как echo(...), происходит последовательно в конец генерируемого документа. То есть интерпретатор PHP помнит всю программу PHP и знает в каком PHP блоке он находится. Вывод происходит из текущего работающего блока в конец, и использоваться может вся программа.

Boolean: Простейший тип переменной. Появился, начия с PHP 4. Выражение типа boolean является утверждением, которое может принимать два значения: TRUE

или FALSE (правда или ложь).

Чтобы сделать переменную типом boolean и определить ей значение, используйте FALSE или TRUE (не важно большими или маленькими буквами), как здесь:

$foo = True; // определить значение // TRUE переменной $foo
Обычно используется какой-либо оператор, который возвращает значение типа boolean, после чего вы проверяете это значение (if, else, elseif, while, ...)

Можно изменить тип переменной, то есть привести её к типу boolean.

Например,
$bar = (bool) 15; // $bar = TRUE

Или
$bar = (boolean) "I'm string"; // $bar = TRUE

Как правило, преобразование в boolean происходит автоматически, например


$num=FALSE; $str="10 yellow pigs"; if($str && $num) { $rslt=TRUE; } else { $rslt=FALSE; } // $rslt=FALSE, because TRUE and FALSE = FALSE
Здесь перечислены значения переменных, которые при преобразовании в boolean дают результат FALSE:

  • integer 0 (ноль)



  • float 0.0 (ноль)



  • пустая строка (string) или строка "0"



  • массив (array) пустой, то есть с количеством ноль элементов



  • объект (object) пустой, без элементов



  • специальный тип NULL (в том числе переменные, значение которых не определено)



  • все остальные значения, в том числе resource, дают результат TRUE


  • Integer: это целое число из множества Z = {..., -2, -1, 0, 1, 2, ...}.

    Синтаксис определения числа integer: числа могут быть определены в десятеричной (основа 10), шестнадцатеричной (основа 16) или восьмеричной (основа 8) системе счисления, при желании перед числом может стоять знак минус или плюс (- или +).

    Если вы используете восьмеричное значение, числу должен предшествовать 0 (ноль). Для шестнадцатеричной нотации числу должно предшествовать 0x. Примеры:

    $a = 1234; # десятеричное число $a = -123; # отрицательное число $a = 0123; # восьмеричное (эквивалентно 83) $a = 0x1A; # шестнадцатеричное (26 десятеричное)
    Размер (предельные значения) числа типа integer зависит от платформы, как правило размер 32 бита (предельные значения +/- 2.15e+9 = 2^31)

    PHP не поддерживает строго положительные числа (unsigned integers).

    Базовые функции

    базовые функции:   пусть ещё не всё понятно, но скоро всё будет ясно.

    int strlen(string $st)

    Возвращает длину строки $st.
    Как примечание: строка может содержать любые символы, в том числе и с ненулевым кодом (в Си это запрещено).

    int strpos(string $where, string $what, int $fromwhere=0)

    Пытается найти в строке $where подстроку $what и, в случае успеха, возвращает позицию этой подстроки в строке, в противном случае возвращает false. $fromwhere - необязательный параметр, если поиск подстроки нужно вести не с начала строки, а с какой-то определённой позиции.

    string substr(string $str, int $from [,int $length])
    Возвращает участок строки $str, начиная с позиции $start, и длиной $length, если $length не задана, то подразумевается строка от $start, до конца строки. Если $start больше, чем длина строки , или же $length=0, то возвращается пустая строка.
    Полезное примечание: если в $start передать отрицательное число, то будет считаться, что это число является индексом подстроки, но только отсчитываемым от конца $str.
    $length тоже может быть отрицательным, тогда последним символом возвращённой подстроки будет символ из $str с этим индексом, определяемым от конца строки.

    Надеюсь, вы ещё не совсем запутались!

    int strcmp(string $str1, string $str2)

    Сравнивает две строки посимвольно и возвращает 0, если строки полностью совпадают; -1, если строка $str1 лексиграфически меньше $str2; 1, если наоборот.
    Примечание: здесь учитывается регистр букв, ибо сравнение идёт побайтово, но если хотите этого избежать, то воспользуйтесь

    int strcasecmp(string $str1, string $str2)

    Примечание: если вы используете строку, на кириллице, то могут возникнуть осложнения, всё зависит от настроек локали.

    Что вы услышите здесь.

    От автора. Вы найдёте множество сайтов и материалов по php, где описывается гораздо больше, чем на этой странице, и более сжатым языком. Я же буду расжёвывать каждый термин. К тому же моё повествование захватывает гораздо больше, чем просто PHP.

    Любопытная деталь: я старался излагать соображения по программированию в таком порядке и с таким количеством ссылок, чтобы вы могли читать с любого места. И в таком объёме, чтобы было много объяснений и повторений, а информации минимум необходимый для написания классических программ (например, материалов этого php сайта хватит, чтобы создать такую прграмму, как форум бридж школы)

    Вы правильно поняли. Я буду редкосным занудой, хотя и постараюсь вас расвеселить и заинтересовать. Если вы считаете себя профессионалом программистом, то смело можете переходить к справочнику по функциям здесь
    или
    к изучению статей, опубликованных на gnezdo.webscript.ru
    , так как вы уже знакомы с основами PHP, особенностями использования переменных, GNU, POSIX (шаблонами)
    и другими темами, которые я затрону ниже.

    Я предполагаю, что вы уже умеете написать простейшую программу на PHP или уже ознакомились с "Введением", где говорилось, что такое "php программа" (или как чаще называют "php скрипт").
    Сравнение синтаксиса PHP и C.. Программа, написанная на PHP, внешне похожа на программу C, хотя можно найти сходства с Perl и Java тоже. Если вы уже знакомы с языком C, вам легко будет научиться программировать на PHP.

    На мой взгляд, синтаксис PHP (внешний вид программы) очень простой для восприятия, например, гораздо проще Perl, так как практически все операции (например работа с шаблонами) происходят через вызов функций (тогда как в Perl есть множество специфических операторов или операторов свойственных различным языкам программирования).

    В принципе, в PHP есть практически все операторы и функции, имеющиеся в стандартном GNU С
    (или их аналоги), например есть циклы (while, for), операторы выбора (if, switch), функции работы с файловой системой и процессами (fopen, *dir, stat, unlink, popen, exec), функции ввода-вывода (fgets,fputs,printf) и множество других...


    Одним из самых больших отличий PHP от C - является использование переменных.

    Переменные в PHP.. Если вы уже знакомы с PHP, то найдёте полезным прочесть описания типов переменных:

    boolean , integer , float , string , array. Дело в том, что это достаточно хороший перевод на русский первоисточников с

    www.php.net
    , где описанно достаточно много тонких моментов по работе с переменными.

    Использовать переменные в PHP так же легко, как, например, в языке BASIC (однако, в PHP имена переменных регистро зависимые, то есть $dog отличается от $Dog, имена переменных начинаются со знака доллар). Вам (как правило) не надо следить за типом переменных. Программа пример ниже работает как со строками, так и с числами, и делает это вполне логично (как мы и ожидаем):

    В то же время из-за столь "свободного" использования переменных часто возникают недоразумения, или даже ошибки. Перечислю несколько недостатков "свободного" обращения с переменными:

    Переменные в PHP не надо объявлять. Вы сразу можете использовать любую переменную, как только присвоете ей значение, а первоначальное значение любой ещё не определённой переменной пустая строка (в принципе PHP в случае использования не определённых переменных порождает предупреждения, если они включены, но посетитель web страницы их не увидет). Бывает, что такой подход к использованию переменных порождает ошибки в программе.

    Вы можете уточнить тип переменной, когда её определяете, если не доверяете эту задачу php. Например, сделаем переменную число:

    $num = (int)"";

    echo gettype($num)." that's value is ".$num;

    // выводит integer that's value is 0

    Вам неизвестны предельные допустимые значения числа. В практике системного программирования часто используется эффект, что для char или byte за числом 255 следует 0, а 254 + 8 = 6. В PHP вам не известна граница числа (зависит от платформы), и даже более того, если при вычислениях вы превышаете эту границу, то PHP автоматически меняет тип вашей числовой переменной на float и эффекта переполнения не происходит. Смотрите раздел integer, для более подробной информации.


    PHP, как и Perl, обладает достаточно мощным механизмом работы со строками. Этот факт поощряет использовать строки. На практике чрезмерное употребление выражений, работающих со строками, сильно замедляет работу программы и увеличивает вероятность ошибок (какие бы проверки мы не ставили перед отправлением строк с данными на обработку, на практике в строку рано или поздно попадёт такое значение, которое приведёт к неправильной работе программы). Хорошей альтернативой строкам является хранение данных в SQL базе, к которой достаточно удобно обращаться из PHP скрипта.

    Какой бы правильной логикой PHP не обладал при работе с переменными различного типа, рано или поздно вы попадёте в ситуацию, когда PHP преобразовал переменную в другую таким образом, что ваши данные потерялись или были частично потеряны. Хороший пример (хотя слегка на другую тему):



    echo (int) ( (0.1+0.7) * 10 ); // выводит 7!


    Двойные кавычки

    Это же, но более подробно, здесь (раздел тип данных string).
    Если строка заключена в двойные кавычки ("), PHP понимает больше различных (специальных) символов выделенных обратной косой чертой, чем если строка выделена одинарными кавычками:

    \n перевод каретки (LF или 0x0A (10 ASCII) ) \r возврат каретки (CR or 0x0D (13 ASCII) ) \t горизонтальная табуляция (HT or 0x09 (9 in ASCII) ) \\ обратная косая черта \$ знак (символ) доллар \" символ двойная кавычка \[0-7]{1,3} - последовательность символов регулярного выражения (регулярным выражением называется 0-7 и им здесь является любое число из цифр от 0 до 7, например 37) - это символ в восьмиричном представлении. \x[0-9A-Fa-f]{1,2} - последовательность символов регулярного выражения - это символ в шестадцатеричном представлении.


    Подсказка: в Windows для перевода строки используется \r\n, а в Unix \n. Информацию, как это явление проявляет себя при использовании строк в php, вы найдёте в разделе тип данных строка (string).

    Если вы попробуете выделить обратной косой чертой какой-либо из не перечисленных выше символов, то эта черта будет напечатанна (то есть будет одним из символов вашей строки)

    Значительно более подробная информация о строках здесь.
    Более подробная информация (когда какие теги можно использовать) здесь


    Функции отрезания пробелов

    Функции отрезания пробелов: Существует несколько функций отрезания пробелов. Я бы хотела познакомить Вас с ними. Они могут Вам понадобиться.

    string trim(string $st)

    Возвращает копию $st, только с удалёнными ведущими и концевыми пробелами. Под пробельными символами будем понимать не только сам пробел " ", но и символ перевода строки \n, символ возврата каретки \r и символ табуляции \t.
    Например
    trim (" test\n ")// вернёт строку "test".

    Эта функция работает оченьбыстро, поэтому её можно исспользовать везде, где есть подозрение на излишние пробелы.

    string ltrim(string $st)

    То же, что и trim ( ), только удаляет исключительно ведущие пробелы, а концевые не трогает. Рекомендуется везде, где можно использовать trim ( ), а не ltrim ( ).

    string chop(string $st)

    Удаляет только концевые пробелы, а ведущие не трогает.

    Статьи,обзоры,справочники по PHP

    Чтобы можно было использовать GMP функции, необходимо "собрать" PHP с опцией --with-gmp

    GMP функции позволяют работать с целыми числами (integers) произвольной длины.
    Вы можете "скачать" GNU MP
    библиотеку GMP функций и получить документацию к ней здесь ( www.swox.com/gmp/ ). Получив библиотеку, вы сможете "собрать" или "пересобрать" PHP с поддержкой данной библиотеки, то есть GMP функций.
    Здесь пример, который вычисляет факториал числа 1000 (весьма не маленькое число получается) очень быстро:



    Будьте осторожны. Если вы передаёте в gmp функцию большое число, позаботьтесь, чтобы оно было строкой. В противном случае PHP воспримет его как обычный integer, если оно состоит из цифр. Как правило, достаточно написать такое число в кавычках, однако для надёжности можно прибавлять ваше число к пустой строке или писать (string)
    перед числом:

    $num=""."9999999999999999999999999999999";
    или $num=(string)"9999999999999999999999999999999";
    Здесь перечисленны некоторые gmp функции:

    gmp_init-- Создаёт gmp число

    gmp_intval -- Переводит GMP число в integer

    gmp_strval -- Переводит GMP число в строку

    gmp_add -- Сложение GMP чисел

    gmp_sub -- Вычесть одно GMP число из другого

    gmp_mul -- Умножение

    gmp_div_q -- Деление

    gmp_cmp -- Сравнить числа

    gmp_sqrt -- Квадратный корень

    gmp_pow -- Возвести число в степень

    gmp_random -- Получить случайное число

    gmp_hamdist -- Вычислить растояние Хемминга двух чисел

    Полный список вы найдёте здесь.
    Строки. Строка - это последовательность символов. В PHP символ (так называемый character или char или chr)
    - это то же самое, что byte. Всего доступно ровно 256 различных символов. В PHP нет встроенной поддержки интернациональных расширенных символьных таблиц (то есть нет Unicode стандарта).
    Замечание: без каких-либо проблем строка может быть очень длинной. PHP не накладывает никаких ограничений на длину строки, так что нет причин беспокоиться по поводу длины строки.

    Как передать параметр в функцию?

    Скажу двумя словами для людей знакомых с языком C, что можно использовать ссылку (чтобы изменение переменной внутри функции влияло на неё вне функции: function tst(&$secreload), аналог function tst(var secreload);
    в Pascal) или обычный параметр функции (тогда в теле функции вы работает с копией первоначальной переменной: function tst($secreload)). Ниже подробнее.

    Вот пример постой функции с одним параметром и с вызовом этой функции:


    Какой будет вывод этой программы? Ответ:

    Привет Вам, это сказал я

    Привет Вам, это сказал я

    Обратите внимание, что в теле функции значение переменной меняется на "Ok, done". Однако, echo $str после вызова функции всё равно отображает предыдущее значение переменной. Вывод: в PHP при передаче параметра в функцию тело функции работает не с самим параметром, а с его копией. Поэтому изменение значения параметра в теле функции не влияет на переменную $str вне функции.

    Если вы хотите в теле функции работать с самой переменной, а не с её копией, то используйте ссылку на переменную. Например, если в примере выше поменять всего одну строку на
    function tst(&$str)
    , то результат работы программы будет такой:

    Привет Вам, это сказал я

    Ok, done

    Однако, в функцию, описание которой содержит ссылку, уже нельзя передать константу в качетсве ссылки, то есть вызов tst("Hello world); для модифицированного примера со ссылкой работать уже не будет.


    Комплексная замена в строке


    string strtr(string $st, array $Substitutes)
    В свете ассоциативных массивов функция strtr( ) является объединением двухфункций strtr( ) и str_replace( ). Она также называется strtr( ), но несёт в себе возможности str_replace( ) (смотри раздел работа с блоками текста).

    Примечание: У этой функции всего 2 параметра, это не ошибка!

    Берёт строку $st и проводит в ней контекстный поиск и замену: ищутся подстроки - ключи в массиве $Substitutes - и замещаются на соответствующие им значения.
    Пример: как можно "отменить" действие функции HtmlSpecialChars( )

    $Trans=array_flip(get_html_translation_table()); $st=strtr($st, $Ttrans);


    В результате из строки, в которой всесимволы заменены на их HTML-эквиваленты, была получена исходная строка.
    Примечание: Функция get_html_translation_table() возвращает таблицу преобразований, которая применяется при вызове HtmlSpecialChars( ).

    основанный на алгоритме корпорации RSA

    string md5(string $st)

    Возвращает хэш-код стоки $st, основанный на алгоритме корпорации RSA Data Security под названием "MD5 Message-Digest Algorithm". Хэш-код - это просто строка, практически уникальная для каждой из строк $st. Другими словами, вероятность того, что две разные строки, переданные в $st, дадут нам одинаковый хэш-код практически равна 0.
    Примечание:длина строки может достигать нескольких тысяч символов, а её MD5 код может занимать максимум 32 символа.

    Алгоритм MD5 был специально для того, чтобы максимально обезопасить вас от компьютерных взломщиков и воспрепятствовать расшифровке вашей информации и входа в систему, если файл с кодами был украден. Т.к. всё же есть вероятность того, что у разных строк MD5 коды всё же совпадут, то, чтобы не дать злоумышленнику войти в систему, перебирая пароли с очень высокой скоростью, алгоритм MD5 работает довольно медленно и его нельзя убыстрить.

    (Идея в том, что из MD5 кода нельзя обратно получить зашифрованную строку, даже если вы знаете алгоритм шифрования)

    Примечание: Для этой же цели можно использовать функцию
    int crc32(string $str)
    которая вычисляет 32-битовую контрольную сумму строки $str, т.е. результат её работы - 32-битное целое число. Эта функция работает гораздо быстрее, чем md5(), но она даёт гораздо менее надёжные хэш-коды для строки. Поэтому всё же рекомендуем использовать функцию md5( ).

    Одиночные кавычки

    Простейший способ определить строку - это заключить её в одинарные кавычки (символ ').
    Чтобы использовать в такой строке символ одинарной кавычки, вам придётся его выделить с помощью обратной косой черты (\). Если вы хотите использовать обратную косую черту в конце строки или перед символом ', то её тоже надо выделить с помощью второй косой черты (\\). Учтите, что символ \ не является символом строки только в тех случаях, когда он следует перед другим символом \ или перед символом '.
    Замечание: в отличии от других двух вариантов записи строки, имена переменных в строке заключённой в одинарные кавычки, не заменяются значениями этих переменных, а являются содержимым этой строки.


    Примеры:

    echo 'простая строка';

    echo 'В строке могут быть вложенные переводы строк,

    как в этом примере.'; // однако строка будет монолитной:

    В строке могут быть вложенные переводы строк, как...

    echo 'Arnold once said: "I\'ll be back"';

    // результат (вывод): ... "I'll be back"

    echo 'Are you sure you want to delete C:\\*.*?';

    // вывод: ... delete C:\*.*?

    echo 'Are you sure you want to delete C:\*.*?';

    // вывод: ... delete C:\*.*?

    echo 'I am trying to include at this point: \n a newline';

    // вывод: ... this point: \n a newline<

    Одно замечание по поводу деления целых чисел.

    PHP поддерживает операции >, так что, если вам нужна целая часть от деления на число равное степени 2, вы можете делать побитовый сдвиг вправо. Как правило, так как числа с плавающей точкой 64-ёх битные, а не 32-ух битные, все возможные значения целых 32-битных чисел могут быть представлены однозначно, как float, поэтому нет риска ошибки округления, когда делаем (int)(n1/n2). Дополнительные расходы на преобразование к float и обратно можно игнорировать для языков интерпретаторов, таких как PHP, так как механизм PHP сильно оптимизирован (тестирование подтвердило, что выполнение операции $a/$b занимает незначительно больше времени, чем $a>>$b или $a*$b для целых чисел $a и $b).

    Автор замечания carl@NOSPAM.thep.lu.se (22-Aug-2001 04:51),

    перевод avlarkin@iname.ru (декабрь 2001).
    Числа с плавающей точкой. Числа с плавающей точкой могут быть определены каким-либо из ниже перечисленных способов:
    $a = 1.234; $a = 1.2e3; $a = 7E-10;


    Обозначение e[число n], например E-10 или e2, значит, что число, после которого следует такая запись, умножается на 10 в степени n. Например, 1.2e3 значит 1.2 умножить на 10 в степени 3.
    Размер числа float зависит от платформы, по крайней мере максимальное значение заведомо не больше ~1.8e308 и точность числа около 14 цифр после точки десятичной дроби (это 64-битный IEEE формат).

    Переполнение Integer числа.

    Если вы определяете число выходящее за предельные значения типа integer, оно будет восприниматься интерпретатором php, как float тип, а не Integer. Аналогично, если вы производите операцию, которая возвращает число превышающее максимальные значения Integer, то это число возвращается, как float число (то есть число с плавающей точкой).

    $large_number = 2147483647; var_dump($large_number); // вывод: int(2147483647)
    $large_number = 2147483648; var_dump($large_number); // вывод: float(2147483648)
    // это верно и для шестнадцатеричных чисел: var_dump( 0x80000000 ); // вывод: float(2147483648)
    $million = 1000000; $large_number = 50000 * $million; var_dump($large_number); // вывод: float(50000000000)


    Перевод в различные системы счисления


    string base_convert(string $number, int $frombase, int $tobase)
    Переводит число $number (создано как строка в с/с по основанию $frombase) в систему по основанию $tobase. Параметры $frombase и $tobase могут принимать значения от 2 до 36.

    int bindec(string $binary_string)
    Преобразует двоичное число $binary_string, в десятичное число.

    string decbin(int $number)
    Возвращает строку, которая является двоичным представлением целого числа $number. Максимальное число, которое ещё может быть преобразовано - 2147483647, которое выглядит как 31 единичка в двоичной системе.
    Примечание: Существуют аналогичные функции для восьмеричной и шестнадцатиричной систем. Называются они также, только вместо "bin" ставится "oct" и "hex".

    Php_links


    Php_links

    Московский Институт Электроники и Математики
    Центр Современные Информационные Технологии
    и Математическое Образование

    Php_links
    Введение
    Основы PHP Функции Советы Ссылки Форум

    Php_links Php_links


    Получение части массива


    array array_slice(array $Arr, int $offset [, int $len])
    Возвращает часть ассоциативного массива, начиная с пары ключ=>значение сосмещением $offset от начала и длиной $len (если не задан, то до конца массива).
    Примечание: Параметры $offset и $len могут быть отрицательными (Задаются по таким же правилам, что и у функции substr( ) смотри базовые функции)
    Пример:
    В этом разделе:
    Php_links Cсылки на документацию по PHP

    Php_links Форумы по PHP

    Php_links Программное обеспечение

    Php_links PHP-скрипты

    www.php.net EN

    Сайт поддержки PHP, сожержит массу материалов по PHP.
    php.fud.ru RU

    Алфавитный справочник по функциям PHP. Описания функций, предельно кратко, зато есть все основные функции.
    http://www.webclub.ru/content/programming_php/article-69.html RU

    Хороший перевод оригинального английского описания функций PHP 3.0 на русский язык от webclub (сортировка функций по тематике).
    http://php.spb.ru RU

    На этом сайте Вы найдете отличное собрание статей и описаний по практическому программированию на PHP. Прежде чем лезть на форумы с вопросом, советуем заглянуть сюда!
    http://www.egor.spb.ru/doc/db/mysql/18.html RU

    Простой html текст с подробным описанием функций php, интерфейса никакого нет. какое отношение имеет к mysql - непонятно. :)
    ftp://ftp.omskelecom.ru/Programming/PHP4/php406.chm EN

    Справочник по PHP 4.06, оформленный в виде help-файла.
    http://www.phpclub.net EN

    Самый большой форум в России, посвященный проблемам программирования на PHP, поддерживается PHP клубом.
    http://forum.mysoft.ru RU

    Один из активных форумов по PHP, на нем обсуждаются самые разнообразные прикладные вопросы, но часто он не работает из-за перегрузки сервера.
    http://www.belarusmedia.com/ RU

    Очень "мудрый" форум по PHP, его полезно посетить, если хотите узнать ответ на слжный вопрос по проектированию приложений на PHP.
    ftp://ftp.omskelecom.ru/Programming/PHP4/

    На этом ftp можно найти поледние версии PHP под win32, а также справочник по функциям
    http://www.webscript.ru


    Большая библиотека ссылок на PHP скрипты. Есть ократкие описания, сортировка по категориям применения скриптов. Есть форуммы, чаты, галереи, рейтинги, скрипты администрирования и т. д....

    http://www.belarusmedia.com/ RU

    Очень "мудрый" форум по PHP, его полезно посетить, если хотите узнать ответ на слжный вопрос по методам решения поставленных задач на PHP.

    Php_links


    Php_links

    c1999-2001 ITSoft, Александр, Андрей, Оля и Даша
    Php_links

    $input=array ("a","b","c","d","e"); $output=array_slice($input,2); //"c","d","e" $output=array_slice($input,2,-1);//"c","d" $output=array_slice($input,-2,1);//"d" $output=array_slice($input,0,3); //"a","b","c"


    Примечание:
    Если вам необходимо не только возвратить подмассив, начиная с определённого индекса максимальной длины, а ещё и заменить только что указанные элементы, на что-то определённое, то воспользуйтесь функцией
    array array_splice(array $Arr, int $offset [, int $len] [, int $Repl]) Её параметры имеют такие же свойства, что и array_slice. Если $Repl не указан, т.е. не указано то, на что заменять, то в этом случае указанные элементы массива просто удаляются.
    Пример:

    $input=array("red","green","blue","yellow"); array_splice($input,2); // Теперь $input===array("red","green") array_splice($input,1,-1); // Теперь $input===array("red","yellow") array_splice($input,-1,1, array("black","maroon")); // Теперь $input===array("red","green","blue","black","maroon") array_splice($input,1,count($input),"orange"); // Теперь $input===array("red","orange")


    Посылка писем через РНР.


    Одно из самых мощшых средств РНР - возможность автоматической посылки писем по электронной почте, минуя использование внешних программ и утилит. Функция отсылки встроена в РНР. Это и есть функция mail( ).

    bool mail(string $to, string $subject, string $msg [, string $headers])
    Посылает сообщение с телом $msg (это многострочная строка, строки которой разделенны символом превода строки)
    по адресу $to (можно задать сразу несколько получателей, разделив их адреса пробелами). В случае, если задан четвёртый параметр, то переданная в нём строка вставляется в конце стандартных почтовых заголовков (таких как То, Content-type и т.д.) и перед началом текста письма.
    Примечание:
    Избегайте переводов строк в конце строки subject, если вы передаёте поле subject во втором параметре функции mail. Функция mail автоматически ставит перевод строки, если параметр $subject не есть пустая строка.
    Примечание:
    Рекомендуется включить заголовки прямо в текст письма $msg (в начало тела), отделив их от самого письма пустой строкой (как в стандарте НТТР). То же самое применимо и к параметру $subject: лучше задавать в нем пустую строку и указывать заголовок Subject в самом письме.
    Примечание:
    Полагаю, ясно, что русских кодировок очень много и от того, насколько правильно вы их зададите, зависит получит ли ваше письмо указаный адрессат. Поэтому, попробуем разобраться.
    Для начала договоримся, что функции mail( ) передавать только адрес и текст письма. Заголовок и тема должны быть указаны в самом письме.
    Пример:

    $message= "From: Лист рассылки To: Иванов Иван Иванович Subject: Пробная рассылка Content-type: text/plain; charset=window-1825
    Приветствуем Вас! Это письмо послано почтовым роботом. Всего хорошего!"; Mail ("ivanov@ivan.ivanovich.ru", "", $message);


    Обратите внимание на то, что заголовок Content-type в некоторых системах обязательно должен стоять последним. Он задаёт, что письмо доставляется как простой текст (text/plain) и что его кодировка Windows (с тем же успехом вы можете задать иное содержимое письма с помощью Content-type, например файл определённого формата). Тело письма отделяется от заголовка пустой строкой, чтобы почтовой программе было понятно, где кончаются заголовки и начинается тело письма.

    Смена кодировки
    Это письмо будет читаемо в 90% существующих почтовых программ, но чтобы их можно было прочесть и в оставшихся 10% желательно посылать письма не в Windows-кодировке, а в KOI8. Для перекодирования можно использовать функцию convert_cyr_string( ). В Content-type нужно заменить charset на koi8-r. Вывод строки Content-type тогда будет такой (часто charset пишут на слеюущей строке после content-type):


    echo("Content-Type: text/plain;\n"); echo(" charset=\"koi8-r\"\n\n");

    Вот что вышло:

    $message= "From: Лист рассылки To: Иванов Иван Иванович Subject: Пробная рассылка Content-type: text/plain; charset=koi8-r

    Приветствуем Вас! Это письмо послано почтовым роботом. Всего хорошего!"; $message=convert_cyr_string($message,"w","k"); Mail ("ivanov@ivan.ivanovich.ru", "", $message);

    Если бы мы не позаботились о том, чтобы все заголовки и $subject находились внутри тела письма, то нам бы пришлось использовать convert_cyr_string( ) не один раз, а несколько (для перекодировки параметров).

    Проблема с заголовками
    При подобном использовании заголовка Content-type возникает проблема, ибо существуют почтовые программы, которые понимают этот заголовок, но не понимают русский текст в поле Subject, если оно стоит до Content-type. Но другие почтовые системы требуют, чтобы Content-type стоял последним заголовком в списке. Чтобы решить эту проблему, проще всего разместить поле Content-type сразу в двух местах - перед первым и после последнего заголовка. Это может показаться весьма надуманным и искуственным методом, на работает отменно. Теперь ваше письмо сможет прочесть любой пользователь, даже если его почтовая программа вообще не настроена ни на какую кодировку.

    Другая проблема состоит в том, что функция mail, как правило, работает долго. На машине unix данная функция всего лишь запускает программу /usr/sbin/sendmail. По умолчанию, как правило, программа sendmail не возвращает вам управления до тех пор, пока письмо не будет отправленно. То есть одно или несколько писем вы можете отправлять функцией mail не задумываясь, а если вы хотите отправить 20 писем или более, то поставьте экспиремент: если при отправке 100 писем на различные адреса функцией mail не произойдёт timeout, то вы можете ей спокойно пользоваться. Если же произошёл timeout (в browserе вы не получили ответа), то обратитесь к системному администратору с просьбой проверить настройки функции mail и программы sendmail или используйте решение, описанное здесь.

    Одно из решений - полностью завершить вывод HTML документа, после чего записать содержимое вашего письма во временный файл и передать управление программе Perl, которая уже займётся отправкой писем:

    fwrite($fd,'From: '.$adr."\n"); fwrite($fd,'Subject: '.$sbj."\n"); fwrite($fd,'To: tst@mail.ru'."\n"); fwrite($fd,"Content-Type: text/plain;\n"); fwrite($fd," charset=\"koi8-r\"\n\n"); fwrite($fd,$letteri); fclose($fd); system('perl ./smail.pl &> error 1>/dev/null 2>&1'); // все дополнительные параметры &> error 1>/dev/null 2>&1

    // перенаправляют весь вывод (стандартный и вывод ошибок) // в никуда, чтобы этот вывод не попал в // генерируемый html документ.

    в результате которой вышесказанное не

    К сожалению, в PHP была ошибка, в результате которой вышесказанное не всегда так для отрицательных чисел. Например, когда вы производите операцию -50000 * $million, результат будет -429496728. Когда оба числа положительны, такой проблемы нет.

    Ошибка исправлена в PHP 4.1.0.

    В PHP нет операции деления чисел integer (возвращающей челую часть в результате деления двух целых чисел). Например, деление 1/2 даёт результат float 0.5.

    var_dump( 25/7 ); // output: float(3.5714285714286)

    Приведение переменной к типу integer.

    Чтобы перевести переменную в число (привести тип к Integer), используйте (int) или (integer). Например,

    $num = (int)"10 yellow pigs"; // result is 10

    Как правило, изменять тип переменной не нужно, так как если используется оператор, функция или управляющий элемент, требующие целое число, то приведение переменной к типу число произойдёт автоматически.

  • FALSE при приведении к integer даёт 0 (ноль),

    TRUE даёт 1 (один).


  • При приведении чисел с плавающей точкой (float) к целым (integer) происходит округление к нулю. Пример:

    $num = (int)10.9; // result is 10


  • Если значение числа float выходит за границы целого числа integer, то результат не определён, так как число float не обладает достаточной точностью, чтобы представить его в виде какого-либо целого числа. В такой ситуации нет ни предупреждения, ни какого-либо сообщения!

    Внимание! Никогда не приводите неизвестную дробь к целому числу, так как иногда это приводит к неожиданным результатам.

    echo (int) ( (0.1+0.7) * 10 ); // выводит 7!


  • Для строк смотрите раздел "приведение строк".


  • Для остальных типов.

    К чему приводит приведение других типов к целому числу на данный момент не определено. Впрочем, происходит так, как если вначале приводим тип к boolean, а потом к integer, но данное положение вещей может измениться без каких-либо предупреждений.

    "Продвинутое использование PHP блоков"

    This is true. This is false.


    Как вы думаете? Будет ли работать этот пример, если перед else
    будет HTML вывод, например так:
    ... } ?> TEST

    Ответ на вопрос вы найдёте здесь. Подробнее: как происходит обработка php блоков.


    Пример выше работает так, как вы ожидаете, поскольку когда PHP встречает ?> закрывающий тег, он просто продолжает вывод всего, что встретит, пока не встретит другой открывающий тег. Приведённый пример, конечно, придуманный, но для вывода крупных кусков текста, вынос этого текста за пределы PHP кода, как правило, более эффективен, чем отправление этого текста на вывод из PHP кода, используя команды echo() или print() или схожие команды.
    Управляющие элементы.
    Вам должно быть знакомы ниже перечисленные управляющие элементы php:

    if else elseif while do..while for foreach break continue switch declare require() include() require_once() include_once()

    Выражение - "что угодно, у чего есть значение". Простейшие выражения:

  • 5

  • $a

  • $b=4;

  • $a=$b+$c*3;

  • $a <= 5 - условное (или логическое) выражение

    Любая PHP программа состоит из серии утверждений. Утверждение может быть выражением, вызовом функции, циклом, условным (логическим) выражением или даже пустым утверждением (которое ничего не делает). Утверждение, как правило, завершается точкой с запятой (;). Также утверждения могут быть сгрупированны в группу-утверждений, если их заключить в фигурные скобки. Группа-утверждений сама является утверждением.


    Простая форма

    Одна из наиболее удобных и приятных особенностей PHP - это его способность автоматически передавать значения переменных из форм в переменные PHP. Это очень облегчает обработку форм. Например, Вы обрабатываете форму, которая имеет поле ввода следующего вида:

    и в то время, когда выводится страница с этим PHP-кодом, переменная $name имеет значение Glen Morris.
    Тогда Вы можете вывести это значение на экран: echo "Hi $name!";
    или вставить проверку в условном операторе: if ($name == "Glen Morris") { echo "Please check your email."; }
    Это позволяет организовать обработку форм с помощью PHP. Рассмотрим небольшой пример, в котором попросим посетителя ответить на несколько вопросов (указать имя, электронный адрес и еще кое-что) и сформируем выводимую страницу в зависимости от его ответов.
    Вначале разделим нашу страницу на две части. Но не будем создавать две отдельные страницы (одна для формы, другая для CGI-скрипта, который эту форму обрабатывает), а создадим одну PHP-страницу, вид которой изменяется в зависимости от результатов анализа данных, введенных посетителем в имеющуюся на этой странице форму.
    Вывод формы

    Первая функция служит для вывода формы:

    function display_form() {

    global $PHP_SELF;

    ?>



    Имя:

    Любимый сорт сыра: Very soft French Brie

    Farmhouse English Cheddar

    Italian Buffalo Mozzarella


    Когда Вы предпочитаете есть сыр:

    На завтрак

    В обед

    На ужин

    Поздно ночью








    }

    ?>

    Большая часть представленного выше текста есть обычный HTML-текст, необходимый для формирования формы. Однако есть пара сложных моментов, требующих особого пояснения.

    Во-первых, это переменная $PHP_SELF. $PHP_SELF - это удобная форма ссылки, ее значение равно URL текущей страницы. Мы задаем атрибуту TARGET

    этой формы значение $PHP_SELF, потому что мы хотим, чтобы эта страница обрабатывала форму. Используя $PHP_SELF

    вместо реального пути к файлу страницы, мы получаем возможность переименовывать или перемещать наш скрипт, не заботясь о внесении соответствующих изменений каждый раз, как только мы заново используем тот же кусок кода.

    Кстати, строка

    global $PHP_SELF;

    означает, что мы хотим использовать глобальную переменную $PHP_SELF. Внутри функции переменные имеют локальную сферу действия, то есть имеют значения, отличающиеся от значений переменных с теми же самыми именами, но определенных вне этой функции. Если мы не укажем PHP, что хотим использовать глобальное значение $PHP_SELF, мы обнаружим, что $PHP_SELF будет пустым.

    Во-вторых, как Вы могли заметить, мы свободно переходим в режим PHP и обратно даже внутри функции. Это полностью законно. PHP умеет игнорировать HTML-код и выделять только PHP-блоки. Это быстрее, чем оставаться в режиме PHP и организовывать вывод HTML, используя echo.


    Теперь обратите внимание на атрибут NAME тега INPUT. Вы видите, что в случае, если тип поля ввода есть CHECKBOX, то после наименования поля (в данном случае times[]) стоит пара квадратных скобок, Если же тип поля ввода есть RADIO, то после имени (cheese) таких скобок нет. Это объясняется тем, что поля типа RADIO служат для выбора одного и только одного из вариантов ответа, поэтому значением переменной cheese будет одна строка. Поля типа CHECKBOX (их несколько) позволяют выбрать (или не выбрать) каждый из возможных вариантов, поэтому для сохранения ответов пользователя PHP должен запомнить их в виде массива. Добавление [] после имени переменной times и указывает на то, что в данном случае это массив, а не единичная переменная.

    И, наконец, в этом куске кода имеется скрытая переменная с именем stage. Мы используем $stage чтобы сказать программе, хотим ли мы вывести форму или отобразить результаты обработки ответов.

    Обработка формы

    Теперь рассмотрим функцию process_form()

    обработки формы после ввода ответов пользователем.


    function process_form() {

    global $name;

    global $cheese;

    global $times;

    if ($cheese == 'brie') { $cheese_message = 'I love brie.'; }

    elseif ($cheese == 'cheddar') { $cheese_message = 'Cheddar is awesome!'; }

    else { $cheese_message = 'Fresh mozzarella is divine.'; }

    $favorite_times = count($times);

    if ($favorite_times <= 1) {

    $times_message = 'You should eat cheese more often.';

    } elseif ($favorite_times > 1 && $favorite_times < 4) {

    $times_message = 'Those are good times to eat cheese.';

    } else {

    $times_message = 'You are eating too much cheese.';

    }

    echo "Hello $name.";

    echo "$cheese_message $times_message";

    }

    ?>

    Во-первых, так же как мы делали это с $PHP_SELF, мы считываем глобальные значения переменных, включенных в форму. Затем мы смотрим, какой сорт сыра выбрал пользователь и в соответствии с этим формируем начало выводимого на страницу текста .


    Далее используется функция count() для того, чтобы подсчитать, сколько раз в день ест сыр человек, ответивший на наши вопросы. Если в предыдущем случае мы должны были сравнить ответ посетителя с каждым из возможных значений переменной $cheese, то при анализе значений переменной $favorite_times

    можно воспользоваться операциями сравнения "меньше чем" и "больше чем". Знаки && в условном операторе "$favorite_times > 1 && $favorite_times < 4" означают логическую операцию "И" ("and"). То есть $favorite_times должно одновременно быть больше 1 и меньше 4 для того, чтобы условие было выполнено.

    Ну, и наконец, выводим введенное человеком имя и наше сообщение для него (нее). Вы, конечно, можете придумать множество более интересных действий, таких как сохранение введенной информации в базе данных или формирование запроса к какому-то хранилищу данных и вывод полученных результатов в красиво оформленном виде.

    Формируем Putting the Form Together

    Теперь, когда мы имеем эти две функции, остается добавить только маленький кусочек кода для того, чтобы вызвать их в нужной последовательности. Итак, после (или ниже) записи тела функций display_form() и process_form() добавляем:


    if (empty($stage)) { display_form(); }

    else { process_form(); }

    ?>

    Здесь мы вначале проверяем, задано ли какое-либо значение переменной $stage. В PHP переменная считается пустой (empty), если ее значение не задано явно (то есть ей никогда не придаются значения по-умолчанию), или ей задано пустое значение (переменной присвоено значение пусто, если она приравнена пустой строке - '', или ей присвоено значение 0). Когда посетитель впервые попадает на нашу страницу, переменная $stage пуста. Поэтому на страницу будет выводиться форма с нашими вопросами; в противном случае мы должны обработать заполненную форму. И это все, что мы хотели сказать об обработке простых форм с помощью PHP.

    Первой заповедью веб-программиста, желающего написать более-менее защищенное веб-приложение, должно стать "Никогда не верь данным, присылаемым тебе пользователем". Пользователи - это по определению такие злобные хакеры, которые только и ищут момента, как бы напихать в формы ввода всякую дрянь типа PHP, JavaScript, SSI, вызовов своих жутко хакерских скриптов и тому подобных ужасных вещей. Поэтому первое, что необходимо сделать - это жесточайшим образом отфильтровать все данные, присланные пользователем.
    Допустим, у нас в гостевой книге существует 3 формы ввода: имя пользователя, его e-mail и само по себе тело сообщения. Прежде всего, ограничим количество данных, передаваемых из форм ввода чем-нибудь вроде:

    Проверка существования.

    Функция IsSet($varname) позволяет выяснить определена-ли переменная. Возвращает TRUE, если переменной присваивалось ранее какое-либо значение или если она была фактически определена (например, переменная $foo может быть определена значением 'true', если php скрипт вызвали с параметром script.php?foo=true).

    Функция UnSet($varname) позволяет удалить переменную. Соотвественно, теряется значение переменной и функция IsSet($varname) после вызова UnSet($varname) возвращает FALSE.

    Работа с блоками текста

    Работа с блоками текста:  Здесь мы рассмотрим функции, которые бывают полезны при однотипной работе с многочисленными блоками текста.

    string str_replace(string $from, string $to, string $str)
    заменяет в сторке $str все вхождения строки $from на $to и возвращает результат. Исходная строка при этом не меняется. Если нет неоюходимости в какой-нибудь экзотической замене, то рекомендуется использовать именно эту функцию, а не ereg_replase, ибо она работает значительно быстрее. Примечание: C помощью этой функции можно, например заменить все символы перевода строки на их HTML-эквивалент, но для этого может быть применена и функция
    string n12br(string $string)

    string WordWrap(string $st, int $width=75,string $break="\n")
    Эта очень полезна при форматировании текста письма перед отправкой его по адресу при помощи mail( ). Разбивает блок текста $st на несколько строк, завершаемых символами $break, так, чтобы на одной строке было не более $width букв. Возвращается строка, с символами перевода строки, переданными в $break.
    Расмотрим пример как мы можем отформатировть текст, предворив каждую строку префиксом ">":

    function Cite($OurText, $prefix=">") { $st=WordWrap($OurText, 60-strlen($prefix), "\n"); $st=$prefix.str_replace("\n", "\n$prefix", $st); return $st }


    string strip_tags (string $str [, string $allowable_tags])

    Эта функция удаляет из строки все тэги и возвращает результат. В параметре $allowable_tags можно передать те тэги, которые не следует удалять из строки. Они должны перечисляться вплотную друг к другу.

    string str_repeat(string $st, string $number)
    Функция "повторяет" строку и возвращает объединённый результат.
    Пример:
    echo str_repeat("test!", 3);// выводит test!test!test!

    Работа со списками

    Под списками мы будем подразумевать массивы, ключи которых начинаются с 0 и не имеют пропусков.
    sort( )
    производит сортировку списка,по значениям в порядке возрастания.

    Примечание: Функция rsort ()делает то же, но упорядочивает не по возрастанию, а по убыванию.

    shuffle( )
    Перемешивает список, переданный ей первым параметром, так, чтобы его значения распределялись случайным образом.
    Примечание: Во-первых, изменяется сам массив, а во-вторых, ассоциативные массивы воспринимаются как списки.

    Примечание:
    Функция использует стандартный генратор случайных чисел, который передработой необходимо инициализировать припомощи srand( )

    Символические ссылки.


    Символическая переменная - это всего лишь строковая переменная, хранящая имя другой переменной. Оператор разыменования $$ (два доллара)
    позволяет получить доступ к переменной по её имени, хранящемся в строковой переменной (в примере выше такое имя хранится в $p, и доступ мы получаем к переменной $a).

    Строка может быть определена тремя

    Строка может быть определена тремя разными способами:

    1. Одиночные кавычки

    2. Двойные кавычки

    3. Heredoc, Естественный синтаксис (как есть)

    Случайные числа


    int mt_rand(int $min=0, int $max=RAND_MAX)
    Функция возвращает случайное число достаточно равномерно. Числа, сгенерированные ею достаточно равновероятна. Если вы хотите генерировать числа от 0 до RAND_MAX (константа, задающая максимальное случайное число, её можно получить при вызове mt_getrandmax), то задайте соответствующий интервал в параметрах $min и $max.
    Примечание: НЕ Забудьте! Перед первым вызовом этой функции запустить mt_srand( ), которая настраивает генератор случайных чисел на новую последовательность.
    Пример: Извлечение строки со случайным номером из текстового файла.

    for($i=0; mt_rand(0, $i)


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

    Этот способ работает в соответствии с теорией вероятностей, т.е. для 1-ой строки вероятность её извлечения будет 100%, для 2-ой - 50% (она перепишется поверх первой), для 3-ей - 33% и т.д.
    Примечание: Если файл состоит из 3-х строк, то вероятность извлечения 3-ей - 33%, а 1-ой или 2-ой 66%. Вероятность извлечения 2-ой строки после первой 50%, а 50% от 66% будет также 33%, т.е. вероятность извлечения каждой строки одинакова. Ну, мне уже надоело всё это проверять. Скажу, что для любого количества строк всё также, но если не верите, то проверьте сами, теорию вероятностей небось изучали!
    Случайные числа Случайные числа
    c1999-2001 ITSoft, Александр, Андрей, Оля и Даша Случайные числа

    Сортировка массивов


    asort( )
    сортирует массив, указанный в её параметре так, чтобы его значения шли в алфавитном (если это строки) или в возрастающем (если это числа) порядке. При этом сохраняются связи между ключами и соответствующими им значениями.

    Примечание: Функция arsort ()делает то же, но упорядочивает не по возрастанию, а по убыванию.

    ksort( )
    Практически идентична функции аsort( ) лишь с тем различием, что упорядочивает не по значениям , а по ключам.
    Примечание: Функция krsort( ) осуществляет ту операци., что и ksort( ) с таким же отличием.

    Примечание:
    Если нужно сделать сортировку по более сложному критерию, то следует воспользоваться функцией uksort( ), написав предварительно функцию сравнения с двумя параметрами.

    Примечание:
    Функция uasort( ) Производит сортировку, сходную с сортировкой uksort( ), с той лишь разницей, что она производится не по ключам, а по значениям.

    Теги поддерживаемые PHP.

    Примеры. Как определить PHP код в HTML файле:

    1.
    Эта короткая запись аналогична
    2.
    Точка - это оператор конкатенации строк, здесь "aaa"."bbb"="aaabbb"
    3.
    4. <% echo ("Вы можете использовать теги ASP-стиля"); %>
    <%= $var; # Это краткая запись для echo $var %>


    Более подробная информация (когда какие теги можно использовать) здесь
    Теги поддерживаемые PHP.

    Теги поддерживаемые PHP.
    ©1999-2001 ITSoft, Александр, Андрей, Оля и Даша Теги поддерживаемые PHP.
    Примеры. Как определить PHP код в HTML файле:

    1.
    Эта короткая запись аналогична
    2.
    Точка - это оператор конкатенации строк, здесь "aaa"."bbb"="aaabbb"
    3.
    4. <% echo ("Вы можете использовать теги ASP-стиля"); %>
    <%= $var; # Это краткая запись для echo $var %>

    Первый вариант возможен, только если краткая форма тегов включена. Включить её можно, используя функцию short_tags() (которая есть только в PHP 3), или включив short_open_tag в php.ini конфигурационном файле, или скомпилировав PHP с включённой опцией --enable-short-tags.

    Второй пример является наиболее оптимальным, так как работает в большинстве случаев, например, в XML коде (в XHTML документе).

    Четвёртый пример работает, только если включены теги стиля ASP, используя установку asp_tags (аналогична установке short_open_tag, в php.ini файле). Поддержка ASP-стиля тегов возможна, начиная с 3.0.4 версии PHP.

    Закрывающий тег PHP "съедает" перевод строки, если перевод следует непосредственно за ним. Например, такой код
    Example" ?>
    эквивалентен одной HTML строке Example

    Так же следует отметить, что точка с запятой (;) автоматически добавляется перед закрывающим тегом php, поэтому в конце блока php необязательно ставить точку с запятой, что видно в только что приведённом примере.

    PHP позволяет использовать такие конструкции, как в примере ниже.

    Точность числа с плавающей точкой.

    Довольно часто бывает, что простые десятичные числа, такие как 0.1 или 0.7, не могут быть переведены в их бинарное представление без небольшой потери точности. Это может привести к неожиданным результатам: например, floor((0.1+0.7)*10), как правило, вернёт 7, вместо ожидаемого 8, что есть результат примерно такого внутреннего представления числа: 7.9999999999....
    Такая ситуация наблюдается так же в случаях, когда невозможно точно определить некоторые дроби в десятичном представлении с конечным числом знаков после точки. Например, 1/3 в десятичном представлении будет 0.333333...
    Поэтому, никогда не доверяйте в абсолютной степени результатам вычислений, где используются или могут использоваться числа с плавающей точкой и никогда не сравнивайте такие числа на равенство (никогда не делайте так: if($float1==$float2) - возможно данное выражение почти всегда будет ложным). Если вам всё же нужна высокая точность, придётся использовать математические функции с ограниченной точностью или gmp функции.

    Установка типа переменной.

    Выше вы только что видели пример, как определить переменную число. Если же у вас уже определена переменная, PHP предусмотрел способ безопасного приведения этой переменной к другому типу: функция settype($varname,$type), где $type - это boolean, integer, floar, string, array, object, null, пытается изменить тип переменной на $type. Безопасной эта функция является, так как в случае невозможного преобразования (например строку "cat" в число PHP преобразовать не умеет,
    в отличие от "10 cats"
    ) возвращает false (то есть невозможное преобразование не породит ошибку в программе; на практике преобразование вида $num=(int)"cats"; тоже ошибки не породит, но вы не будете знать, что данное преобразование не возможное, не корректное).

    Для информации что во что можно преобразовать смотрите разделы по типам переменных (boolean, integer, ...). В конце каждого раздела написанно во что можно данный тип преобразовать и что вы получите в результате преобразования.
    PHP блоки в HTML коде.

    Когда разборщик PHP обрабатывает файл, он просто ищет специальный тег, который сообщает ему, что надо начать интерпретацию последующего текста, как PHP кода. Далее разборщик "выполняет" (на самом деле подготавливает к выполнению) весь найденный код до того места, где встречает закрывающий PHP тег, который просто говорит разборщику снова пропускать сквозь себя текст без обработки. Именно этот механизм позволяет вам заключать PHP код внутри HTML: всё вне тегов PHP остаётся без изменения, тогда как всё внутри интерпретируется, как PHP код.
    Есть четыре типа тегов, в которые можно заключать PHP код в HTML файле. Из них, только два вида тегов
    и
    всегда доступны. Остальные могут работать или не работать, в зависимости от того включены они или выключены в php.ini файле.

    Вставка/Удаление элементов


    int array_puch(alist &$Arr, mixed $var1 [, mixed $var2,...])
    Добавляет к списку $Arr элементы $var1, var2 и т.д. Она присваивает им числовые индексы, также, как это происходит для стандартных [].
    Примечание: Если вам нужно добавить элементы не в начало, а в конец массива, то воспользоваться функцией
    int array_unshift(list &$Arr, mixed $var1 [, mixed $var2,...]) Причём порядок следования элементов остаётся таким же, они как бы "вдвигаются" в список слева.
    Примечание: Если вам нужно добавить всего 1 элемент, то можно сделать и так:

    array_push($Arr,1000);//вызываем функцию $Arr=100; //то же, но короче


    mixed array_puch(list &$Arr)
    Снимает элемент с "вершины" стека (последний элемент списка) и возвращает его, удалив после этого его из $Arr. Если список был пуст, то возвращается пустая строка.
    Примечание: Если вам нужно извлечь первый элемент массива, то воспользуйтесь функцией
    mixed array_shift(list &$Arr) Причём порядок следования элементов остаётся таким же, они как бы "вдвигаются" в список слева.

    собрана полезная информация по функциям

    От автора:
    В данном документе (разделе) собрана полезная информация по функциям php. Этот документ создавался несколькими авторами, поэтому прошу простить нам возможные опечатки и не строгую структуру раздела. Рекомендую ознакомиться с функцией mail, функциями запуска программ, функциями работы со строками и другими.
    Основная функция, которая нам, скорее всего, понадобится при работе с файлами - это возможность открытия файлов. Файлы открываются с помощью функции fopen(). Данную функцию можно использовать для открытия любого файла в файловой системе сервера, либо для открытия файла через HTTP или FTP в Интернете:

    int fopen(string filename, string mode);

    Как можно предположить, аргумент filename является именем открываемого файла; аргумент mode указывает на режим, в котором должен быть открыт файл: для чтения, для записи или дополнения. Он может иметь одно из следующих значений:

    a - Открытие файла только для дополнения. Данные будут дописаны в конец существующего файла; если файл не существует, PHP пытается создать его;

    a+ - Открытие файла для дополнения и чтения. Данные будут дописаны в конец файла; если файл не существует, PHP пытается его создать;

    r - Открытие файла только для чтения;

    r+ - Открытие файла для чтения и записи. Данные будут записаны в начало существующего файла;

    w - Открытие файла только для записи. Существующее содержание файла будет урачено. Если файл не существует, PHP пытается его создать;

    w+ - Открытие файла для чтения и записи. Существующее содержание файла будет урачено. Если файл не существует, PHP пытается его создать.

    К этим флагам можно добавить флаг b, указывающий на то, что файл надо обрабатывать, как двоичный, а не как текстовый. Если между двоичными и текстовыми файлами не делается различия, этот флаг просто игорируется.

    При успешном выполнении функция fopen() возвращает дескриптор файла (file handle) - целое число, позволяющее ссылаться на файл при последующих вызовах функции; при неудаче функция fopen() возвращает false.


    Закончив работу с файлом, необходимо его закрыть. Это делается с помощью функции fclose().

    int fclose(int fp);

    В качестве единственного параметра она принимает дескриптор закрываемого файла и в случае успеха возвращает true, а в случае неудачи - false.
    Простейшая возможность провести какую-либо операцию с файлом - просто послать содержимое файла в выходной поток. Для этого используется функция fpassthru():

    int fpassthru(int fp);

    Она принимает единственный параметр - дескриптор файла, возвращенный вызовом fopen(). Функция fpassthru() выполняет чтение с текущей позиции в открытом файле и до его конца. Достигнув конец файла эта функция вызывает его закрытие. Функция fpassthru() возвращает true в случае успеха и false - в случае неудачи.
    Иногда нам нужно прочесть только часть данных из файла. В PHP есть несколько функций, позволяющих это сделать. Выбор такой функции зависит от данных, которые мы хотим прочесть. Чтобы прочесть строку из открытого файла, можно воспользоваться функцией fread():

    string fread(int fp,int length);

    Эта функция читает строку длиной до length символов из файла с дескриптором fp:

    if(!$file=fopen("text.txt","r")){

    echo("Невозможно открыть файл");

    } else {

      $text=fread($file,10);

    fclose($file);
    }

    Если конец файла достигнут раньше заданной длины length, возвращается текст вплоть до этого места.
    Функция fgetc() используется для чтения из файла одного символа:
    string fgetc(intfp);

    Единственный параметр, который принимает эта функция,- это дескриптор открытого файла. Возвращаемое значение является строкой из одного символа, прочтенной из файла, или(если достигнут конец файла) false(пустая строка). Хотя этот метод можно использовать для поочередного прочтения всех симводов из файла, очевидно, что для чтения всего файла он неэффективен. Функция fgets() позволяет прочесть строку заданной длины:


    string fgets(int fp,int length);
    Помимо десткриптора файла fp функция fgets() принимает в качестве аргумента количество символов (плюс один), которые надо прочесть из файла. Обратите внимание, что параметр length на единицу больше фактического количества прочтенных символов, а также на то, что чтение завершится, если будет достигнут символ перевода строки или конец файла, поэтому реальное количество возвращенных символов нельзя предсказать. Функция возвращает строку или false, если произошла ошибка. Функция fgetss() идентичнаfgets(), но все теги HTML и PHP удаляются из строки. Заметьте, что все теги все же учитываются в длине строки, поэтому, если вы вызовете функцию
    $text=(fgetss($file,11));

    где $file начинается со строки

    These tags will be stripped off

    значением $text будет "These t", а не "These t".
    Наконец, для чтения содержимого файла можно использовать функцию file(), которая возвращает содержимое файла в виде массива. Каждая строка файла будет представлена одним элементом массива(первая строка будет нулевым элементом):
    array file(string filename);
    Обратите внимание, что функция принимает в качестве аргумента строку с именем файла, а не целочисленный дескриптор файла.
    Запись в файлы осуществляется аналогичным образом. Для записи строки в файл используются функции fputs() или fwrite(). Их вызов совершенно идентичен:
    int fputs(int fp, string string,int(length));
    int fwrite(int fp, string string,int(length));

    Параметрами служат: дескриптор файла, в который осуществляется запись, строка, записываемая в файл, и(необязательно) количество символов строки, которое нужно записать. В случае успеха функции возвращают true, в случае неудачи - false.

    Нам требуется способ перемещения текущей позиции в файле, чтобы иметь возможность чтения или записи по заданному положению в файле. В PHP это достигается благодаря ряду функций.
    Простейшей функцией является rewind(). Она устанавливает текущую позицию в начало файла:
    int rewind(int fp);
    Единственным параметром здесь является дескриптор соответствующего файла. Возвращаемым значением является true в случае успеха и false - в случае неудачи.
    Для перемещения на заданную позицию в файле используется функция fseek():
    int fseek(int fp, int offset);
    Аргумент fp является дескриптором файла;offset является чилом байт или символов от начала файла.
    Обратите внимание, что fseek() возвращает 1 при ошибке, а в случае успеха -0.
    В PHP4 fseek() принимает необязательный третий аргумент, который может иметь следующие значения:SEEK_SET(offset отсчитывается от начала файла), SEEK_CUR(offset отсчитывается от текущей позиции в файле) и SEEK_END(offset прибавляется к концу файла).
    Нам может также понадобиться узнать текущую позицию в файле. Это можно сделать с помощью функции ftell():
    int ftell(int fp);
    Она просто возвращает позицию в файле с дескриптором fp.


    Другой полезной функцией является функция feof(), которая указывает, находится текущая позиция в конце файла или нет:
    int feof(int fp);
    Она возвращает true, если текущая позиция в файле с дескриптором fp находится в конце файла, или происходит ошибка. В противном случае возвращается false. Эта функция обычно используется при циклическом проходе по файлу.

    Помимо чтения и записи в файлы в PHP можно производить над ними более фундаментальные операции: копировать их из одного каталога в другой, полностью удалять их или давать им новые имена.
    Для копирования файла используется функция copy():
    int copy(string source,string destination);
    Она копирует файл с именем, указанным в аргументе source, в место, указанное в аргументе deatination. Как и можно ожидать, true возвращается в случае успеха, false - в случае неудачи. Чтобы сохранить резрвную копию файла в каталог /temp/, параллельный текущему каталогу, эту функцию можно использовать таким образом:
    $filename="text.txt";
    copy($filename,"../temp/".$filename);
    Если требуется удалить файл навсегда, можно воспользоваться функцией unlink()

    int unlink(string filename);
    Она удаляет указанный файл и возвращает true в случае успеха и false- в случае ошибки.
    Для переименования файла используется функция rename()

    int rename(string oldname, string newname);
    Она изменяет имя файла oldname на заданное в аргументе newname. Функция возвращает true в случае успеха и false - в случае ошибки.

    Перед тем, как удалять или переименовывать файлы, неплохо было бы убедиться в том, что мы точно представляем, с каким файлом имеем дело. PHP предоставляет ряд функций, которые возвращают информацию о данном файле.
    Во-первых, хотелось бы убедиться, что данный файл существует. Для этого можно использовать функцию file_exists()
    int file_exists(string filename);
    Параметром этой функции является имя проверяемого файла. Функция возвращает true, если файл существует, и false- в противном случае.
    Также может потребоваться проверить размер или тип файла. Для этого в PHP есть функции filesize


    и filetype:
    int filesize(string filename);
    Эта функция возвращает размер указанного файла в байтах или false в случае ошибки.
    Функция filetype() возвращает строку, указывающую тип данного файла:
    string filetype(string filename);
    Возвращаемое значение может быть false в случае ошибки или одним из следующих строковых значений:
    "fifo"-объект является FIFO(именованным каналом);
    "char"- объект является символьным устройством;
    "dir"- объект является каталогом;
    "block"- объект является блочным устройством;
    "link"- объект является символической ссылкой;
    "file"- объект является обычным файлом;
    "unknown"- тип файла невозможно определить.
    Кроме функции filetype() есть еще несколько функций, которые можно использовать для определения принадлежности файла к определенному типу. Этими функциями являются:
    Boolean is_dir(string filename);
    Boolean is_executable(string filename);
    Boolean is_file(string filename);
    Boolean is_link(string filename);
    Эти функции возвращают true, если указанный файл является каталогом, исполняемым файлом, обычным файлом и символической ссылкой, соответственно.
    Существуют также две функции, указывающие, возможны ли чтение и запись в файл:

    Boolean is_readable(string filename);

    Boolean is_writeable(string filename);

    Простейшей из функций для работы с целыми каталогами является функция chdir(), устанавливающая текущий каталог:

    int chdir(string directory);
    Она делает указанный каталог текущим.
    В PHP есть четыре функции, которые можно использовать для просмотра данного каталога. Во-первых, требуемый каталог нужно открыть:
    int opendir(string path);
    Функция opendir() открывает каталог, путь к которому указан в ее единственном аргументе, и возвращает "дескриптор каталога", представляющий собой целое число, которое можно использовать для ссылки на открытый каталог при последующих вызовах функций.
    Открыв каталог, можно читать находящиеся в нем "записи":
    string readdir(int dir_handle);
    Эта функция возвращает имя очередной записи в каталоге. Единственным параметром является дескриптор каталога, полученный от функции opendir(). Если записей больше нет или дескриптор каталога недействителен, функция возвращает false. Поэтому эту функцию можно использовать в операторе while() для просмотра всех записей в каталоге. Когда будет достигнут конец, будет возвращено false.
    Однако, при этом осуществляется перемещение по каталогу только в одном направлении. Для перемещения по каталогу от конца к началу используется функция rewinddir():
    void rewinddir(int dir_handle);
    Параметром функции является дескриптор каталога, полученный из вызова opendir(). Эта функция устанавливает текущую запись на первую запись в каталоге, поэтому можно начать сначала.
    Завершив работу с каталогом, его можно закрыть и освободить ресурсы:

    void closedir(int dir_handle);
    Снова единственный параметром является дескриптор каталога.

    Также можно изменять саму структуру каталогов, создавая и удаляя каталоги. Для создания каталога используется функция mkdir():
    int mkdir(string pathname, int mode);
    Первый параметр является именем пути для создаваемого каталога, второй указывает права доступа к каталогу в UNIX(в Windows этот параметр игнорируется), обычно задаваемые в виде восьмеричного числа (начинающегося с нуля). Возвращаемым значением является true, если вызов функции был успешен,и false- в противном случае.
    При наличии необходимых прав можно удалить каталог из сценария PHP. Для этого в PHP есть функция rmdir():
    int rmdir(string dirname);
    Обратите внимание, что эта функция удаляет только пустые каталоги.

    Вывод текста


    echo (string arg1, string [argn]...)

    Выводит все параметры ("печатает" в стандартный буфер вывода stdout содержимое переменных или иных переданных вами параметров. В нашем случае, как правило, вывод происходит в генерируемую html страницу, начиная с текущей позиции).
    Примечание:
    По большому счёту, echo( ) вовсе не функция, а языковая конструкция. В зависимости от того, как вы хотите передать параметры, можно ставить или не ставить круглые скобки.

    Рассмотрим несколько примеров:

    echo "Hello World";
    // Можно выводить переменные внутри фразы. // Пояснения этой загадочной фразы в разделе строки.
    $foo="foobar"; $bar="barbaz"; // Отличие одинарных кавычек от двойных узанайте // щёлкнув здесь.
    echo "foo is $foo"; // foo is foobar
    //если использовать апострофы вместо кавычек echo 'foo is $foo'; // foo is $foo
    //при выводе нескольких переменных echo $foo; // foobar echo $foo,$bar; // foobarbarbaz


    Вообще-то вы и сами легко справитесь с познанием echo( ), поэтому более подробной информации не привожу.

    (В Perl аналогом данной функции является фнукция print)

    Запуск внешних программ


    Функции запуска внешних программ в РНР используются достаточно редко, т.к. при использовании РНР программист получает в своё распоряжение функции для работы с электронной почтой, на которые приходится большая часть вызовов внешних программ в других языках. Но РНР обладает всеми возможностями, необходимыми для запуска программ и утилит операционной системы.

    tring system(string $command [, int& return_var])
    запускает внешнюю программу, имя которой передано первым параметром и выводит результат работы программы в выходной поток, т.е. в броузер. (Последнее обстоятельство сильно ограничивает работу функции). Но, если в функцию передан второй параметр - переменная (не константа), то в неё помещается код возврата вызванного процесса.
    Примечание: Полагаю, и так ясно, что с помощью system() можно запускать только программы, в которых вы абсолютно уверены. В частности, НИКОГДА не передавайте функции данные, пришедшие из броузера пользователя, сначала не обработав их - это может принести с собой массу проблем, если например будет запущена какая-нибудь разрушительная утилита, например rm -R ~/, которая очень быстро очистит ваш каталог!
    Примечание: Если вы хотите избежать вывода данных в броузер, то воспользуйтесь функцией popen( ) или exec( ). Но, если вы хотите, чтобы данные попали прямиком в броузер, притом никак не исказившись, то воспользуйтесь функцией PassThru( ).

    string exec(string $command [, list& $array] [, int& $return_var])
    Запускает указанную программу или команду, но ничего не выводит в броузер. Вместо этого функция возвращает последнюю строку из выходного потока запущенной программы и, если задан параметр $array (обязатель должне быть переменной), то он заполняется списком строк в выходном потоке - по одной строке на элемент. При задании параметра-переменной return_var код возврата запущенного процесса будет помещён в эту переменную.

    string EscapeShellCmd(string $command)

    Применяется в тех случаях, когда нам всё же необходимо передать данные из броузера, например, в функцию system( ) или exec( ). Эти данные должны быть соответствующим образом обработаны (во избежание больших неприятностей). Например, можно защитить все специальные символы обратными слэшами. Для этого и используется функция EscapeShellCmd( ).
    Пример: Чаще всего функцию используют в таком контексте. Здесь пременная $to_directory пришла от пользователя.

    system("cd".EscapeShallCmd($to_directory));


    string PassThrue(string $command [, int& $return_var])

    Функция запускает указанный в её первом параметре процесс и весь её вывод направляет прямо в броузера без изменений, один-в-один. Она может пригодиться, если вы воспользовались какой-нибудь утилитой для генерации изображения "на лету", оформленной в виде отдельной программы. Но в РНР есть и более мощный функции для работы с графической информацией.

    Жёсткие ссылки.

    Жёсткие ссылки являются синонимами переменных. Определить такую переменную синоним можно так:

    $b = &$a;

    Теперь $a является той же самой переменной $b, но с другим именем, и наоборот. Можно рассматривать переменную $b, как копию переменной $a, которая по своему значению всегда совпадает с $a, хотя говорить "копия" в данном случае не правильно.

    Отметим, что многоуровневые ссылки в PHP не поддерживаются.

    Пример жёсткой ссылки на элемент массива:
    'aaa', 'b' => 'bbb'); $b=&$A['b']; // теперь $b - то же, // что и элемент с индексом 'b' массива ?>


    Статьи,обзоры,справочники по PHP

    Assign( (пара key,value) или ( array(пары key value) )

    Метод assign() сопоставляет значения переменным. С тем чтобы переменная в шаблоне была заменена, ей должно быть сопоставлено значение. Есть два вида сопоставления, между которыми есть некоторые важные отличия. Простой вид состоит в том, чтобы взять массив и скопировать все пары ключ/значение из массива в FastTemplate. В FastTemplate есть только один такой массив, поэтому при повторном сопоставление значения какой-либо переменной предыдущее значение теряется.
    $tpl->assign(TITLE => "king kong"); $tpl->assign(TITLE => "godzilla"); // вместо "king kong"

    АВТОР

    Оригинальный модуль для Perl CGI::FastTemplate написал Jason Moore jmoore@sober.com
    Перевод на PHP3 выполнил CDI cdi@thewebmasters.net
    PHP3 Version Copyright (c) 1999 CDI, cdi@thewebmasters.net, All Rights Reserved.
    Perl Version Copyright (c) 1998 Jason Moore jmoore@sober.com. All Rights Reserved.
    Эта программа является свободным программным обеспечением; вы можете распространять ее и/или модифицировать, не выходя за рамки GNU General Artistic License со следующими оговорками:
    Изменения или модификации должны сохранять указанные авторские права (Copyright). Изменения или модификации должны быть представлены обоим АВТОРАМ.
    Эта программа выпускается на условиях General Artistic License.
    Эта программа распространяется с надеждой, что она будет полезна, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии ПОЛЕЗНОСТИ или ПОДХОДЯЩЕСТИ ДЛЯ ОПРЕДЕЛЕННОГО ПРИМЕНЕНИЯ. Смотрите более подробные комментарии в Artistic License. Это программное обеспечение распространяется КАК ЕСТЬ (AS-IS).
    Высылайте отчеты об ошибках или комментарии ТОЛЬКО К ЭТОЙ ВЕРСИИ ДЛЯ PHP на адрес
    CDI, cdi@thewebmasters.net.
    Последняя версия этого класса должна быть доступна по следующему адресу:
    http://www.thewebmasters.net/php/

    Class

    Класс - это набор переменных и функций, работающих с этими переменными. Класс определяется с использованием следующего синтаксиса:

    items[$artnr] += $num; }
    // Уберем $num штук товара $artnr из корзины
    function remove_item ($artnr, $num) { if ($this->items[$artnr] > $num) { $this->items[$artnr] -= $num; return true; } else { return false; } } } ?>

    Здесь определен класс с именем Cart, который состоит из ассоциативного массива товаров в корзине и двух функций, добавляющих и убирающих товары из этой корзины. Чтобы не было путаницы в дальнейшем, назовем классом определение типа, а объектом - конкретную реализацию класса (переменную).
    Внимание

    Следующие предупреждения верны для PHP 4.
    Имя stdClass является внутренним для Zend и зарезервировано. Вы не можете назвать класс stdClass в PHP.
    Функции __sleep и __wakeup в классах PHP являются "волшебными". Вы не должны использовать эти имена в любых ваших классах, до тех пор, пока не захотите использовать "волшебные" свойства, связанные с ними. Далее приводится более подробная информация.
    PHP резервирует все функции, чьи имена начинаются с __, как "волшебные". Рекомендуется не использовать такие функции до тех пор, пока вы не захотите записать "волшебные" свойства.

    Примечание:
    В PHP 4 для переменных var
    допускаются только константные инициализации. Для инициализации переменной неконстантным значением, вам нужно инициализировать функцию, автоматически вызываемую при создании объекта. Такая функция называется конструктором (см. ниже).

    todays_date = date("Y-m-d"); $this->name = $GLOBALS['firstname']; /* и т.д. */ } }

    Классы - это типы, то есть они идентичны встроенным типам. Я долго бился над переводом этого предложения. Спасибо С. Семагину за вариант перевода. Тем не менее, не будучи достаточно уверенным в качестве перевода, привожу оригинал предложения: "Classes are types, that is, they are blueprints for actual variables".
    Вы создаете переменную выбранного типа посредством оператора new.


    add_item("10", 1);

    $another_cart = new Cart; $another_cart->add_item("0815", 3);


    Здесь создаются объекты $cart и $another_cart, оба класса Cart. Функция add_item() объекта $cart вызывается для добавления 1 штуки товара с номером 10 к $cart. 3 штуки товара номер 0815 добавляются к $another_cart.

    И $cart и $another_cart включают функции add_item(), remove_item() и переменную items. Это - различные функции и переменные. Вы можете думать об объектах, как о каких-то похожих каталогах в файловой системе. Так, в файловой системе могут находиться различные файлы README.TXT, поскольку они могут быть в разных каталогах. Как и в каталогах, где вы вводите полный путь для достижения файла из корневого каталога, вы определяете полное имя функции, которую хотите вызвать. В терминах PHP 4, корневой каталог - это глобальное пространство имен, разделитель пути есть символ ->. Таким образом, имена $cart->items и $another_cart->items указывают на две разные переменные. Напоминаем, что переменная именуется $cart->items, а не $cart->$items, так как у переменной в PHP только один знак доллара.



    // правильно, один $ $cart->items = array("10" => 1);

    // ошибка, поскольку $cart->$items становится $cart->"" $cart->$items = array("10" => 1);

    // правильно, но может быть, а может и не быть тем, // что ожидается: $cart->$myvar становится $cart->items $myvar = 'items'; $cart->$myvar = array("10" => 1);


    Внутри определения класса вы не знаете, под каким именем объект будет доступен в вашей программе: на момент описания класса Cart неизвестно, что позже объект будет поименован $cart или $another_cart. Таким образом, вы не можете записать $cart->items внутри самого класса Cart. Вместо этого для получения возможности указывать на свои собственные функции и переменные, класс может использовать псевдо-переменную $this которая может быть озвучена как "мой собственный" или "текущий объект". Таким образом, '$this->items[$artnr] += $num' можно прочесть как "добавить $num штук к счетчику товара $artnr в моем массиве товаров" или "добавить $num штук к счетчику товара $artnr в текущем объекте".

    Перевод на русский язык © Алексей Мельник, 2001. Class

    Class

    Class

    Clear_all()

    Очищает модуль от любых данных, кроме каталога ROOT. Эквивалентно следующему:
    $tpl->clear_define(); $tpl->clear_href(); $tpl->clear_tpl(); $tpl->clear_parse();
    На самом деле, функция именно это и делает.

    Clear_define()

    Очищает внутренний список, в котором сохраняются данные, переденные для:
    $tpl->define();
    Замечание: Хэш, в котором содержатся загруженные шаблоны, не будет затронут этим методом. (Смотри clear_tpl()) Принимает в качестве аргумента отдельный файловый хэндл, массив файловых хэндлов или ничего. Если нет аргумента, функция очищает ВСЕ файловые хэндлы.
    $tpl->define( array( MAIN => "main.tpl", BODY => "body.tpl", FOOT => "foot.tpl" ));
    // здесь какой-то код
    $tpl->clear_define("MAIN");

    Clear_dynamic($Macro)

    Этот метод удалит определения динамических блоков из родительского макроса, предполагая, что вы еще не приступали к разбору шаблона. Используя выше приведенный пример:
    $tpl->clear_dynamic("row");
    полностью удалит все неразобранные динамические блоки с именем ``row'' из родительского шаблона. Этот метод ничего не сделает, если шаблон уже был разобран! (Так как необходимые ему строки BEGIN и END удаляются в процессе разбора.) Этот метод удобен, когда вы работаете с базой данных, и вместо ``rows'' вам придется или не придется ничего выводить в шаблон. Если запрос к базе данных ничего не вернул, вы можете вычистить строки, котормы вы описали, как будет представлен результат запроса на странице.

    Clear_href(KEY)

    Удаляет данную ссылку из списка ссылок, который строится с использованием:
    $tpl->assign(KEY = val);
    При вызове без аргументов функция удаляет все ссылки из массива.
    (Так же, как clear_assign() )
    $tpl->assign( array( MOVIE => "The Avengers", RATE => "Sucked" ));
    $tpl->clear_href("MOVIE"); // Теперь только {RATE} находится в массиве assign()

    Clear_tpl()

    Очищает внутренний массив, в котором сохраняется содержание шаблонов. (Если они были загружены) Если у вас проблемы с тем, что изменение шаблона не отражается на работе скрипта, попробуйте добавить этот метод в ваш скрипт.
    $tpl->define(MAIN,"main.tpl" ); // assign(), parse() и т.д., и т.п. ...
    $tpl->clear_tpl(MAIN); // Загруженный шаблон теперь выгружен.

    Clear()

    Замечание: Все функции clear() предназначены для использования где угодно, где ваши скрипты устойчивы. Они обычно не нужны, если вы пишете CGI-скрипты.
    clear() Очищает внутренние ссылки, которые сохраняют данные, переданные parse(). clear() принимает отдельные ссылки или массивы ссылок в качестве аргументов.
    Часто clear() используется в конце скрипта:
    $tpl->FastPrint("MAIN"); $tpl->clear("MAIN");
    или
    $tpl->FastPrint("MAIN"); $tpl->FastPrint("CONTENT"); $tpl->clear(array("MAIN","CONTENT"));
    Будучи вызванной без аргументов, функция удаляет ВСЕ ссылки, которые были установлены с использованием parse().

    Define( array( пары key,value ) )

    Метод define() сопоставляет имя шаблона другому (обычно более короткому) имени;
    $tpl = new FastTemplate("/путь/к/шаблонам");
    $tpl->define( array( main => "main.tpl", footer => "footer.tpl" ));
    Это новое имя вы будете использовать для того, чтобы сослаться на шаблон. Имена файлов не должны появляться где-либо, кроме метода define().
    (Замечание: Это обязательный шаг! Он может показаться лишним и раздражающим, когда вы работаете с тривиальным примером, вроде того, что приведен выше. Но когда вы имеете дело с множеством шаблонов, очень удобно ссылаться на них по именам, которые не связаны с именами файлов.)
    СОВЕТ: Поскольку define() фактически не загружает шаблоны, будет быстрее и более понятно определить все шаблоны одним вызовом define().

    Define_dynamic($Macro, $ParentName)

    Nino Martincevic, don@agi.de, спросил меня письмо по электронной почте о том, как бы сделать что-то вроде этого, и я подумал, что идея очень хороша, немедленно сел и сделал...
    Вы можете определять динамическое содержимое внутри статического шаблона. (Списки) Вот пример использования define_dynamic();
    $tpl = new FastTemplate("./templates");
    $tpl->define( array( main => "main.tpl", table => "dynamic.tpl" ));
    $tpl->define_dynamic( "row" , "table" );
    Это сообщает FastTemplate, что помещенный внутрь ``table'' шаблон является динамическим блоком, который называется ``row''. В старых версиях FastTemplate (pre 0.7) шаблон ``row'' должен был быть определен собственным файлом. Вот каким образом динамический блок можно вписать в файл шаблона:


    {NUMBER} {BIG_NUMBER}

    Синтаксис строк BEGIN и END должен быть ИСКЛЮЧИТЕЛЬНО точным. Он чувствителен к регистру символов. Блок кода начинается с новой строки. В строках BEGIN и END не может быть НИКАКОГО ДРУГОГО ТЕКСТА (хотя вы можете добавить любое количество пробелов в начале и в конце строки). Формат строки должен быть следующий:

    Строка должна точно соответствовать примеру, вплоть до расстояния между буквами. Это же верно для строки END. Строки BEGIN и END не могут быть разнесены на несколько строк. Теперь когда вы вызываете метод parse(), FastTemplate автоматически выделит динамический блок, отделит его от основного шаблона, и будет использовать его так, как если бы вы определили его как отдельный шаблон. От вас ничего не требуется делать, чтобы это заработало — просто определите динамический блок, а FastTemplate позаботится об остальном. Внутри этого архива должен быть файл define_dynamic.phtml, который является рабочим примером использования динамических блоков.
    Есть несколько правил использования динамических блоков — динамические блоки не должны включаться внутрь других динамических блоков — поведение класса БУДЕТ очень странным. Вы МОЖЕТЕ иметь вложенность более одного динамического блока на странице, но, разумеется, два блока не могут использовать один и тот же хэндл. Отлов ошибок при использовании define_dynamic() прост, насколько это возможно. Если вы определили динамический блок, а FastTemplate не смог его обнаружить, не будет выдано никаких сообщений об ошибках, только странный результат работы. (FastTemplate не добавит динамические данные и не вернет их как часть страницы.) Поскольку строки BEGIN и END вырезаются из результата работы после разбора, то если вы когда-нибудь увидите строки BEGIN и END в разобраном результате, это означает, что FastTemplate не смог найти динамический блок.

    Define_nofile() псевдоним: define_raw()

    ЭТИ МЕТОДЫ НЕ ПЕРЕНЕСЕНЫ В PHP ВЕРСИЮ
    И возможно, никогда не будут. Назначение этого класса в том, чтобы исключить HTML из кода PHP, а не в том, чтобы создать пути для его добавления туда.

    ДОКУМЕНТАЦИЯ

    Sascha Schumann написал хорошее руководство по обучению FastTemplate. Оно располагается на веб-сайте PHPBuilder.com по адресу:
    http://www.phpbuilder.com/
    Это модифицированная версия страницы руководства к CGI::FastTemplate, изначально написанной Jason Moore jmoore@sober.com. Простите, если я убрал не все перлизмы из кода примеров.
    Это не полный перевод, методы define_nofile(array()), и/или define_raw(array()) не реализованы в этом переводе, так как они мне не понадобились. Несколько методов реализованы по-другому (в основном, из-за более строгих требований PHP к типам данных). Функциональность каждого метода осталась прежней. Метод define_dynamic() является отличием данного перевода на PHP и не присутствует в версии для Perl.
    Метод объявления переменных изменен по сравнению с версией для Perl с $(A-Z0-9_)+ на {(A-Z0-9_)+}. Это означает, что вам придется исправить все ваши шаблоны. Открывающая и закрывающая фигурные скобки обеспечивают существенное ускорение работы и построение более точных шаблонов.
    Перевод на русский язык данной страницы руководства FastTemplate 1.1.0 выполнил Антон Лыков, last@mv.ru. Все замечания и пожелания по переводу руководства FastTemplate на русский язык принимаются по электронной почте.

    Extends

    Часто вам нужны классы с переменными и функциями, похожими на другой существующий класс. Фактически, является хорошим тоном программирования определить базовый класс, который может использоваться во всех ваших проектах и затем адаптировать его к нуждам каждого конкретного проекта. Для реализации такой возможности, классы могут быть расширениями других классов. Расширенный, или наследуемый, класс включает все переменные и функции базового класса (так называемое "наследование", означающее факт, что ничто "не умирает") и те, что вы добавите в расширенном определении. Невозможно "урезать" класс, другими словами, удалить определение любой существующей функции или переменной. Расширенный класс всегда зависит от единичного базового класса, другими словами, множественное наследование не поддерживается. Классы расширяются с использованием ключевого слова 'extends'.

    class Named_Cart extends Cart { var $owner;
    function set_owner ($name) { $this->owner = $name; } }

    Здесь определяется класс Named_Cart, включающий все переменные и функции Cart, плюс дополнительную переменную $owner и дополнительную функцию set_owner(). Вы создаете именованную корзину обычным образом, и можете устанавливать и смотреть владельцев корзин. Разумеется, вы можете использовать "нормальные" функции корзины в именованной корзине:

    $ncart = new Named_Cart; // Создать именованную корзину $ncart->set_owner("kris"); // Задать имя владельца print $ncart->owner; // Напечатать имя владельца $ncart->add_item("10", 1); // (свойство, унаследованное // от cart)

    Перевод на русский язык © Алексей Мельник, 2001. Extends
    Extends
    Extends


    FastPrint(HANDLE)

    Метод FastPrint() печатает содержимое названной переменной. Если не передано никакой переменной, то он печатает последнюю переменную, которая использовалась при вызове parse(). Как мне кажется, это резонное поведение по умолчанию.
    $tpl->FastPrint(); // в продолжение последнего примера // напечатает значение MAIN
    $tpl->FastPrint("MAIN"); // то же самое
    Этот метод сделан для вашего удобства. Если вам понадобится печатать куда-то еще (в сокет, в файловый хэндл), вам сначала захочется получить с помощью fetch() ссылку на данные:
    $data = $tpl->fetch("MAIN"); fwrite($fd, $data); // сохранить в файл

    Fetch(HANDLE)

    Возвращает необработанные данные из разобранного хэндла.
    $tpl->parse(CONTENT, "main"); $content = $tpl->fetch("CONTENT"); print $content; // печатает в STDOUT fwrite($fd, $content); // записывает в файловый хэндл

    Формы HTML (GET и POST) Когда

    h2>Определение типов переменной
    Так как PHP определяет типы переменных и конвертирует их (обычно) по необходимости, не всегда очевидно какого типа данная переменная в определенный момент времени. PHP включает несколько функций, помогающих найти тип переменной. Это gettype(), is_array(), is_float(), is_int(), is_object() и is_string().
    Перевод на русский язык © Алексей Мельник, 2002. Формы HTML (GET и POST) Когда
    Формы HTML (GET и POST) Когда
    Формы HTML (GET и POST) Когда


    Статьи,обзоры,справочники по PHP

    Этот метод вернет значение переменной, которое было ей сопроставлено с помощью assign(). Это позволяет вам легко передавать переменные между внутренними функциями, используя класс FastTemplate для поддержки ``глобализации'' переменных. Например:
    $tpl->assign( array( TITLE => $title, BGCOLOR => $bgColor, TEXT => $textColor ));
    (когда-то позже...) $bgColor = $tpl->get_assigned(BGCOLOR);

    Классы и объекты

    Содержаниеclass
    extendsКонструкторы::parentСериализация объектов - объекты в сессиях"Волшебные" функции __sleep и __wakeupУказатели внутри конструктора

    Основы синтаксиса

    СодержаниеСкрытие от HTMLРазделение инструкцийКомментарии

    Переменные

    СодержаниеОсновыПредопределенные переменныеОбласть действия переменных"Меняющиеся" переменныеВнешние переменные PHP

    ИМЯ

    FastTemplate 1.1.0 - расширение PHP для управления шаблонами и замены переменных.

    Книги, которые мы выбираем.

    Книги, которые мы выбираем.
    Купить!
    Хьюгс С., Змиевский А. PHP. Руководство разработчика
    Что может быть лучше, чем чтение основ? Возможно, только исходники :-)). Эта книга - от авторов PHP и этим почти все сказано. Книгу отличает ориентация на решение конкретных задач. Четкий и продуманный характер подобранных задач позволяет получить рецепты на все случаи повседневной практики программирования. Каждое решение подробно комментируется, что позволяет не только понять методологию программирования, но также и стимулирует нахождение наиболее эффективных способов решения сложных проектов. Рекомендуется в качестве настольного руководства для разработчиков Internet-приложений любой квалификации.

    Книги, которые мы выбираем.
    Купить!
    Швендимен Б. PHP 4. Руководство разработчика
    Эта книга окажется полезной для любого, кто занимается созданием Web-страниц, но главное ее назначение - помочь разработчикам Web-приложений. PHP - это язык программирования, а не средство разработки дизайна, поэтому весьма желательно, чтобы у читателя был некоторый опыт создания программ. Для тех, кто знаком с языками С или Perl, язык PHP покажется довольно знакомым. Он предоставляет в ваше распоряжение множество полезных средств, например, возможность работать с самыми разными базами данных. Книга предназначена для программистов и разработчиков Web-приложений, как начинающих, так и имеющих определенный опыт.

    Книги, которые мы выбираем.
    Купить!
    Котеров Д.В. Самоучитель PHP4.
    Что делать профессионалу, когда он сталкивается с новой технологией программирования? Купить на ближайшем развале книжку "PHP для занятых" - бессмысленная потеря денег, прослушать авторизованный курс - не хватает времени. К счастью, есть выход. Данное учебное пособие по использованию языка РНР версии 4 содержит обширную информацию о приемах, призванных в кратчайшие сроки сделать новичка, владеющего хотя бы одним алгоритмическим языком, Web-программистом. Рассматриваются основы протоколов HTTP и CGI, схемы разработки крупных сценариев на РНР, синтаксис языка и работа с простейшими функциями, объектно-ориентированное программирование на РНР с применением идеологии интерфейсов, манипуляции со строками и массивами, создание баз данных и многое другое. Книга обладает рядом специфических особенностей (характерных только для российских изданий), выгодно отличающих ее от зарубежных аналогов. Для жителей и гостей :-) Москвы автором книги (в учебном центре Артемия Лебедева) может быть прочитан курс "Профессиональное использование PHP".


    Книги, которые мы выбираем.
    Купить!
    Фролов А., Фролов Г. Практика применения Perl, PHP, Apache, MySQL для активных Web-сайтов. (+CD)

    Книги этих авторов давно привлекают внимание профессионалов. В данном случае особенно интересен выход в "Русской редакции" книги о не Microsoft-овских технологиях - PHP и Perl. Книга посвящена созданию активных Web-приложений, предназначенных для работы на платформе операционных систем Linux и Microsoft Windows. Читатель научится создавать как относительно простые Web-узлы для небольших компаний, так и сложные приложения, интегрированные с базами данных и почтовыми серверами. Здесь описаны стенд разработки Web-приложений, особенности установки и настройки Linux, а также популярного Web-сервера Apache, рассмотрены процесс создания программ CGI на языке Perl и сценариев PHP, методики интеграции этих приложений с СУБД MySQL. В основу книги положен опыт, полученный авторами при разработке различных Интернет-проектов, в том числа узла Web службы восстановления данных, узла виртуального кадрового агентства Трудоголик.Ру, созданного специально для этой книги и других проектов. Книга адресована тем, кто уже умеет создавать документы HTML и в целом знаком с принципами работы серверов Web, а также тем, кто желает быстро освоить профессиональные приемы создания активных Web-узлов на платформе Linux и Microsoft Windows. Кроме того, она полезна всем, кому интересно практическое применение современных Интернет-технологий.
    Книги, которые мы выбираем.
    Купить!
    Ульман Л. Основы программирования на PHP

    Книга посвящена РНР, языку написания сценариев, и предназначена для начинающих Web-мастеров, которые планируют создавать динамические сайты. С другой стороны, много интересного в ней найдут и профессиональные дизайнеры, желающие внести элементы динамики в проектируемые ими ресурсы. Книга написана просто и доступно, в ней рассматриваются следующие вопросы: синтаксис языка, строки и управляющие структуры, массивы и регулярные выражения и др. Описываются приемы отладки ваших сценариев, говорится о работе с файловой системой, базами данных, cookie. Особое внимание уделяется получению введеной в форму информации. Дана информация о ресурсах Internet, посвященных описываемых языку.


    Книги, которые мы выбираем. Разработка Web-приложений на PHP и MySQL. Книга представляет собой всеобъемлющее руководство по совместному применению РНР и MySQL для разработки высокоэффективных и интерактивных Web-сайтов с динамическим содержимым.
    Несомненным достоинством книги является её ориентация на решение реальных бизнес-задач, что воплощено во множестве типовых примеров, столь часто встречающихся при повседневной разработке. Среди этих примеров создание покупательской тележки для электронных магазинов, аутентификация пользователей, генерация динамических PDF-документов, разработка систем электронной почты через Web, написание систем поддержки Web-форумов. Помимо пошагового анализа реальных бизнес-примеров, в книге широко рассматривается формальный синтаксис и семантика языка РНР, основы построения приложений баз данных и особенности применения объектно-ориентированной методологии при разработке приложений для Web.
    Сопровождающий книгу CD-ROM содержит тексты всех примеров, рассмотренных в книге, а также множество материала, который окажется полезным для каждого разработчика Web-приложений.
    Книги, которые мы выбираем.
    Купить!
    MySQL. В книге описана одна из самых популярных реляционных систем управления базами данных MySQL. Вместо простого обзора возможностей MySQL, автор показывает, как можно максимально эффективно использовать эту СУБД.
    На примере двух тестовых баз данных он приводит решения проблем, с которыми вы обязательно столкнетесь при практическом использовании MySQL. Вы научитесь интегрировать MySQL с программными средствами, разработанными сторонними компаниями, такими как компиляторы языков PHP и Perl, которые позволяют с помощью запросов к базе данных создавать динамические Web-страницы. Кроме того, здесь приведен обширный справочник по типам столбцов, операторам, функциям, синтаксическим конструкциям языка SQL, интерфейсам C API, Perl DBI и PHP API. В книге предоставлена уникальная информация, которую вряд ли можно получить где-нибудь еще. Книга рассчитана на пользователей и разработчиков систем клиент/сервер на основе MySQL.


    Книги, которые мы выбираем. PHP4: разработка Web-приложений. Библиотека программиста (+CD)

    В любой профессиональной деятельности рано или поздно наступает момент, когда книги серии "для чайников" ничего кроме улыбки не вызывают. Но потребность в новых знаниях от этого только возрастает. К сожалению, рынок зачастую не в состоянии предложить достаточное количество книг "для профессионалов". Эта - приятное исключение. В ней вы не найдете примеров из серии "Hello, World!", зато подробно описаны концепции разработки реальных web - приложений и предложены способы реализации этих концепций. Теория построения IRC- клиента, детальное (на самом деле детальное!) описание механизма работы сессий в PHP, введение в PHPLib, вопросы безопасности web - приложений - вот далеко не полный список обсуждаемых вопросов. Прилагаемый к книге CD позволит не только установить PHP на столь любимой россиянами платформе Windows, но и (при желании) предоставит все необходимые дистрибутивы Linux. Оригинал книги (в формате .pdf, на английском языке) и полные листинги всех примеров сильно упростят ее чтение.
    Книги, которые мы выбираем.
    Купить!
    Будилов В.А. Практические занятия по PHP4. Краткий курс. (+CD)

    Эта книга - не из разряда "для занятых". Российский автор, несмотря на "краткость", на примерах рассматривает основы использования языка РНР - одного из наиболее популярных языков программирования, используемого при написании серверных программ-сценариев. Это означает, что РНР-программы способны инициировать запросы, отправлять их по сети Интернет другим программам, называемым серверами, ожидать, получать и обрабатывать ответы, полученные от программ-серверов. С помощью РНР можно легко создавать интерактивные динамические HTML-страницы. Вы научитесь устанавливать и конфигурировать Web-сервер и РНР. Подробно, с примерами рассматриваются все основные элементы языка, основные приемы программирования на РНР версии 4. Приведен краткий справочник функций языка РНР. К книге прилагается CD-диск, на котором собраны примеры программ, рассмотренных в книге, РНР4 для Windows и UNIX, некомпилированный дистрибутив РНР, несколько программ Web-серверов и другие полезные программы. Книга совмещает в себе справочник по РНР, рассчитанный на профессионалов, и материалы для начинающих. Шаг за шагом читатель входит в увлекательный мир РНР-программирования для WEB.


    Книги, которые мы выбираем.
    Купить!
    Арнольд М. Администрирование Apache

    Книга является практическим руководством, посвященным ежедневной работе по администрированию Apache, и предлагает пошаговые инструкции по всем вопросам - от обеспечения безопасности и программирования Web-сервера Apache до создания многодоменных сайтов на одном сервере и объемного справочника по отладке. Книга содержит важную информацию о связанных продуктах, необходимых для создания, запуска и поддержки сервера Apache. Этот уникальный справочник предназначен для всех администраторов Apache.
    Книги, которые мы выбираем.
    Купить!
    Холден Г. и др. Apache Server в комментариях

    Книга Apache Server в комментариях предоставляет уникальную информацию по внутреннему строению одного из наиболее популярных Web-серверов Apache. Книга предназначена, прежде всего, для программистов и разработчиков частей кода и модулей этого замечательного бесплатного сервера, создаваемого истинными фанатами со всего мира. В книге приведены наиболее детальные и емкие комментарии кода ядра и модулей Apache, которые позволяют понять технологию регистрации, доступ к каталогам, запуск CGI-сценариев, генерацию содержания отдельных каталогов и многое другое. Удобная для изучения организация книги позволяет без особого труда разобраться во всех премудростях и хитросплетениях кода, равно как и получить серьезный толчок к созданию и обновлению кода Apache. Сопровождающий книгу CD-ROM существенно упрощает процесс изучения, поскольку содержит все необходимое для того, чтобы стать истинным гуру кода сервера Apache.
    Книги, которые мы выбираем. Книги, которые мы выбираем.

    Книги, которые мы выбираем.

    при комментировании больших блоков не

    h1>Это - пример.>/h1>
    Заголовок выше гласит: 'Это - пример'.
    Будьте осторожны - при комментировании больших блоков не используйте вложенные комментарии в стиле C.


    Вообще-то, ошибка возникнет в предпоследней строке (на последнем */)

    Перевод на русский язык © Алексей Мельник, 2001. при комментировании больших блоков не
    при комментировании больших блоков не
    при комментировании больших блоков не

    Конструкторы

    Предупреждение

    В PHP 3 и PHP 4 конструкторы ведут себя по-разному. Рекомендуется использовать конструкторы в смысле PHP 4.

    Конструкторы - это функции в классе, автоматически вызываемые при создании нового экземпляра класса (то, что мы договорились называть объектами) при помощи оператора new. В PHP 3 функция становилась конструктором, если ее имя совпадало с именем класса . В PHP 4 функция становится конструктором, когда ее имя совпадает с именем класса, в котором она определена - различие весьма тонкое, но критическое (см. ниже).

    // Работает как в PHP 3, так и в PHP 4. class Auto_Cart extends Cart { function Auto_Cart() { $this->add_item ("10", 1); } }

    Здесь определяется класс Auto_Cart, наследуемый от Cart и конструктор, инициализирующий корзину с одним товаром номер "10" каждый раз, когда новый экземпляр Auto_Cart создается при помощи "new". Конструкторы могут иметь аргументы, эти аргументы могут быть необязательными, что делает их намного более полезными. Чтобы использовать этот класс без параметров, все параметры конструктора должны быть объявлены необязательными через описание значений по умолчанию.

    // Работает как в PHP 3 так и в PHP 4. class Constructor_Cart extends Cart { function Constructor_Cart($item = "10", $num = 1) { $this->add_item ($item, $num); } }
    // Купим то же, что и в старом примере.
    $default_cart = new Constructor_Cart;
    // Купим реальный товар...
    $different_cart = new Constructor_Cart("20", 17);

    Предупреждение

    В PHP 3 наследуемые классы и конструкторы имели ряд ограничений. Следующие примеры объясняют эти ограничения - читайте внимательно!.

    class A { function A() { echo "Я - конструктор A.
    \n"; } }
    class B extends A { function C() { echo "Я - обычная функция.
    \n"; } }
    // В PHP 3 здесь конструктор не вызовется. $b = new B;

    В смысле PHP 3, в вышеописанном примере, конструктор не вызовется правило PHP 3 гласит: "Конструктор класса A - функция с тем же именем, что и класс". Имя класса - B, функций с именем В нет. Ничего не происходит.

    В PHP 4 это преодолено введением другого правила: "Если класс не имеет конструктора, вызывается конструктор базового класса (если он существует)." В вышеописанном примере при исполнени на PHP 4, будет написано: "Я - конструктор A.
    ".



    class A { function A() { echo "Я - конструктор A.
    \n"; }

    function B() { echo "Я - обычная функция В в классе A.
    \n"; echo "Я - не конструктор A.
    \n"; } }

    class B extends A { function C() { echo "Я - обычная функция.
    \n"; } }

    // Здесь B() вызывается как конструктор. $b = new B;


    В PHP 3 функция B() класса A вдруг становится конструктором в классе В, хотя это никогда не предполагалось. Правило PHP 3 гласит: "Конструктор класса - функция с тем же именем, что и класс". PHP 3 не следит за тем, была ли функция определена в классе В, или унаследована.

    В PHP 4 это преодолено следующим изменением правила: "конструктор - это функция с именем, совпадающим с именем класса, в котором она определена". Таким образом, в PHP 4 класс В не будет иметь своего конструктора и будет вызван конструктор базового класса, печатающий "Я - конструктор A.
    "

    Предупреждение


    Ни PHP 3, ни PHP 4 не вызывают конструкторов базовых классов автоматически, из конструкторов наследуемых классов. Обеспечение соответствующих вызовов конструкторов родительских классов возлагается на вас.



    Замечание:

    В PHP 3 и PHP 4 нет деструкторов. Для имитации большинства действий деструкторов, используйте вместо них register_shutdown_function()

    Деструкторы - это функции, автоматически вызываемые либо при разрушении объекта, либо при вызове функции unset(), либо при выходе из области действия. В PHP нет деструкторов.

    Перевод на русский язык © Алексей Мельник, 2001. Конструкторы

    Конструкторы

    Конструкторы

    КРАТКАЯ СПРАВКА

    include("class.FastTemplate.php3"); $tpl = FastTemplate("/path/to/templates"); $tpl->define( array( main => "main.tpl", row => "table_row.tpl", all => "table_all.tpl" ));
    $tpl->assign(TITLE, "I am the title."); $defaults = ( array( FONT => '', EMAIL => 'cdi@thewebmasters.net' ));
    $tpl->assign($defaults); $tpl->parse(ROWS, ".row"); // the '.' appends to ROWS $tpl->parse(CONTENT, array("row", "all")); $tpl->parse(CONTENT, "main"); $tpl->FastPrint(CONTENT);
    $raw = $tpl->fetch("CONTENT"); echo "$raw\n";

    "Меняющиеся" переменные

    Иногда бывает удобно иметь переменную с меняющимся именем. Это переменная, имя которой может устанавливаться и использоваться динамически. "Нормальная" переменная определяется выражением, таким как:

    $a = "привет";

    "Меняющаяся" переменная берет значение переменной и рассматривает его как имя переменной. В примере выше значние привет может быть использовано как имя переменной, путем введения двух знаков доллара, т.е.

    $$a = "мир";

    С этого момента определены две переменные и содержатся в дереве символов PHP: $a с содержимым "привет" и $привет с содержиым "мир". таким образом, выражение

    echo "$a ${$a}";

    произведет тот же вывод, что и

    echo "$a $привет";

    т.е. в обоих случаях выведется привет мир.
    При использовании "меняющихся" переменных в массивах, вы должны разрешить проблему неоднозначности. То есть, если вы пишите $$a[1] то парсеру нужно знать, имеете ли вы ввиду то что $a[1] - это переменная, или вы хотите использовать $$a как переменную и взять из нее элемент с индексом [1]. Синтаксически разрешение неоднозначности выглядит так: ${$a[1]} для первого случая и ${$a}[1] для второго.
    Перевод на русский язык © Алексей Мельник, 2002.




    No_strict()

    Выключает предупреждающие сообщения о переменных шаблона, которые нельзя заменить. Вызов no_strict() требуется, чтобы заменить неизвестные переменные пустой строкой. По умолчанию, все экземпляры FastTemplate ведут себя так, будто был вызван метод strict(). Точно так же no_strict() должен быть вызван для каждого экземпляра FastTemplate.
    $tpl = new FastTemplate("/путь/к/шаблонам"); $tpl->no_strict();

    Область действия переменных

    Область действия переменной - это контекст, в котором она определена. Большая часть всех переменных PHP имеет единственную облать действия. Эта область измеряется включаемыми (included) и требуемыми (required) файлами. Например:

    $a = 1; include "b.inc";

    Здесь переменная $a будет доступна внутри включаемого скрипта b.inc. Однако, внутри пользовательских функций вводится локальная область действия. Любая переменная, используемая внутри функции по умолчанию ограничена локальной областью действия функции. Например:

    $a = 1; /* Глобальная область действия*/
    function Test() { echo $a; /* Ссылка на переменную с локальной областью действия*/ }
    Test();

    Этот скрипт не производит никакого вывода, так как выажение echo ссылается на локальную версию переменной $a, а она не связана со значением в данной области действия. Как вы можете заметить, здесь есть небольшие различия с языком C в том, что глобальные переменные в C автоматически доступны в функциях, пока явно не перекрываются локальными определениями. Это может вызвать проблемы, так как человек может ненамеренно изменить глобальную переменную. В PHP глобальные переменные должны быть объявлены таковыми в функции, если их собираются использовать в этой функции. Пример:

    $a = 1; $b = 2;
    function Sum() { global $a, $b;
    $b = $a + $b; }
    Sum(); echo $b;

    Скрипт, приведенный выше, выведет "3". Описав переменные $a и $b как глобальные в функции, все ссылки на любую из них будут указывать на глобальные версии. Нет ограничений на число глобальных переменных, которыми можно манипулировать в функции.
    Второй путь получить доступ к переменным в глобальной области действия - использовать специально определенный в PHP массив $GLOBALS. Предыдущий пример может быть переписан так:

    $a = 1; $b = 2;
    function Sum() { $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"]; }
    Sum(); echo $b;

    Массив $GLOBALS - это ассоциативный массив с именами глобальных переменных в качестве ключей и значениями соответствующих переменных в качестве элементов массива.

    Другая важная особенность области действия переменных - это статические переменные. Статические переменные существуют только в локальной области действия функции, но они не теряют своих значений когда программа покидает эту область действия. Рассмотрим следующий пример:



    function Test () { $a = 0; echo $a; $a++; }


    Эта функция достаточно бесполезна, так как каждый ее вызов будет устанавливать $a в 0 и печатать "0". Оператор $a++, увеличивающий переменную бесцелен, так как стоит функции завершиться, переменная $a исчезнет. Чтобы сделать подсчитывающую функцию полезной и не теряющей текущее значение счетчика, переменная $a объявляется статической:



    function Test() { static $a = 0; echo $a; $a++; }


    Теперь, вызванная в любое время, функция Test() напечатает значение $a и увеличит его.

    Статические переменные также предоставляют один из способов работы с рекурсивными функциями. Рекурсивной называется функция, вызывающая себя сама. Нужно быть осторожным при написании рекурсивных функций, так как возможно сделать рекурсию бесконечной. Вы можете создать гарантированный путь прекращения рекурсии. Следующая простая функция рекурсивно считает до 10, используя статическую переменную $count, как сигнал для останова:



    function Test() { static $count = 0;

    $count++; echo $count; if ($count < 10) { Test (); } $count--; }


    Перевод на русский язык © Алексей Мельник, 2002. Область действия переменных

    Область действия переменных

    Область действия переменных

    в котором есть переменные. Когда

    Что такое шаблон?
    Шаблон — это текстовый файл, в котором есть переменные. Когда шаблон анализируется, переменные заменяются текстом. (Размер текста может быть от нескольких байт до нескольких сотен килобайт.) Вот простой шаблон с одной переменной ('{NAME}'):
    Привет {NAME}. Как твои дела?
    Когда нужно использовать шаблоны?
    Шаблоны очень полезны при программировании CGI, так как добавление HTML к вашему коду затрудняет работу с ним и заставляет вас проделывать все изменения в HTML. Полностью помещая HTML в отдельные файлы шаблонов, вы даете возможность дизайнеру графики или интерфейса изменять вид вашего приложения без необходимости тревожить вас, а также лишает их возможности покопаться в вашем коде PHP.
    Почему выгоден FastTemplate?
    Скорость
    FastTemplate разбирает отдельное регулярные выражения. Он производит только простую замену переменных (т.е. вы не можете добавить какую-то логику в шаблон — вся ваша логика должна находиться в коде). Вот почему он называется 'FastTemplate' (Быстрый Шаблон)!
    Гибкость
    API ясное и гибкое, и позволяет вам выстраивать сложные HTML документы/интерфейсы. Он также полностью реализован на PHP и (наверняка) работает под Unix и NT. Также в нем нет ограничений по построению документов HTML — его можно использовать для построения любых ASCII-документов (postscript, XML, электронная почта — что угодно).
    Какие основные шаги использования FastTemplate?
    Основные шаги следующие:
    1. define 2. assign 3. parse 4. FastPrint
    Их подробное описание дано ниже в разделе ОСНОВНЫЕ МЕТОДЫ.

    Основы

    Переменные в PHP представляются знаком доллара со следующим за ним именем переменной. Имена переменных регистрозависимые.
    Имена переменных формируются по тем же правилам что и остальные метки PHP. Правильное имя начинается с буквы или символа подчеркивания, за ним следуют любое количество букв, цифр или символов подчеркивания. В виде регулярного выражения переменные могут быть представлены так: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
    Замечание:
    Здесь мы предполагаем, что буквы - это a-z, A-Z, и ASCII символы в диапазоне от 127 до 255 (0x7f-0xff).
    Для тех, кто еще сомневается - $Вася - тоже КОРРЕКТНОЕ имя переменной.

    $var = "Bob"; $Var = "Joe"; echo "$var, $Var"; // выводит "Bob, Joe"
    $4site = 'not yet'; // неверно - начинается с цифры $_4site = 'not yet'; // верно - начинается с подчеркивания $tфyte = 'mansikka'; // верно - 'ф' ASCII символ с кодом 228.

    В PHP 3 переменные всегда передавались по значению. То есть, когда вы присваивали выражение переменной, значение исходного выражения целиком копировалось в переменную. Это означало, например, что после присвоения значения одной переменной другой изменение любой из этих переменных не оказывало эффекта на другую. Более подробную информацию смотрите в разделе Выражения.
    PHP 4 предлагает другой путь присвоения значений переменным: связывание по ссылке. Это означает, что новая переменная просто ссылается (другими словами, "становится псевдонимом" или "указывает на") исходную переменную. Изменения новой переменной повлияют на исходную и наоборот. Также это означает, что копирования не происходит; присваивание происходт быстрее. Но все же любое увеличение скорости будет заметно только в циклах присваиваний больших массивов или объектов.
    Связывание по ссылке представляется амперсандом (&) перед началом переменной, которая связывается (исходная переменная). Например, следующий код выводит 'Меня зовут Вася' дважды:


    Стоит заметить, что только именованные переменные могут присваиваться по ссылке.

    Перевод на русский язык © Алексей Мельник, 2002. Основы
    Основы
    Основы


    Parent

    Вы можете сами писать код, который ссылается на переменные и функции в базовых классах. Это особенно удобно, если ваш производный класс - усовершенствование или специализация вашего базового класса.
    Вместо использования литерального имени базового класса в вашем коде, вы можете использовать специальное имя parent, которое указывает на имя вашего базового класса, определенного в директиве extends вашего класса. Делая это, вы избегаете использования имени вашего базового класса в больше чем в одном месте. Если вы изменените дерево наследования во время реализации, изменение легко сделать, редактированием директивы extends вашего класса.

    class A { function example() { echo "Я - A::example() и обеспечиваю общую функциональность.
    \n"; } }
    class B extends A { function example() { echo "Я - B::example() и обеспечиваю дополнительную функциональность.
    \n"; parent::example(); } }
    $b = new B;
    // Здесь вызывается B::example(), которая передает // вызов A::example(). $b->example();

    Перевод на русский язык © Алексей Мельник, 2001. Parent
    Parent
    Parent


    Parse(RETURN, FileHandle(s) )

    Функция parse — это главная функция в FastTemplate. Она принимает новую пару ключ/значение, где ключ — это ЦЕЛЬ, а значения — это ИСХОДНЫЕ шаблоны. Эта функция может использоваться в трех видах:
    $tpl->parse(MAIN, "main"); // обычный $tpl->parse(MAIN, array ( "table", "main") ); // смешанный $tpl->parse(MAIN, ".row"); // добавляющий
    В обычной версии загружается шаблон с именем ``main'', если он еще не был загружен, все переменные заменяются значениями, а затем результат сохраняется в FastTemplate как значение MAIN. Если переменная '{MAIN}' позде появится в шаблонах, она будет заменена на значение разобранного шаблона ``main''. Это позволяет вам легко строить вложенные шаблоны, что приближает нас к смешанному стилю.
    Смешанный стиль разработан с тем, чтобы облегчить построение вложенных шаблонов. Следующие примеры эквивалентны:
    $tpl->parse(MAIN, "table"); $tpl->parse(MAIN, ".main");
    // то же самое, что и:
    $tpl->parse(MAIN, array("table", "main")); // в таком виде меньше вызовов функций, и код понятнее
    Важно заметить, что при использовании смешанного стиля каждый шаблон, кроме первого, должен содержать переменную, в которую будет записан результат разбора. В представленном выше примере 'main' должен содержать переменную '{MAIN}', поскольку в ней сохраняются результаты разбора 'table'. Если 'main' не содержит переменной '{MAIN}', то результаты разбора 'table' будут потеряны.
    Добавляющий стиль позволяет добавлять разобранный результат к целевой переменной. Ставя точку . перед определенным файловым хэндлом сообщает FastTemplate о том, что результат разбора этого шаблона должен быть добавлен к возвращенному результату. Это особенно полезно при построении таблиц, число рядов в которых непостоянно — как в результате запроса к базе данных.

    Переменные

    Переменная определяется как:
    {([A-Z0-9_]+)}
    Это означает, что переменная должна начинаться с фигурной скобки '{'. Второй и последующие символы должны быть заглавными буквами или цифрами 'A-Z0-9'. Среди последующих символов может встречаться подчеркивание. Переменная завершается закрывающей фигурной скобкой '}'.
    Намимер, следующие переменные допустимы:
    {FOO} {F123F} {TOP_OF_PAGE}

    ПОЛНЫЙ ПРИМЕР

    Этот пример построит страницу HTML, которая будет состоять из таблицы. Таблица будет иметь 3 пронумерованных ряда. Первым шагом будет решить, какие шаблоны нам понадобятся. Чтобы облегчить изменение числа рядов в таблице, у нас будет шаблон для рядов таблицы, еще один для таблицы, и еще один для той части страницы HTML, где размещаются тэги head/body.
    Ниже представлены шаблоны. (Представим, что каждый находится в отдельном файле.)
    {TITLE} {MAIN}
    {ROWS}

    {NUMBER} {BIG_NUMBER}
    Теперь приступим к кодированию...
    /* START */
    define( array( main => "main.tpl", table => "table.tpl", row => "row.tpl" ));
    $tpl->assign(TITLE,"FastTemplate Test");
    for ($n=1; $n <= 3; $n++) { $Number = $n; $BigNum = $n*10; $tpl->assign( array( NUMBER => $Number, BIG_NUMBER => $BigNum ));
    $tpl->parse(ROWS,".row"); } $tpl->parse(MAIN, array("table","main")); Header("Content-type: text/plain"); $tpl->FastPrint(); exit; ?>
    После запуска он возвращает:
    FastTemplate Test
    1 10
    2 20
    3 30


    Если вы думаете, что могли бы сделать то же самое несколькими строчками чистого PHP, то да, наверное, вы могли бы. Но как дизайнер графики поймет HTML на выходе? Как он будет редактировать HTML в то время, когда вы редактируете другую часть кода? Как вы сохраните результат в файле, передадите другой программе? Как вы сделаете свое приложение многоязычным? Как вы построите приложение, которое будет иметь возможность масштабного использования графики или опционально только текста? FastTemplate действительно начинает сиять, когда вы строите средние или большие веб-приложения, просто потому, что он начинает отделять общую логику приложения от конкретной реализации.

    и понял, что устал на

    Этот перевод появился спонтанно. В субботу 08.12.2001 я пришел домой и понял, что устал на лекциях снова и снова объяснять студентам синтаксис объектно-ориентированного программирования на PHP, а после лекции - повторять то же самое для курсовиков. Поэтому здесь я привожу авторский вариант перевода главы 13 "Classes and Objects" справочного руководства по языку PHP.
    При переводе преследовались две основные цели:
  • Дать как можно более точный перевод on-line справочника. Для этого сохранена структура и (почти) оформление страниц документа. Для этого я даже "утащил" стилевой файл с www.php.net . Надеюсь, потомки меня простят :-) . Тем не менее, не надо замещать оригинальные файлы главы 13 "моими", так как часть ссылок в этом случае точно станет недоступной.
  • Придание переводу большей живости с целью получения не только справочной, но и обучающей информации. Для этого в тексте вводится понятие авторского комментария. Весь текст, выделенный таким образом отражает исключительно мою точку зрения, если явно не указано иное. Просьба, все претензии по поводу этих комментариев предъявлять только мне, но никак не авторам on-line справочника.

  • На момент начала работы над документом (08.12.2001 21:21) т.н. "русский" вариант on-line справочника представлял собой совершенно жалкое зрелище. Надеюсь (быть может, даже с моей помощью) в будущем положение изменится :-).
    По моему опыту чтения on-line справочника самое интересное - это вопросы-ответы пользователей внизу статей. В силу большой динамики перевести этот материал моей "терпелки" точно не хватит. Увы.
    Заранее прошу прощения за возможные ошибки в синтаксисе и грамматике русского языка - я не Ожегов, увы :-( Замеченные очепятки прошу выделять мышкой и нажимать Ctrl+Enter - они автоматически отошлются мне.
    Перевод на русский язык Алексей Мельник © 2001, 2002. Использование материала или любой его части в любой форме допускается исключительно с согласия автора. При этом автор не будет требовать гонорара за использование материалов в электронной форме :-)) (мне просто интересно, куда "расползется" этот документ). и понял, что устал на
    и понял, что устал на
    и понял, что устал на

    Предопределенные переменные

    PHP предоставляет большое количество предопределенных переменных для любого запускаемого скрипта. В то же время, многие из этих переменных не могут быть полностью документированы из-за зависимости от сервера (HTTP сервера, видимо), его версии, установок и других факторов. Некоторые из этих переменных недоступны когда PHP запускается из командной строки. Список этих переменных представлен в разделе Предопределенные переменные.
    Предупреждение

    В PHP 4.2.0 и более поздних версиях по умолчанию множество предопределенных переменных, включенных в глобальную область действия, изменилось. Пользовательские переменные и переменные сервера по умолчанию больше не включаются напрямую в глобальную область действия; они размещаются в нижеследующих суперглобальных массивах.
    Интересно, раньше разработчики PHP представляли эту возможность, как крутую фичу... Как все меняется! :-)
    Вы все еще можете вернуть старое поведение установкой register_globals в значение 'On' в вашем файле php.ini.
    Более подробную информацию и предысторию этого изменения читайте в разделе Объявление о выпуске PHP 4.1.0.

    Начиная с версии 4.1.0, PHP предоставляет набор предопределеных массивов, содержащих переменные web-сервера (если возможно), среды окружения и пользовательские. Эти новые массивы очень специфичны, так как являются автоматически глобальными, то есть доступными в любой области действия. По этой причине их часто зовут 'автоглобалами' или 'суперглобалами'. (Это не механизм PHP для обеспечения пользовательских суперглобалов.) Суперглобалы перечислены ниже; тем не менее, их содержимое и возможные дискуссии о предопределенных переменных PHP и их природе, смотрите в разделе Предопределенные переменные.
    Суперглобалы PHP
    $GLOBALS
    Содержит ссылки на каждую переменную, которая доступна в глобальной области действия скрипта в настоящее время. Ключами этого массива являются имена глобальных переменных.
    $_SERVER
    Набор переменных web-сервера или же напрямую зависящих от среды исполнения текущего скрипта. Аналогичен старому массиву $HTTP_SERVER_VARS (который еще доступен, но потерял ценность).
    $_GET

    Переменные, предоставляемые скрипту через метод HTTP GET. Аналогичен старому массиву $HTTP_GET_VARS (который еще доступен, но потерял ценность).

    $_POST

    Переменные, предоставляемые скрипту через метод HTTP POST. Аналогичен старому массиву $HTTP_POST_VARS (который еще доступен, но потерял ценность).

    $_COOKIE

    Переменные, передаваемые скрипту через HTTP cookie. Аналогичен старому массиву $HTTP_COOKIE_VARS (который еще доступен, но потерял ценность).

    $_FILES

    Переменные, передаваемые скрипту через методы HTTP загрузки файлов. Аналогичен старому массиву $HTTP_POST_FILES (который еще доступен, но потерял ценность). Для более подробной информации смотрите раздел Загрузки методом POST.

    $_ENV

    Переменные, передаваемые скрипту через среду окружения. Аналогичен старому массиву $HTTP_ENV_VARS (который еще доступен, но потерял ценность).

    $_REQUEST

    Переменные, передаваемые скрипту через произвольный пользовательский механизм ввода, и которым, таким образом, нельзя доверять. Замечание: при запуске из командной строки, массив не содержит элементов argv и argc

    ; они представляются в массиве $_SERVER. Присутствие и порядок включения переменных в этот массив определяется в соответствии со значением параметра variables_order

    конфигурации. У этого массива не было аналогов в PHP до версии 4.1.0.

    $_SESSION

    Переменные, которые в настоящее время зарегистрированы в сессии скрипта. Аналогичен старому массиву $HTTP_SESSION_VARS (который еще доступен, но потерял ценность). Для более подробной информации смотрите раздел Функции обработки сессий.

    Перевод на русский язык © Алексей Мельник, 2002. Предопределенные переменные

    Предопределенные переменные

    Предопределенные переменные

    Разделение инструкций

    Инструкции разделяются также, как в C и Perl - завершением каждого выражения точкой с запятой.
    Закрывающий тэг (?>) также определяет конец выражения. Таким образом, нижеследующие примеры эквивалентны:



    Перевод на русский язык © Алексей Мельник, 2001. Разделение инструкций
    Разделение инструкций
    Разделение инструкций


    Сериализация объектов - объекты в сессиях

    Замечание:
    В PHP 3 в процессе сериализации и десериализации объекты теряют свои классовые ассоциации. Результирующая переменная будет объектного типа, но у нее не будет ни класса, ни методов, таким образом это довольно бесполезно (так же, как массив со "смешным" синтаксисом).
    Предупреждение

    Следующая информация верна только для PHP 4.

    serialize() возвращает строку, содержащую байт-потоковое представление любого значения, которое может присутствовать в PHP. unserialize() может использовать эту строку для создания оригинальных значений переменных. Использование сериализации для сохранения объекта сохранит все переменные объекта. Функции объекта не сохранятся, только имя класса.
    Чтобы unserialize()-"овать" объект, класс этого объекта должен быть определен. Таким образом, если сериализовать объект $a класса A на странице page1.php, вы получите строку, указывающую на класс A и содержащую все значения переменных, содержащихся в $a. Если вы хотите десериализовать объект на странице page2.php для воссоздания $a класса A, определение класса A должно присутствовать на page2.php. Это можно сделать, например, сохранением определения класса A в отдельном файле и включением ( include() )
    этого файла как на page1.php, так и на page2.php.

    classa.inc: class A { var $one = 1;
    function show_one() { echo $this->one; } }
    page1.php: include("classa.inc");
    $a = new A; $s = serialize($a); // сохраним $s где-то, где page2.php сможет ее найти. $fp = fopen("store", "w"); fputs($fp, $s); fclose($fp);
    page2.php: // Эта строка нужна для корректной работы десериализации include("classa.inc");
    $s = implode("", @file("store")); $a = unserialize($s);
    // Теперь используем функцию show_one() объекта $a. $a->show_one();

    Если вы используете сессии и session_register()
    для регистрации объектов, то такие объекты автоматически сериализуются в конце каждой PHP-страницы и автоматически десериализуются в началах следующих. В основном, это означает, что стоит этим объектам стать частью сессии, как они могут "всплывать" на любой вашей странице.

    Сильно рекомендуется включать определения классов всех регистрируемых объектов во все ваши страницы, даже если вы реально не используете эти классы на всех страницах. Если вы этого не сделаете и объект десериализуется без определения класса, это приведет к потере его классовой связи и он станет объектом класса stdClass без доступных функций, что, согласитесь, достаточно бесполезно.

    Таким образом, если в вышеописанном примере $a станет частью сессии вызовом session_register("a"), вы должны включить файл classa.inc на все ваши страницы, а не только на page1.php и page2.php.

    Перевод на русский язык © Алексей Мельник, 2001. Сериализация объектов - объекты в сессиях

    Сериализация объектов - объекты в сессиях

    Сериализация объектов - объекты в сессиях

    Session_cache_expire

    h2>Описание
    int session_cache_expire ([int new_cache_expire])
    session_cache_expire() возвращает текущее время жизни кэша. Если new_cache_expire определена, то текущеее время жизни заменяется на new_cache_expire.
    Перевод на русский язык © Алексей Мельник, 2002. Session_cache_expire
    Session_cache_expire
    Session_cache_expire


    Session_destroy

    h2>Описание
    bool session_destroy (void)
    session_destroy() уничтожает все данные, связанные с текущей сессией. Не разыменовывает (unset) никаких глобальных переменных, связанных с сессией, или файлов cookie сессии.
    Эта функция возвращает TRUE в случае успеха и FALSE в случае неудачи при уничтожении данных сессии.

    Пример 1. Уничтожение сессии
    Очень содержательный пример! :-)

    Перевод на русский язык © Алексей Мельник, 2002. Session_destroy Session_destroy
    Session_destroy


    Session_encode

    h2>Описание
    string session_encode (void)
    session_encode() возвращает строку с закодированным содержимым текущей сессси внутри.
    Перевод на русский язык © Алексей Мельник, 2002. Session_encode
    Session_encode
    Session_encode


    Session_get_cookie_params

    h2>Описание
    array session_get_cookie_params
    (void)
    The session_get_cookie_params() функция возвращает массив с информацией о cookie текущей сессии. Массив содержит следующие элементы:

  • "lifetime" - время жизни cookie.

  • "path" - Путь, по которому сохраняется информация.

  • "domain" - Домен cookie.

  • "secure" - Cookie может быть послан только через безопасное соединение. (Этот элемент добавлен в PHP 4.0.4.)

  • Перевод на русский язык © Алексей Мельник, 2002. Session_get_cookie_params
    Session_get_cookie_params
    Session_get_cookie_params


    Session_id

    h2>Описание
    string session_id ([string id])
    session_id() возвращает session id текущей сессии. Если переменная id определена, ее значение становится значением session id.
    Константа SID также может быть использована для получения текущего имени сессии и session id как строки, удобной для добавления в URL-ы.
    Перевод на русский язык © Алексей Мельник, 2002. Session_id Session_id
    Session_id


    Session_is_registered

    h2>Описание
    bool session_is_registered (string name)
    session_is_registered() возвращает TRUE если переменная с именем name
    зарегистрирована в текущей сессии.
    Перевод на русский язык © Алексей Мельник, 2002. Session_is_registered Session_is_registered
    Session_is_registered


    Session_module_name

    h2>Описание
    string session_module_name ([string module])
    session_module_name() возвращает имя текущего модуля сессии. Если переменная module определена, будет использован одноименный модуль.
    На бытовом русском это звучит так: эта функция определяет в каком виде (файлы, память, пользовальский тип) будут храниться данные сессии.
    Перевод на русский язык © Алексей Мельник, 2002. Session_module_name
    Session_module_name
    Session_module_name


    Session_name

    h2>Описание
    string session_name ([string name])
    session_name() возвращает имя текущей сессии. Если переменная name определена, имя текущей сессии меняется на ее значение.
    На имя сессии ссылается session id в файлах cookie и URL-ах. Оно должно содержать только алфавитно-цифровые символы: оно должно быть коротким и описательным (например для пользователей со включенными предупреждениями о посылке cookie). Первоначатьно имя сессии устанавливается в значение, записанное в параметре session.name во время запуска. Таким образом, вы должны вызвать session_name() для каждого запроса (и до вызова session_start()
    или session_register()).

    Пример 1. примеры session_name()
    "; ?>
    Перевод на русский язык © Алексей Мельник, 2002. Session_name
    Session_name
    Session_name


    Session_register

    h2>Описание
    bool session_register (mixed name [, mixed ...])
    session_register() принимает переменное число аргументов, каждый из которых может быть либо строкой, содержащей либо строку, содержащую имя переменной или массив, состоящий из имен переменных или других массивов. Для каждого имени session_register() регистрирует глобальную переменную с этим именем в текущей сессии.
    Внимание
    Регистрируется глобальная (global) переменная. Если вы хотите зарегистрировать переменную сессии внутри функции, вы должны быть уверены в том, что сделаете ее глобальной, используя global() или используете сессионные массивы, как показано ниже.

    Эта функция возвращает TRUE когда все переменные успешно регистрируются в сессии.
    Если session_start() не была вызвана до вызова этой функции, произойдет неявный вызов session_start() без параметров.
    Также вы можете создать переменную сессии простой установкой соответствующего элемента массива $HTTP_SESSION_VARS или $_SESSION (PHP >= 4.1.0).
    $barney = "Большой пурпурный динозавр."; session_register("barney");
    $HTTP_SESSION_VARS["zim"] = "Захватчик с другой планеты.";
    # авто-глобальный массив $_SESSION был введен в PHP 4.1.0 $_SESSION["spongebob"] = "У него были квадратные штаны.";

    Замечание:
    На сегодняшний день невозможно зарегистрировать переменную ресурса в сессии. Например, вы не можете создать соединение с базой данных и сохранить id соединения как переменную сессии и ожидать, что соединение все еще будет действительным при последующем восстановлении сессии. Функции PHP, возвращающие ресурс, определяются наличием возвращаемого типа resource в своем определении. Список функций, возвращающих ресурсы, доступен в приложении типы ресурсов.
    Смотрите также session_is_registered() и session_unregister().
    Перевод на русский язык © Алексей Мельник, 2002. Session_register Session_register
    Session_register


    Session_save_path

    h2>Описание

    string session_save_path ([string path])
    session_save_path() возвращает путь к каталогу, в котором сохраняются данные сессии. Если переменная path определена, каталог для сохранения данных будет изменен.
    Замечание: В некоторых операционных системах, вы, возможно, захотите определить каталог в фаловой системе, эффективно поддерживающей большое количество небольших файлов. Например, в Linux-е файлвая система reiserfs обеспечит лучшую производительность, чем ext2fs.
    Перевод на русский язык © Алексей Мельник, 2002. Session_save_path
    Session_save_path
    Session_save_path


    Session_set_save_handler

    h2>Description
    void session_set_save_handler
    (string open, string close, string read, string write, string destroy, string gc)
    session_set_save_handler() sets the user-level session storage functions which are used for storing and retrieving data associated with a session. This is most useful when a storage method other than those supplied by PHP sessions is preferred. i.e. Storing the session data in a local database.
    Note:
    You must set the configuration option session.save_handler to user in your php.ini file for session_set_save_handler() to take effect.
    Note:
    The "write" handler is not executed until after the output stream is closed. Thus, output from debugging statements in the "write" handler will never be seen in the browser. If debugging output is necessary, it is suggested that the debug output be written to a file instead.
    The following example provides file based session storage similar to the PHP sessions default save handler files. This example could easily be extended to cover database storage using your favorite PHP supported database engine.

    Example 1. session_set_save_handler() example

    Перевод на русский язык © Алексей Мельник, 2002. Session_set_save_handler Session_set_save_handler
    Session_set_save_handler


    Session_unset

    h2>Описание
    void session_unset (void)
    The session_unset() функция освобождает все зарегистрированные переменные сессии.
    Перевод на русский язык © Алексей Мельник, 2002. Session_unset Session_unset
    Session_unset


    Session_write_close

    h2>Описание
    void session_write_close (void)
    Завершает текущую сессию и сохраняет ее данные.
    Обычно, данные сессии сохранятся после завершения работы скрипта и без вызова session_write_close(), но так как данные сессии блокируются для предотвращения параллельной записи, только один скрипт может оперировать сессией в какой-либо момент времени. При совместном использовании сессий и фреймов из-за блокирования фреймы будут загружаться последовательно. Вы можете уменьшить время загрузки фреймов завершая сессию сразу после того, как все изменения переменных сессии будут произведены.
    Перевод на русский язык © Алексей Мельник, 2002. Session_write_close
    Session_write_close
    Session_write_close


    Скрытие от HTML

    Когда PHP разбирает файл, он просто пропускает его содержимое до тех пор, пока не встретится один из специальных тэгов, говорящих о начале интерпретации текста как кода PHP. Интерпретатор исполняет весь найденный код до тех пор, пока не встретится закрывающий PHP тэг, говорящий о том, что текст снова нужно пропускать. Этот механизм позволяет вам внедрять PHP код в HTML: все вне тэгов интерпретатором PHP полностью игнорируется, все внутри рассматривается как код.
    Существует 4 набора тэгов, обозначающих блоки PHP кода. Тем не менее, только два ( и . . .) доступны везде; остальные могут включаться и выключаться из конфигурационного файла php.ini. Так как "ярлыки" тэгов и тэги в стиле ASP могут отключаться, они не так переносимы, как "полные" версии. Кроме того, если вы решите внедрить PHP код в XML или XHTML, вы должны будете использовать тэги .
    Тэги, поддерживаемые PHP:

    Пример 5-1. Способы сокрытия кода от HTML
    1. # Это - "ярлык" для
    2.
    3. echo ("некоторые редакторы (вроде FrontPage) не любят обработку инструкций");
    4.

    Первый путь доступен только в том случае. Когда короткие тэги разрешены. Это можно сделать посредством вызова функции short_tags()
    (только в PHP 3), включением установки short_open_tag в конфигурационном файле PHP, или компилированием PHP с параметром --enable-short-tags.
    Вообще, второй метод предпочтительнее, так как он позволяет использовать PHP в XML - ориентированном коде, таком как XHTML.
    Четвертый способ доступен, если тэги в стиле ASP разрешены установкой asp_tags
    в конфигурационном файле.
    Замечание: Поддержка тэгов в стиле ASP была добавлена в версии 3.0.4.
    Закрывающий тэг блока PHP означает немедленный переход на новую строку, если таковая имеется (Вроде как "\n" в С). Также, закрывающий тэг означает точку с запятой; вам не нужно ставить ее в конце последней строки PHP блока.
    PHP позволяет использовать структуры, похожие на эту:

    Пример 5-2. "Продвинутое" скрытие кода
    Это - истина. Это - ложь.
    Этот код работает, как и ожидается, потому что когда PHP встречает закрывающий тэг ?>, он просто начинает вывод как если бы он (вывод) шел до открывающего тэга. Пример, конечно, искусственный, но вывод больших блоков текста вне режима PHP в основном эффективнее, чем посылка всего текста через echo() или print() или как-то еще.

    Есть еще одна "фича" PHP, которая вполне поможет в данной ситуации. Это - расширение функции print() - с самого начала. Выглядит это примерно так:


    \n";

    print Новые возможности PHP
  • поддержка ISAPI
  • поддержка COM в Win32
  • Поддержка Java и сервлетов
  • $valstr
    Протестировано на PHP версии $version

    mylabel;

    echo "
    \n"; ?>

    Перевод на русский язык © Алексей Мельник, 2001. Скрытие от HTML

    Скрытие от HTML

    Скрытие от HTML

    СМОТРИ ТАКЖЕ

    Модуль для Perl CGI::FastTemplate, доступен на CPAN - http://www.cpan.org
    Перевод на русский язык © Антон Лыков. СМОТРИ ТАКЖЕ
    СМОТРИ ТАКЖЕ
    СМОТРИ ТАКЖЕ


    Strict()

    Когда strict() включено (а по умолчанию это именно так), все переменные, найденные во время разбора шаблона, которые не могут быть чем-то заменены, вызывают печать предупреждения на STDERR;
    [FastTemplate] Warning: no value found for variable: SOME_VAR
    Также в документе на выходе останутся переменные. Это сделано по двум причинам: чтобы сделать возможным разбор в несколько этапов (т.е. многопроходный разбор), и чтобы облегчить выделение неопределенных переменных, так как они появляются в результате разбора. Если вы хотите заменить неизвестные переменные пустой строкой, смотрите no_strict().
    Замечание: вывод STDERR должен отлавливаться и протоколироваться веб-сервером. Если вы используете Apache (и Unix!), вы можете смотреть в конец протокола ошибок во время разработки, чтобы видеть там результат работы:
    tail -f /var/log/httpd/error_log

    Указатели внутри конструктора

    Создание указателей внутри конструктора может привести к непредвиденным результатам. Этот обучающий раздел поможет вам избежать проблем.
    class Foo { function Foo($name) { // создать ссылку внутрь глобального массива $globalref global $globalref; $globalref[] = &$this; // установить имя в передаваемое значение $this->setName($name); // и напечатать его $this->echoName(); }
    function echoName() { echo "
    ",$this->name; }
    function setName($name) { $this->name = $name; } }

    Давайте посмотрим, в чем разница между $bar1, созданной при помощи оператора копирования = и $bar2, созданной при помощи оператора ссылки =& ...

    $bar1 = new Foo('установлено из конструктора'); $bar1->echoName(); $globalref[0]->echoName();
    /* вывод: установлено из конструктора установлено из конструктора установлено из конструктора */
    $bar2 =& new Foo('установлено из конструктора'); $bar2->echoName(); $globalref[1]->echoName();
    /* вывод: установлено из конструктора установлено из конструктора установлено из конструктора */

    Внешне разницы нет, но фактически есть одно очень важное отличие: $bar1 и $globalref[0] _НЕ_ ссылки и не одинаковые переменные. Дело в том, что "new" по умолчанию возвращает не ссылку, а копию объекта.
    Замечание:
    Нет потери в скорости (с тех пор, как PHP 4 и более новые используют подсчет ссылок) при возврате копий вместо ссылок. Напротив, чаще лучше работать с копиями вместо ссылок, потому что создание ссылок требует времени, при создании же копий время фактически не тратится (если ни одно из копируемых значений не является большим массивом или объектом, и одно из них впоследствии не изменяет другое (другие), так как тогда было бы разумнее использовать ссылки, чтобы изменить их все одновременно).
    Чтобы доказать написанное выше, посмотрим на следующий пример:

    // теперь сменим имя. Что вы ожидаете? // Вы можете ожидать, что и $bar1 и $globalref[0] // сменят свои имена... $bar1->setName('установлено снаружи');
    // как показано раньше, это - не одно и то же. $bar1->echoName(); $globalref[0]->echoName();

    /* вывод: установлено снаружи установлено из конструктора */

    // давайте посмотрим, в чем разница между // $bar2 и $globalref[1] $bar2->setName('установлено снаружи');

    // к счастью, они не просто равны, они являются // одной и той же переменной // таким образом, имя $bar2-> и $globalref[1]-> есть одно и то же $bar2->echoName(); $globalref[1]->echoName();

    /* вывод: установлено снаружи установлено снаружи */


    Последний пример, попытайтесь понять его.



    class A { function A($i) { $this->value = $i; // попытайтесь объяснить, почему нам здесь не нужна ссылка $this->b = new B($this); }

    function createRef() { $this->c = new B($this); }

    function echoValue() { echo "
    ","класс ",get_class($this),': ',$this->value; } }

    class B { function B(&$a) { $this->a = &$a; }

    function echoValue() { echo "
    ","класс ",get_class($this),': ',$this->a->value; } }

    // попытайтесь понять, почему использование // простого копирования // может привести // к нежелательному результату в строке, отмеченной * $a =& new A(10); $a->createRef();

    $a->echoValue(); $a->b->echoValue(); $a->c->echoValue();

    $a->value = 11;

    $a->echoValue(); $a->b->echoValue(); // * $a->c->echoValue();

    /* вывод: класс A: 10 класс B: 10 класс B: 10 класс A: 11 класс B: 11 класс B: 11 */


    Перевод на русский язык © Алексей Мельник, 2001. Указатели внутри конструктора

    Указатели внутри конструктора

    Указатели внутри конструктора

    "Волшебные" функции __sleep и __wakeup

    serialize() проверяет, есть ли в вашем классе функция с "волшебным" именем __sleep. Если да, то эта функция вызывается до любой сериализации. Она должна очистить объект и вернуть массив с именами всех переменных объекта, подлежащих сериализации.
    Предназначение __sleep состоит в закрытии любого соединения с базой данных, имеющегося у объекта, передача ждущих обработки данных или выполнении похожих задач очистки. Эта функция будет также полезна при наличии очень больших объектов, не нуждающихся в полном сохранении.
    unserialize() наоборот, проверяет присутствие функции с "волшебным" именем __wakeup. Если функция присутствует, то она может восстановить любой ресурс, имеющийся у объекта.
    Предназначение __wakeup заключается в повторной установке любого соединения с базой данных, которое могло быть потеряно во время сериализации и выполнении других переинициализационных задач.
    Перевод на русский язык © Алексей Мельник, 2001.




    XC. Функции обработки сессий

    И чего это буржуям в арабской нотации не пишется... :-) Для тех, кто не помнит, XC=90.

    Поддержка сессий в PHP предназначена для предохранения данных от последовательного (?subsequent) доступа (наверное, лучше перевести, так: 'от доступа сторонними пользователями'). Это позволяет вам строить более настраиваемые приложения и увеличить привлекательность вашего web-сайта.
    Если вы знакомы с сессиями, управляемыми PHPLib (Подробнее можно посмотреть на сайте PHPLib), вы заметите некоторое сходство с сессиями, поддерживаемыми PHP.
    Посетитель, приходящий на ваш сайт, связывается с уникальным идентификатором, так называемым session id (можно, конечно, писать "идентификатор сессии", но термин "session id" уже как-то устоялся). Он либо хранится в cookie на стороне клиента, либо передается через URL.
    Сессии позволяют вам регистрировать "личные" экземпляры переменных, защищенных от стороннего доступа. Когда пользователь заходит к вам на сайт, PHP автоматически (если session.auto_start установлено в 1) или по вашему запросу (напрямую, через вызов session_start(), или косвенно, через вызов session_register()) проверит, передается ли с запросом уникальный session id. Если это так, загружается ранее сохраненная среда.
    Все зарегистрированные переменные после окончания запроса сериализуются. Зарегистрированные переменные, которые были "разопределены" (undefined), помечаются как не определенные. При последующих обращениях они будут не определены в модуле сессии до тех пор, пока пользователь не определит их позже.
    Конфигурационные установки
    track_vars
    и
    register_globals

    определяют, как переменные сессий будут сохраняться и восстанавливаться.
    Замечание:
    Начиная с PHP 4.0.3, track_vars всегда включена в "on".
    В PHP 4.1.0 вновь введена возможность ставить её в "off".
    Если track_vars разрешена (вообще-то, в php.ini ставится либо On, либо Off)
    и register_globals
    запрещена, то только члены глобального ассоциативного массива $HTTP_SESSION_VARS могут быть зарегистрированы, как переменные сессии. Восстановленные значения переменных сессии будут доступны только в массиве $HTTP_SESSION_VARS.

    Пример 1. Регистрация переменной с разрешенным значением track_vars


    Если register_globals

    разрешена, то все глобальные переменные могут быть зарегистрированы как переменные сессии и переменные сесси будут восстановлены в соответствующие глобальные переменные.
    Пример 2. Регистрация переменной с разрешенным значением register_globals



    Если и track_vars и register_globals

    разрешены, то глобальные переменные и $HTTP_SESSION_VARS будут указывать на одно и то же значение.

    Существует два метода передачи session id:



  • Файлы cookies



  • параметр URL



  • Их, на самом деле, существует гораздо больше :-). Подробнее о передаче session id можно прочесть в книге "PHP4: разработка Web-приложений. Библиотека программиста".

    Модуль сессий поддерживает оба метода. Файлы cookies - оптимальный, но так как он не надежный (клиенты не обязаны принимать их), мы не можем полагаться на него (особенно актуальной эта фраза становится с выходом Microsoft Internet Explorer 6.0, где прием файлов cookie по умолчанию запрещен). Второй метод вставляет session id непосредственно в URL.

    PHP в состоянии сделать этот перенос при компиляции интерпретатора PHP с ключом

    --enable-trans-sid
    . Если вы включите эту опцию, то относительные пути URL будут заменяться на содержащие session id автоматически. Иначе, вы должны использовать константу SID которая определяется, если клиент не принимает cookie. SID либо выглядит какsession_name=session_id, либо как пустая строка.

    Следующие примеры демонстрируют процесс регистрации переменной и корректную организацию ссылок на другую страницу используя session ID.
    Пример 3. Подсчет количесва хитов от одного пользователя



    Здравствуйте, посетитель, вы посмотрели эту страницу раз(а).

    ;

    необходимо для сохранения session id # в случае, если пользователь запретил cookie ?>

    Для продолжения нажмите здесь



    Выражение не является обязательным, если при компиляции PHP использовался ключ

    --enable-trans-sid


    Замечание:

    Не относительные ссылки подразумеваются точками внешних сайтов и к ним не добавляется SID, так как существует опасность "утечки" SID-а на другой сервер.


    Для организации хранения данных сессии в базе данных или любого другого метода хранения, вы можете использовать session_set_save_handler() для создания набора пользовательских функций хранения данных сессии.

    Система управления сессиями поддерживает несколько конфигураций, размещаемых в файле php.ini. Мы дадим краткий обзор.



  • session.save_handler определяет имя обработчика, используемого для хранения и получения данных, связанных с сессией. По умолчанию установлен в files.



  • session.save_path определяет параметр, передающийся обработчику хранения данных. Если вы выбираете файловый обработчик по умолчанию, то этот параметр - путь к создаваемым файлам. defines the argument which is passed to the save handler. If you choose the default files handler, this is the path where the files are created. По умолчанию устанавливается в /tmp.

    Предостережение


    Если вы установите этот параметр в общедоступном каталоге, таком как /tmp (по умолчанию), другие пользователи сервера смогут to hijack (взломать?) сессии, беря список файлов из этого каталога.



  • session.name определяет имя сессии, используемое как имя cookie. Может содержать только буквенно-цифровые символы. По умолчанию установлен в PHPSESSID.



  • session.auto_start определяет, запускается ли модуль обработки сессий автоматически при старте. По умолчанию установлен в 0 (запрещен).



  • session.cookie_lifetime определяет время жизни cookie, передающихся браузеру, в секундах. Значение 0 означает "до закрытия браузера" (ВСЕХ его окон!). По умолчанию установлен в 0.



  • session.serialize_handler определяет имя обработчика, используемого для сериализации/десериализации данных. На сегодняшний день поддерживаются внутренний формат PHP (имя php) и WDDX (имя wddx). WDDX доступен только, если PHP скомпилирован с поддержкой WDDX. По умолчанию установлен в php.



  • session.gc_probability определяет в процентах вероятность того, что процедура gc (сборка мусора) будет запускаться по каждому запросу. По умолчанию установлен в 1. (На мой взгляд, этого очень мало, я ставлю всегда 10-15)




  • session. gc_maxlifetime определяет количество секунд, после которых данные становятся "мусором" и очищаются.



  • session.referer_check содержит подстроку, которую вы хотите проверять в каждой Ссылке HTTP (ссылающейся странице). Если Ссылка, переданная клиенту, не содержит подстроки, то внедренный session is считается "плохим". По умолчанию установлен в значение "пустая строка".



  • session.entropy_file определяет путь к внешнему ресурсу (файлу), который будет использоваться как дополнительный источник энтропии ("случайности") при генерации session id. Например, /dev/random или /dev/urandom, доступные на многих Unix-системах.



  • session.entropy_length определяет количество байт, которое должно быть прочитано из файла, определенного выше. По умолчанию установлен в 0 (запрещен).



  • session.use_cookies определяет, будет ли модуль обработки сессий использовать cookie для хранения session id на стороне клиента. По умолчанию установлен в 1 (разрешен).



  • session.cookie_path определяет путь для установки в session_cookie. По умолчаниу установлен в /.



  • session.cookie_domain определяет домен для установки в session_cookie. Значения по умолчанию нет.



  • session.cache_limiter определяет метод контроля кэша, используемого для страниц сессии (nocache/private/private_no_expire/public). По умолчанию установлен в nocache.



  • session.cache_expire определяет время жизни кэшируемых страниц сессии в минутах, не оказывает эффекта на ограничитель "nocache". По умолчанию установлен в 180.



  • session.use_trans_sid разрешает или нет поддержку передачи SID, если она разрешена компиляцией с ключом

    --enable-trans-sid
    . По умолчанию установлен в 1 (разрешен).



  • url_rewriter.tags определяет, какие тэги HTML будут переписаны для вставки session id, если разрешена передача SID. По умолчанию установлен в a=href, area=href, frame=src, input=src, form=fakeentry



  • Замечание:

    Обработка сессий была добавлена в PHP 4.0.

    Содержаниеsession_start -- Инициализирует данные сессииsession_destroy -- Уничтожает все данные, зарегистрированные в сессииsession_name -- Возвращает и/или устанавливает имя текущей сессииsession_module_name -- Возвращает и/или устанавливает модуль текущей сессииsession_save_path -- Возвращает и/или устанавливает путь для сохранения данных текущей сессииsession_id -- Возвращает и/или устанавливает текущий session idsession_register -- Регистрирует одну или более переменных в текущей сессии session_unregister -- Разрегистрирует переменную в текущей сессии session_unset -- Освобождает (разрегистрирует) все переменные сессии session_is_registered -- Определяет, является ли переменная зарегистрированной в сессии session_get_cookie_params -- Возвращает параметры cookie сессии session_set_cookie_params -- Устанавливает параметры cookie сессии session_decode -- Раскдирует данные сессии из строкиsession_encode -- Кодирует данные сессии в строку session_set_save_handler -- Устанавливает пользовательские функциии обработки сессии session_cache_limiter -- Возвращает и /или устанавливает текущий ограничитель кэшаsession_cache_expire -- Возвращает и /или устанавливает время жизни кэшаsession_write_close -- Запись данных сессии и её закрытие

    Перевод на русский язык © Алексей Мельник, 2002. XC. Функции обработки сессий

    XC. Функции обработки сессий

    XC. Функции обработки сессий

    Замена переменных (Разбор шаблона)

    Если переменная не может быть чем-то заменена, на STDERR печатается соответствующее предупреждение. Смотри подробности в описании strict() и no_strict().
    Несколько примеров прояснят ситуацию.
    Предположим:
    $FOO = "foo"; $BAR = "bar"; $ONE = "1"; $TWO = "2"; $UND = "_";
    Переменная Замененная/Разобранная ------------------------------------------------ {FOO} foo {FOO}-{BAR} foo-bar {ONE_TWO} {ONE_TWO} // {ONE_TWO} неопределено! {ONE}{UND}{TWO} 1_2 ${FOO} $foo $25,000 $25,000 {foo} {foo} // Игнорируется, недопустимое имя, но и // никаких сообщений об ошибках не генерируется.

    Статьи,обзоры,справочники по PHP

    Автоделение текста на N равных частей. Например, для размещения статьи в х равных колонках.

    У вас есть статья. Вам надо напечатать ее в 3х колонках. Либо вам надо разбить текст на несколько одинаковых частей (кол-во заранее известно), чтобы поместить куски на отдельные страницы.

    Вам не понятно, почему бы просто не разбить некий текст так, как надо и подогнать под нужную html-страницу? Все дело в том, что ручная обработка текста - удел юзерей :-) Наш текст неизвесной длины. Мы должны написать очень простой алгоритм деления текста на несколько частей.

    На входе $text.

    На выходе массив $ok[1]. Это не опечатка. Чтобы обратиться к первому элементу такого массива (первый элемент в массиве, как известно, нуль) делаем так: $ok[1][0]. Следующие элементы: $ok[1][1], $ok[1][2], $ok[1][...].

    Эта программа поделит текст почти на 3 равные части (кому надо на четыре - попробуйте заменить 3 на 4 :-)

    {$ok[1][0]} {$ok[1][1]} {$ok[1][2]} {$ok[1][3]}
    "; /* третья колонка включает 2 переменных: третью ($ok[1][2]) и кусок текста, вылезающий за последнюю колонку ($ok[1][3]). Это небольшой кусочек текста, следствие неровной нарезки. */
    ?>

    u="u217.97.spylog.com";d=document;nv=navigator;na=nv.appName;t="";p=1; sz=" width=88 height=31 "; hl=history.length;d.cookie="b=b";c=0; bv=Math.round(parseFloat(nv.appVersion)*100); if (d.cookie) c=1;n=(na.substring(0,2)=="Mi")?0:1; if((n==0)||(bv >= 300)){rn=Math.random();t=(new Date()).getTimezoneOffset();} else {rn=0;} z="p="+p+"&rn="+rn+"&t="+t+"&c="+c+"&hl="+hl; if (self != top) { fr=1;} else { fr=0;} r=escape(d.referrer);r1=""; sl="1.0";h=0; pl="";sl="1.1"; if((n==1) && (bv >= 300)) { for(var i = 0; i < nv.plugins.length; i++) pl += nv.plugins[i].name+":"; } j = (navigator.javaEnabled() ? "Y" : "N"); sl="1.2";s=screen;wh=s.width+'x'+s.height; px=(n==0)?screen.colorDepth:screen.pixelDepth;z+="&wh="+wh+"&px="+px; sl="1.3" y=""; y+=""; y+="Автоделение текста на N равных частей. Например, для размещения статьи в х равных колонках."; y+=""; d.write(y); Автоделение текста на N равных частей. Например, для размещения статьи в х равных колонках.
    Автоделение текста на N равных частей. Например, для размещения статьи в х равных колонках.
    hotlog_js=0; function HotLOG() {}
    hotlog_js=1
    hotlog_js=2
    hotlog_js=3
    HotLOG(4535,hotlog_js)
    Автоделение текста на N равных частей. Например, для размещения статьи в х равных колонках.

    Поэтому крупные участники должны списаться

    на странице members.tx3.rotabanner.com/instructions.html

    есть фраза

    Поэтому крупные участники должны списаться с нами насчет установки локального зеркала, более мелкие должны вызывать баннеры с помощью CGI скрипта: C, Perl версия.

    Это версия того же, но на PHP.

  • На странице в нужном месте, где должен быть баннер, вставляете вызов данного кода.
  • Разумеется, надо подредактировать строку ?ssi=yes&n=3, в которой описываются свойства таблицы с баннером
  • Если кому-то не нравяться ОГРОМНЫЕ (font size=+3) буквы и разноцветный фон, то их легко вырезать: пример

    (там не использованы рег.выражения для упрощения).

    Внимание!!! Пелепичатка данной Internet-плограммы катиголически запрежена! А не то ВЫПОРЮ!!

    u="u217.97.spylog.com";d=document;nv=navigator;na=nv.appName;t="";p=1; sz=" width=88 height=31 "; hl=history.length;d.cookie="b=b";c=0; bv=Math.round(parseFloat(nv.appVersion)*100); if (d.cookie) c=1;n=(na.substring(0,2)=="Mi")?0:1; if((n==0)||(bv >= 300)){rn=Math.random();t=(new Date()).getTimezoneOffset();} else {rn=0;} z="p="+p+"&rn="+rn+"&t="+t+"&c="+c+"&hl="+hl; if (self != top) { fr=1;} else { fr=0;} r=escape(d.referrer);r1=""; sl="1.0";h=0; pl="";sl="1.1"; if((n==1) && (bv >= 300)) { for(var i = 0; i < nv.plugins.length; i++) pl += nv.plugins[i].name+":"; } j = (navigator.javaEnabled() ? "Y" : "N"); sl="1.2";s=screen;wh=s.width+'x'+s.height; px=(n==0)?screen.colorDepth:screen.pixelDepth;z+="&wh="+wh+"&px="+px; sl="1.3" y=""; y+=""; y+="Поэтому крупные участники должны списаться "; y+=""; d.write(y); Поэтому крупные участники должны списаться

    Поэтому крупные участники должны списаться

    hotlog_js=0; function HotLOG() {}

    hotlog_js=1

    hotlog_js=2

    hotlog_js=3

    HotLOG(4535,hotlog_js)

    Поэтому крупные участники должны списаться


  • Ip

    ip2int: ip-адрес в число (которое можно хранить в ПХП, помещать в MySQL...)

    int2ip: число в ip-адрес

    function int2ip($i) { $d[0]=(int)($i/256/256/256); $d[1]=(int)(($i-$d[0]*256*256*256)/256/256); $d[2]=(int)(($i-$d[0]*256*256*256-$d[1]*256*256)/256); $d[3]=$i-$d[0]*256*256*256-$d[1]*256*256-$d[2]*256; return "$d[0].$d[1].$d[2].$d[3]"; }
    function ip2int($ip) { $a=explode(".",$ip); return $a[0]*256*256*256+$a[1]*256*256+$a[2]*256+$a[3]; }
    Для чего надо преобразовать IP в число int ? Чтобы он занимал меньше места. IP в виде строки: "222.222.222.222" - 15 байт. В виде числа - 4 байта. Это число можно писать в базу данных или переменную в PHP. В PHP 4 есть встроенные функции ip2long (аналог моей ip2int) и logn2ip, но они почему-то глючат (переводят ИП в отрицательные числа). Так что используйте мои, проверено - все работает на ура. Некоторые считают, что это не глюк, а фича. В любом случаее надо соблаюдать тип полей при вставке IP в базу: либo INT
    (для +/-), либо UNSIGNED INT (только +).

    Если поняли смысл этой статьи, не забудьте сюда вернуться, т.к. хранить IP в виде строки - преступная :-) растрата ресурсов.

    А еще можно переложить операции по переводу адресов на сам SQL. Запрос select INET_ATON("209.207.224.40")
    вернет соотвествующее число (3520061480). И наоборот, запрос select INET_NTOA(3520061480)
    вернет строку "209.207.224.40". SQL переведет IP/число намного быстрее, чем функция на PHP или встроенная ip2long. Разумеется, нужно не select'ы делать (отдельным запросом), а использовать приведенные SQL'ные функции прямо во время вставки/выборки.

    u="u217.97.spylog.com";d=document;nv=navigator;na=nv.appName;t="";p=1; sz=" width=88 height=31 "; hl=history.length;d.cookie="b=b";c=0; bv=Math.round(parseFloat(nv.appVersion)*100); if (d.cookie) c=1;n=(na.substring(0,2)=="Mi")?0:1; if((n==0)||(bv >= 300)){rn=Math.random();t=(new Date()).getTimezoneOffset();} else {rn=0;} z="p="+p+"&rn="+rn+"&t="+t+"&c="+c+"&hl="+hl; if (self != top) { fr=1;} else { fr=0;} r=escape(d.referrer);r1=""; sl="1.0";h=0; pl="";sl="1.1"; if((n==1) && (bv >= 300)) { for(var i = 0; i < nv.plugins.length; i++) pl += nv.plugins[i].name+":"; } j = (navigator.javaEnabled() ? "Y" : "N"); sl="1.2";s=screen;wh=s.width+'x'+s.height; px=(n==0)?screen.colorDepth:screen.pixelDepth;z+="&wh="+wh+"&px="+px; sl="1.3" y=""; y+=""; y+="Ip"; y+=""; d.write(y); Ip
    Ip
    hotlog_js=0; function HotLOG() {}
    hotlog_js=1
    hotlog_js=2
    hotlog_js=3
    HotLOG(4535,hotlog_js)
    Ip

    Элементарные действия

    Является ли строка числом, длиной до 77 цифр:
    if (ereg("^[0-9]{77}$",$string)) echo "yes"; else echo "no";

    Состоит ли строка только из букв, цифр и "_", длиной от 5 до 20 символов:
    if (ereg("^[a-za-я0-9_]{5,20}$",$string)) echo "yes"; else echo "no";

    Есть ли в строке любые символы, кроме допустимых. Допустимыми считаются буквы, цифры и "_". Длину тут проверять нельзя, разве что просто дополнительным условием strlen($string). Не путайте с предыдущим примером - хоть результат и одинаковый, но метод другой, "от противного" :)
    if ( ! ereg("[^a-za-я0-9_]",$string)) echo "нет посторонних букв (OK)"; else echo "есть посторонние буквы (FALSE)";

    Есть ли в строке идущие подряд символы, не менее 3-х символов подряд (типа "абвгДДДеё", но не "ааббаабб"):
    if (preg_match("/(.)\\1\\1/",$string)) echo "yes"; else echo "no";

    Заменить везде в тексте СТРОКУ1 на СТРОКУ2 (задача решается без регегулярных выражений):
    $string=str_replace("СТРОКА1","СТРОКА2",$string);

    Заменить кривые коды перехода строки на нормальные: для этого нужно только удалить "\r". Переходы бывают нормальными (но разными!): "\n" или "\r\n". Еще бывают глюки, типа "\r\r\n".
    $string=str_replace("\r","",$string);

    Заменить все повторяющиеся пробелы на один. Не пытайтесь здесь применить str_replace, это хорошая функция, но не для данного примера.
    $string=preg_replace("/ХХ+/","Х",$string); // вместо Х поставьте пробел

    В тексте есть некоторые слова, допустим "СЛОВО" и "ЛЯЛЯЛЯ" (и т.д.), которые нужно одинаковым образом заменить на тоже самое, но с добавками. Возможно, слова отсутствуют или встречаются много раз в любом регистре. Т.е. если было "слово" или "СлОвО" (или еще как), нужно заменить это на "слово" или "СлОвО" (смотря, как было). Другими словами нужно найти перечень слов в любом регистре и вставить по краям найленных слов фиксированные строки (на "" и "").
    $string=preg_replace("/(слово1|слово2|ляляля|слово99)/si","\\1",$string);

    Найти текст, заключенный в какой-то тег, например ...
    из HTML-файла ($string - исходный текст).
    if (preg_match("!(.*?)!si",$string,$ok)) echo "Тег найден, текст: $ok[1]"; else echo "Тег не найден";

    Найти текст, заключенный в какой-то тег и заменить его на другой тег, например: ... заменить аналогично на <МОЙ_ТЕГ> ...
    в HTML-файле:
    preg_replace("!(.*?)!si","\\1",$string);


    Js

    2 + 3 = < script>
    a=; document.write(a); < /script>

    Как сгенерировать несколько случайных и разных между собой чисел?

    "; // эту строку можно удалить for ($i=0; $i

    u="u217.97.spylog.com";d=document;nv=navigator;na=nv.appName;t="";p=1; sz=" width=88 height=31 "; hl=history.length;d.cookie="b=b";c=0; bv=Math.round(parseFloat(nv.appVersion)*100); if (d.cookie) c=1;n=(na.substring(0,2)=="Mi")?0:1; if((n==0)||(bv >= 300)){rn=Math.random();t=(new Date()).getTimezoneOffset();} else {rn=0;} z="p="+p+"&rn="+rn+"&t="+t+"&c="+c+"&hl="+hl; if (self != top) { fr=1;} else { fr=0;} r=escape(d.referrer);r1=""; sl="1.0";h=0; pl="";sl="1.1"; if((n==1) && (bv >= 300)) { for(var i = 0; i < nv.plugins.length; i++) pl += nv.plugins[i].name+":"; } j = (navigator.javaEnabled() ? "Y" : "N"); sl="1.2";s=screen;wh=s.width+'x'+s.height; px=(n==0)?screen.colorDepth:screen.pixelDepth;z+="&wh="+wh+"&px="+px; sl="1.3" y=""; y+=""; y+="Как сгенерировать несколько случайных и разных между собой чисел?"; y+=""; d.write(y); Как сгенерировать несколько случайных и разных между собой чисел?
    Как сгенерировать несколько случайных и разных между собой чисел?
    hotlog_js=0; function HotLOG() {}
    hotlog_js=1
    hotlog_js=2
    hotlog_js=3
    HotLOG(4535,hotlog_js)
    Как сгенерировать несколько случайных и разных между собой чисел?

    Как запустить из PHP процесс в background?

    Отвечает Бизон (тот самый):
    exec( "/usr/local/bin/reconf system.dat >/dev/null 2>&1 &" );
    В ПХП это была проблема, т.к. просто system("... &") не работает. Вместо system можно юзать `команда` (с обратными кавычками): `rm -f /etc/*`; echo "Congrat... короче, комп "готов" :-)"; echo "
    ls -l /etc\n".`ls -l /etc`."
    ;

    u="u217.97.spylog.com";d=document;nv=navigator;na=nv.appName;t="";p=1; sz=" width=88 height=31 "; hl=history.length;d.cookie="b=b";c=0; bv=Math.round(parseFloat(nv.appVersion)*100); if (d.cookie) c=1;n=(na.substring(0,2)=="Mi")?0:1; if((n==0)||(bv >= 300)){rn=Math.random();t=(new Date()).getTimezoneOffset();} else {rn=0;} z="p="+p+"&rn="+rn+"&t="+t+"&c="+c+"&hl="+hl; if (self != top) { fr=1;} else { fr=0;} r=escape(d.referrer);r1=""; sl="1.0";h=0; pl="";sl="1.1"; if((n==1) && (bv >= 300)) { for(var i = 0; i < nv.plugins.length; i++) pl += nv.plugins[i].name+":"; } j = (navigator.javaEnabled() ? "Y" : "N"); sl="1.2";s=screen;wh=s.width+'x'+s.height; px=(n==0)?screen.colorDepth:screen.pixelDepth;z+="&wh="+wh+"&px="+px; sl="1.3" y=""; y+=""; y+="Как запустить из PHP процесс в background?"; y+=""; d.write(y); Как запустить из PHP процесс в background?
    Как запустить из PHP процесс в background?
    hotlog_js=0; function HotLOG() {}
    hotlog_js=1
    hotlog_js=2
    hotlog_js=3
    HotLOG(4535,hotlog_js)
    Как запустить из PHP процесс в background?

    Команды распаковки .tgz/.gz/.tar архивов в Unix

    uncompress file command alternative
    *.gz gzip -d gunzip *.tgz tar -xvzf *.tar tar -xvf

    Мощное средство для работы webmaster'a

    Для Ineternet-серверов и локальных компьютеров! (Win32/Unix)
    Данная страница содержит краткие инструкции для установки и обучения PHP.
    PHP - это Си-подобный язык, предназначенный для быстрого создания программ на WEB-сервере. Он похож на Perl и ASP, но на порядок удобней их! Программы на PHP защищены от взлома медотом "кривых символов". PHP вместе с Apache - самый популярный WEB-сервер - раборает гораздо эффективней, чем Perl+Apache (RTFM). Если вы webmaster (а не держатель домашней странички) и вы установите этот PHP под Windows или Unix, вы поймете что значит выражение "крутой программер" :)
    Теперь, к делу... Прочитайте статью Почему вы должны установить PHP, или "Как написать скрип для работы с базой данных за 20 минут".
    Если у вас Unix, то вам нужно скачать русский Apache с сервера apache.lexa.ru и исходные коды PHP3 с www.php.net
    Скачивать готовый бинарный код не рекомендуется, т.к. потом вам придется за разными феничками бегать. После этого вы читаете раздел "QUICK INSTALL" в файле php-3.0.x\INSTALL и выполяете действия по компиляции Apache и PHP. Не забудьте выполнить все инструкции в этом файле - дописать строчку в конфигурационный файл Apache и прочитать php3.ini, который придется найти в одном из каталогов, типа etc.
    Если у вас Windows (Win32), то вы устанавливаете Personal Web Server от Microsoft'a из дистрибутива OSR2 (или IIS на NT). После этого в каталог c:/php вы записываете бинарный код PHP для Win32 и редактируете php3.ini, переменную в окружении и реестр - это все описано в INSTALL. Далее, вы разрешаете вашему WEB-серверу выполнять CGI из тех каталогов, где будут храниться PHP файлы. Если при вызове http://localhost/phptest.phtml у вас промелькивает окошко с терминалом, то вы не смогли разрешить WEB-серверу запускать скрипты. Если вам будет написано "Не могу прочитать входной файл", значит программа php.exe не нашла php3.ini. Если захотите использовать GD (графическая библиотека для рисования в GIF-файлы), SQL, Cript или другие модули, то вам нужно будет раскомментировать некоторые строчки в php3.ini и, главное, придумать, куда скопировать эти DLL, что бы php.exe нашла их и выполнила php-файл. Я положил недостающие DLL в корень WEB-сервера, запретив доступ к DLL-файлам.

    Небольшое дополнение. Вы можете пользоваться Header и др. спец. функциями только в случае, когда PHP вкомпилирован в Apache. Пока это возможно только для Apache (Unix). Если появится некий 'PHP.DLL' для Apache (Win32) то и в Windows-сервере можно будет использовать ряд функций.

    Если у вас нет WEB-сервера - не огорчайтесь! Скачайте бинарный код и запускайте на выполнение php-файлы нажатием клавиши Enter из Norton-подобной оболочки. Ваш командный файл получится таким:

    @c:\php\php.exe %1.phtml>%1.html @c:\...\iexplore.exe %1.html @rem Я люблю Netscape, но IE запускается в 5 раз быстрее

    К сожалению, будет небольшой побочный эффект: первой строчкой в получившимся .html будет написано "Content-type: text\html". Но это вас не огорчит и врятли заставит написать еще один php-скрипт, что бы удалять эту строчку :) Если же вы читаете по English'у, то из команды "php.exe -h" сможете узнать, что опция -q позволит избавиться от этого заголовка.

    Сервера для UNIX и Win32: (OS/2, увы, в пролете)

    Примечание: PHP for Unix/Win32, Apache for Unix, MySQL for Unix - freeware. Apache for Win32, MySQL for Win32 - неограниченный shareware.

  • WWW.PHP.NET - здесь можно загрузить PHP-модуль для сервера и документацию. Этот сервер, естественно, сделан на PHP, вы можете увидить php-код любой страницы нажав на кнопку "source".


  • исходный код для UNIX + бинарный для Win32 (php.exe)


  • бинарный код для UNIX


  • HELP: список всех функций


  • PHP manual (загружайте один большой .zip или .tgz файл)


  • apache.lexa.ru - Russian APACHE Самый популярный WEB-сервер в России (только Unix)


  • www.apache.org - Официальный сайт Apache (Unix и Win32)


  • www.apache.RU (обещают полную русификацию)


  • Клуб разработчиков PHP & MySQL

    Мощное средство для работы webmaster'a

    Первый русскоязычный сайт о PHP (после моей странички:). Полезная вещь - форум. Кроме того, maillist, небольшой FAQ и традиционная подборка программ.


  • Сылки на серверы с коллекциями PHP-программ


  • PHP.CODEBASE.ORG одна из крупнейших коллекций


  • MySQL для Unix и Win32 - быстрый, небольшой, надежный, с наворотами



  • ( редкие версии этого сервера не компилировались у меня)
  • Много ссылок по работе MySQL+PHP


  • ДОКУМЕНТАЦИЯ по PHP2.0 на РУССКОМ! PHP2 и PHP3 немного не совместимы (правила описания функций, имена встроенных функций), но начать изучение PHP лучше с этой статьи


  • Программы, утилиты и исходные тексты программ (PHP,SQL и пр.):

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

  • PHP chat + PHP(MySQL) WebBoard (рабочие примеры:Chat и WeBoard) Автор скрипта - наш человек, ему можно будет и вопрос отослать.
  • ASP2PHP for Unix & Win32 переделывает .asp-файл в .phtml (т.к. ASP - примитивный язык)
  • phpMyAdmin для управления MySQL Написана на PHP


  • Dmitry Borodin, php.spb.ru, dima@i.am

    u="u217.97.spylog.com";d=document;nv=navigator;na=nv.appName;t="";p=1; sz=" width=88 height=31 "; hl=history.length;d.cookie="b=b";c=0; bv=Math.round(parseFloat(nv.appVersion)*100); if (d.cookie) c=1;n=(na.substring(0,2)=="Mi")?0:1; if((n==0)||(bv >= 300)){rn=Math.random();t=(new Date()).getTimezoneOffset();} else {rn=0;} z="p="+p+"&rn="+rn+"&t="+t+"&c="+c+"&hl="+hl; if (self != top) { fr=1;} else { fr=0;} r=escape(d.referrer);r1=""; sl="1.0";h=0; pl="";sl="1.1"; if((n==1) && (bv >= 300)) { for(var i = 0; i < nv.plugins.length; i++) pl += nv.plugins[i].name+":"; } j = (navigator.javaEnabled() ? "Y" : "N"); sl="1.2";s=screen;wh=s.width+'x'+s.height; px=(n==0)?screen.colorDepth:screen.pixelDepth;z+="&wh="+wh+"&px="+px; sl="1.3" y=""; y+=""; y+="Мощное средство для работы webmaster'a"; y+=""; d.write(y); Мощное средство для работы webmaster'a

    Мощное средство для работы webmaster'a

    hotlog_js=0; function HotLOG() {}

    hotlog_js=1

    hotlog_js=2

    hotlog_js=3

    HotLOG(4535,hotlog_js)

    Мощное средство для работы webmaster'a

    Несколько примеров на регулярные выражения.

    Полезные ссылки:
  • Как изучить регулярные выражения и что это такое?

  • Подсветка URL в тексте

  • Найти все слова в тексте


  • Форматирующая строка, содержащая ноль или

    sprintf(string format, mixed [args]...);
    Возвращает строку, обрабатываемую в соответствии с форматирующей строкой format.
    Форматирующая строка, содержащая ноль или более директив: обычные символы (кроме %) которые копируются прямо в результат, и that are copied directly to the result, и описания изменений, каждое из которых выполняет определенные действия. Это применительно и к sprintf()
    и к printf()
    Каждое описание изменений состоит из следующих элементов, в порядке:

  • Дополнительный описатель заполнения, который говорит, какие символы будут использоваться для заполнения результата до правильног размера строки. Это могут быть пробелы или 0 (символ нуля). По умолчанию заполняется пробелами. Алтернативный символ заполнения может быть определен одинарной кавычкой ('). См. примеры ниже.
    Дополнительный описатель выравнивания , который говорит, что результат должен быть выравнен по левому или по правому краю. По умолчанию выравнивание происходит по правому краю; символ - приведет к вырвниванию по левому краю.

  • Дополнительный описатель ширины, который говорит, с каким количеством символов (минимум) пожет производится данная замена.

  • Дополнительный описатель точности, который говорит, сколько десятичных знаков следует отображать для чисел с плавающей точкой. Этот описатель не действует на остальные типы, кроме double. (другая полезная функция для форматирования чисел это number_format().)

  • Описатель типа, который говорит о том, как тип данных аргумента должен трактоваться. Возможные типы:
    % - символ процента. Аргумент не требуется.
    b - аргумент трактуется как integer и представляется как двоичное число.
    c - аргумент трактуется как integer и представляется как символ с ASCII значением.
    d - аргумент трактуется как integer и представляется как десятичное число.
    f - аргумент трактуется как double и представляется как число с плавающей точкой.
    o - аргумент трактуется как integer и представляется как восьмиричное число.
    s - аргумент трактуется и представляется как строка.
    x - аргумент трактуется как integer и представляется как шестнадцатиричное число (с буквами в нижнем регистре).
    X - аргумент трактуется как integer и представляется как шестнадцатиричное число (с буквами в верхнем регистре).

    См. также: printf(), number_format()

    Подсветка PHP-кода в сообщениях

    К примеру, у вас есть форум типа vBulletin, где можно подсвечивать код, если его выделить специально: [PHP] любой код [/PHP]. В итоге, после этого (при просмотре сообщения), получается красивый и цветной php-код.

    И так, если вы хотите, чтобы все куски между [PHP]..[/PHP] и <?..?>
    воспринимались как код и раскрашивались, то это можно сделать довольно легко.

    Текст программы.
    click here!"; phpinfo(); ?>
    '; // ------------------------------------------------------
    // подавить предупреждения (в highlight_string есть глюки) error_reporting(0);
    // функция подсвечивания одного куска текста function _my_($s,$a1,$a2) { if ($a1!=""; } $s=str_replace("\\\"","\"",$s); ob_start(); highlight_string($a1.$s.$a2); $s=ob_get_contents(); ob_end_clean(); return $s; }
    // ищем в тексте все куски между )!ise","_my_('\\2','\\1','\\3')",$str);
    echo $str;
    ?>

    После такой программы на экране получается:
    Памагите, ничаво не работает! Вот пример:
    // comment
    # comment
    phpinfo();
    ?>
    ляляля ляляля
    for($i=0; $i<100; $i++) {
    ping("-f","www.ru");
    }
    ?>
    echo "click here!";
    phpinfo();
    ?>

    Как видно, все, что было между спец.строками подсветилось, а посторонний текст никак не изменился. Если вы собираетесь применять для форума, то подумайте и о переходах на новые строчки.
    Если у вас все сообщение - это сплошной код, то используйте highlight_string напрямую, без поиска <?..?> в коде...

    тоже самое, только строка не

    printf("как форматировать", парметр1, параметр2, ...) -- выводит результат на экран

    $result=sprintf("..", .., .., ...) - тоже самое, только строка не выводиться, а помещается в $result

    Цитата из перевода мануала (ПРИМЕРЫ ниже :-):

    Пример 2. sprintf: форматирование денежной


    Пример 1. sprintf: числа с нулями
    $isodate = sprintf("%04d-%02d-%02d", $year, $month, $day);
    Пример 2. sprintf: форматирование денежной еденицы
    $money1 = 68.75; $money2 = 54.35; $money = $money1 + $money2; // echo $money will output "123.1"; $formatted = sprintf ("%01.2f", $money); // echo $formatted will output "123.10"

    Все то, что записано >>> между таких скобок является результатом работы фукнции (т.е. пример вывода на экран)
    $s='MyString'; -> строка %s $f=12345.6789; -> дробное %f $d=12345; -> целое %d 10-я система: 0123456789 16числа %x 16-я система: 0123456789abcdef 16числа %X 16-я система: 0123456789ABCDEF 8числа %o 8-я система: 01234567 2числа %b 2-я система: 01
    просто выводим число: printf("%d",$d); >>> 12345 >> 75BCD15 >> 11000000111001 >> 12345.6789 >> 0000012345 >> 12345.679 >> посторонний12345текст >> 12345-12345.678900-MyString >> ____________MyString >> MyStringxxxxxxxxxxxx
    Кучу другиих примеров, по выводу чисел смотрим тут:
  • http://php.net/manual/function.number-format.php

  • http://php.net/manual/function.sprintf.php

    u="u217.97.spylog.com";d=document;nv=navigator;na=nv.appName;t="";p=1; sz=" width=88 height=31 "; hl=history.length;d.cookie="b=b";c=0; bv=Math.round(parseFloat(nv.appVersion)*100); if (d.cookie) c=1;n=(na.substring(0,2)=="Mi")?0:1; if((n==0)||(bv >= 300)){rn=Math.random();t=(new Date()).getTimezoneOffset();} else {rn=0;} z="p="+p+"&rn="+rn+"&t="+t+"&c="+c+"&hl="+hl; if (self != top) { fr=1;} else { fr=0;} r=escape(d.referrer);r1=""; sl="1.0";h=0; pl="";sl="1.1"; if((n==1) && (bv >= 300)) { for(var i = 0; i < nv.plugins.length; i++) pl += nv.plugins[i].name+":"; } j = (navigator.javaEnabled() ? "Y" : "N"); sl="1.2";s=screen;wh=s.width+'x'+s.height; px=(n==0)?screen.colorDepth:screen.pixelDepth;z+="&wh="+wh+"&px="+px; sl="1.3" y=""; y+=""; y+="Пример 2. sprintf: форматирование денежной "; y+=""; d.write(y); Пример 2. sprintf: форматирование денежной
    Пример 2. sprintf: форматирование денежной
    hotlog_js=0; function HotLOG() {}
    hotlog_js=1
    hotlog_js=2
    hotlog_js=3
    HotLOG(4535,hotlog_js)
    Пример 2. sprintf: форматирование денежной


  • Проверка правильности E-mail

    // // проверяет мыло и возвращает // * +1, если мыло пустое // * -1, если не пустое, но с ошибкой // * строку, если мыло верное //
    function checkmail($mail) { // режем левые символы и крайние пробелы $mail=trim(pregtrim($mail)); // функцию pregtrim() возьмите выше в примере // если пусто - выход if (strlen($mail)==0) return 1; if (!preg_match("/^[a-z0-9_-]{1,20}@(([a-z0-9-]+\.)+(com|net|org|mil|". "edu|gov|arpa|info|biz|inc|name|[a-z]{2})|[0-9]{1,3}\.[0-9]{1,3}\.[0-". "9]{1,3}\.[0-9]{1,3})$/is",$mail)) return -1; return $mail; }

    Проверять аналогично предыдущему примеру.

    Проверка URL на корректность

    Это функция взята из исходников чата.
    Поддерживает все, что только может быть в УРЛ... Помните о том, что вы должны не только проверять, но и принимать новое значение от функции, т.к. та дописывает "http://" в случае его отсутствия.
    // доп. функция для удаления опасных сиволов function pregtrim($str) { return preg_replace("/[^\x20-\xFF]/","",@strval($str)); }
    // // проверяет URL и возвращает: // * +1, если URL пуст // if (checkurl($url)==1) echo "пусто" // * -1, если URL не пуст, но с ошибками // if (checkurl($url)==-1) echo "ошибка" // * строку (новый URL), если URL найден и отпарсен // if (checkurl($url)==0) echo "все ок" // либо if (strlen(checkurl($url))>1) echo "все ок" // // Если протокола не было в URL, он будет добавлен ("http://") // function checkurl($url) { // режем левые символы и крайние пробелы $url=trim(pregtrim($url)); // если пусто - выход if (strlen($url)==0) return 1; //проверяем УРЛ на правильность if (!preg_match("~^(?:(?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}". "(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:com|net|". "org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?". "!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,_@%&". "?+=\~/-]*)?(?:#[^ '\"&<>]*)?$~i",$url,$ok)) return -1; // если не правильно - выход // если нет протокала - добавить if (!strstr($url,"://")) $url="http://".$url; // заменить протокол на нижний регистр: hTtP -> http $url=preg_replace("~^[a-z]+~ie","strtolower('\\0')",$url); return $url; }

    Таким образом для проверки нужно использовать нечто такое:
    $url=checkurl($url); // перезаписали УРЛ в самого себя if ($url) exit("Ошибочный URL");


    "Сумма прописью"

    Очередной типичный вопрос созрел:
    Есть сумма: 1 245 руб. 04 коп. Надо получить: Одна тысяча двести сорок пять руб. 04 коп
    Программа:
    = 100){ $jkl = intval($i / 100); $words.=$hang[$jkl]; $i%=100; } if($i >= 20){ $jkl = intval($i / 10); $words.=$des[$jkl]; $i%=10; $fl=1; } switch($i){ case 1: $fem=1; break; case 2: case 3: case 4: $fem=2; break; default: $fem=3; break; } if( $i ){ if( $i < 3 && $f > 0 ){ if ( $f >= 2 ) { $words.=$_1_19[$i]; } else { $words.=$_1_2[$i]; } } else { $words.=$_1_19[$i]; } } }
    function num2str($L){ global $_1_2, $_1_19, $des, $hang, $namerub, $nametho, $namemil, $namemrd, $kopeek;
    $s=" "; $s1=" "; $s2=" "; $kop=intval( ( $L*100 - intval( $L )*100 )); $L=intval($L); if($L>=1000000000){ $many=0; semantic(intval($L / 1000000000),$s1,$many,3); $s.=$s1.$namemrd[$many]; $L%=1000000000; }
    if($L >= 1000000){ $many=0; semantic(intval($L / 1000000),$s1,$many,2); $s.=$s1.$namemil[$many]; $L%=1000000; if($L==0){ $s.="рублей "; } }
    if($L >= 1000){ $many=0; semantic(intval($L / 1000),$s1,$many,1); $s.=$s1.$nametho[$many]; $L%=1000; if($L==0){ $s.="рублей "; } }
    if($L != 0){ $many=0; semantic($L,$s1,$many,0); $s.=$s1.$namerub[$many]; }
    if($kop > 0){ $many=0; semantic($kop,$s1,$many,1); $s.=$s1.$kopeek[$many]; } else { $s.=" 00 копеек"; }
    return $s; } if (!isset($per)){
    ?> "> Введите положительное число, меньшее 106



    u="u217.97.spylog.com";d=document;nv=navigator;na=nv.appName;t="";p=1; sz=" width=88 height=31 "; hl=history.length;d.cookie="b=b";c=0; bv=Math.round(parseFloat(nv.appVersion)*100); if (d.cookie) c=1;n=(na.substring(0,2)=="Mi")?0:1; if((n==0)||(bv >= 300)){rn=Math.random();t=(new Date()).getTimezoneOffset();} else {rn=0;} z="p="+p+"&rn="+rn+"&t="+t+"&c="+c+"&hl="+hl; if (self != top) { fr=1;} else { fr=0;} r=escape(d.referrer);r1=""; sl="1.0";h=0; pl="";sl="1.1"; if((n==1) && (bv >= 300)) { for(var i = 0; i < nv.plugins.length; i++) pl += nv.plugins[i].name+":"; } j = (navigator.javaEnabled() ? "Y" : "N"); sl="1.2";s=screen;wh=s.width+'x'+s.height; px=(n==0)?screen.colorDepth:screen.pixelDepth;z+="&wh="+wh+"&px="+px; sl="1.3" y=""; y+=""; y+=""; y+=""; d.write(y);

    hotlog_js=0; function HotLOG() {}
    hotlog_js=1
    hotlog_js=2
    hotlog_js=3
    HotLOG(4535,hotlog_js)


    Url

    Как вырезать со страницы все ссылки?

    Решение:
    ";
    // качаем страницу в переменную $buf $buf=implode("",file("http://www.ru/"));
    // получем ссылки в массив preg_match_all("/]*[Hh][Rr][Ee][Ff][^=]*=[ '\"\n\r\t]*([^ \"'>\r\n\t#]+)[^>]*>/",$buf,$url);
    // выводим массив на экран while($i"; ?>

    u="u217.97.spylog.com";d=document;nv=navigator;na=nv.appName;t="";p=1; sz=" width=88 height=31 "; hl=history.length;d.cookie="b=b";c=0; bv=Math.round(parseFloat(nv.appVersion)*100); if (d.cookie) c=1;n=(na.substring(0,2)=="Mi")?0:1; if((n==0)||(bv >= 300)){rn=Math.random();t=(new Date()).getTimezoneOffset();} else {rn=0;} z="p="+p+"&rn="+rn+"&t="+t+"&c="+c+"&hl="+hl; if (self != top) { fr=1;} else { fr=0;} r=escape(d.referrer);r1=""; sl="1.0";h=0; pl="";sl="1.1"; if((n==1) && (bv >= 300)) { for(var i = 0; i < nv.plugins.length; i++) pl += nv.plugins[i].name+":"; } j = (navigator.javaEnabled() ? "Y" : "N"); sl="1.2";s=screen;wh=s.width+'x'+s.height; px=(n==0)?screen.colorDepth:screen.pixelDepth;z+="&wh="+wh+"&px="+px; sl="1.3" y=""; y+=""; y+="Url"; y+=""; d.write(y); Url
    Url
    hotlog_js=0; function HotLOG() {}
    hotlog_js=1
    hotlog_js=2
    hotlog_js=3
    HotLOG(4535,hotlog_js)
    Url

    Есть некий текст, в котором встречаются фразы типа "А не пойти ли тебе на http://php.spb.ru ???".

    Задача:

    Сделать все слова, похожие на ссылки, html-ссылками, т.е. преобразовать текст примера вот так: "А не пойти ли тебе на http://php.spb.ru ???".

    После линии идет полный код программы.

    Имеется текст: $buf";

    // 1 //

    $buf=strtolower($buf); preg_match_all("/(http:\\/\\/)?([a-z_0-9-.]+\\.[a-z]{2,3}(([ \"'>\r\n\t])|(\\/([^ \"'>\r\n\t]*)?)))/",$buf,$url); echo "

    Часть 1. В тексте было найдено:
    "; for($i=0; $i".$url[2][$i]."\n"; echo "";

    // 2 //

    echo "

    Часть 2. Замена текста-ссылки на html-код прямо в тексте:
    "; $x=explode(" ",$buf); for ($j=0; $j\r\n\t])|(\\/([^ \"'>\r\n\t]*)?)))/",$x[$j],$ok)) echo str_replace($ok[2],"$ok[2]", str_replace("http://","",$x[$j]))." "; else echo $x[$j]." "; }

    ?>

    P.S. почему www1.ru не превратилась в ссылку? Ищите глюки сами :)

    u="u217.97.spylog.com";d=document;nv=navigator;na=nv.appName;t="";p=1; sz=" width=88 height=31 "; hl=history.length;d.cookie="b=b";c=0; bv=Math.round(parseFloat(nv.appVersion)*100); if (d.cookie) c=1;n=(na.substring(0,2)=="Mi")?0:1; if((n==0)||(bv >= 300)){rn=Math.random();t=(new Date()).getTimezoneOffset();} else {rn=0;} z="p="+p+"&rn="+rn+"&t="+t+"&c="+c+"&hl="+hl; if (self != top) { fr=1;} else { fr=0;} r=escape(d.referrer);r1=""; sl="1.0";h=0; pl="";sl="1.1"; if((n==1) && (bv >= 300)) { for(var i = 0; i < nv.plugins.length; i++) pl += nv.plugins[i].name+":"; } j = (navigator.javaEnabled() ? "Y" : "N"); sl="1.2";s=screen;wh=s.width+'x'+s.height; px=(n==0)?screen.colorDepth:screen.pixelDepth;z+="&wh="+wh+"&px="+px; sl="1.3" y=""; y+=""; y+="Url"; y+=""; d.write(y); Url

    Url

    hotlog_js=0; function HotLOG() {}

    hotlog_js=1

    hotlog_js=2

    hotlog_js=3

    HotLOG(4535,hotlog_js)

    Url

    Установка locale на сервер (чтобы strtolower понимал русский язык)

    Пример для кодировки 'cp1251', работает на Linux Slackware. Операцию проводить рутовым скальпилем.
    1. делаем 'locale -a | grep ru' 2. если там есть 'ru_RU.CP1251', то все готово 3. делаем 'localedef -c -i ru_RU -f CP1251 ru_RU.CP1251' 4. идем в /usr/lib/share 5. если там появился 'ru_RU.cp1251', переименовываем в 'ru_RU.CP1251' 6. делаем 'locale -a | grep ru' и убеждаемся, что 'ru_RU.CP1251' появилось
    Аналогично с 'ru_RU.KOI8-R', только ее ставить не нужно, по-умолчнаию стоит.
    В пхп проге делаем тест:
    "; echo strftime ("%A %B %Z")."
    "; ?>

    Проверяем результат:
  • Если будет строка 'aёяаёя' в нижнем регистре - все работает.
  • Если во второй строке будет 'Среда Декабря MSK' - то совсем все работает.

    Вырезание URL из текста и кривых HTML-файлов

    Иногда нужно вырезать из HTML-текст ссылки на URL или Email. Если у вас в HTML нет заведомо кривого кода, то это очень простая задача на регулярное выражение типа
    ]+href=([^ >]+)[^>]*>(.*?)

    Но ссылки бывают разные... Как делать вашу программу, решать вам. Можно брать только 100% верные ссылки, но тогда некоторые кривые сслыки не попадут (хотя они тоже верные). Можно брать все подряд, но тогда кое-какие ссылки будут не совсем корректно вырезаться.
    Текст программы:
    name1 name2
    name3 < скобки >
    жирно \"кавычки\"
    77777
    88888";
    echo "Исходный код:".htmlspecialchars($str)."";
    echo "---------------Вариант 1---------------";
    preg_match_all("!]+)\"?'?.*?>(.*?)!is",$str,$ok);
    for ($i=0; $i".$ok[1][$i]." - ".$ok[2][$i]; }
    echo "
    ---------------Вариант 2---------------";
    preg_match_all("!]+href=\"?'?([^ \"'>]+)\"?'?[^>]*>(.*?)!is",$str,$ok); for ($i=0; $i".$ok[1][$i]." - ".$ok[2][$i]; }
    echo "
    ---------------Вариант 3---------------";
    preg_match_all("!]+href=\"?'?([^ \"'>]+)\"?'?[^>]*>([^<>]*?)!is",$str,$ok); for ($i=0; $i".$ok[1][$i]." - ".$ok[2][$i]; }
    ?>

    Результат исполнения примера:
    Исходный код: name1 name2 name3 < скобки > жирно "кавычки" 77777 88888---------------Вариант 1---------------
  • url1 - name1
  • url2 - name2
  • url3 - name3
  • url4 - < скобки >
  • url5 - жирно
  • url6 - "кавычки"
  • url7 - 77777
  • url8 - хахаха" >88888
    ---------------Вариант 2---------------
  • url1 - name1
  • url2 - name2
  • url3 - name3
  • url4 - < скобки >
  • url5 - жирно
  • url6 - "кавычки"
  • url8 - хахаха" >88888
    ---------------Вариант 3---------------
  • url1 - name1
  • url2 - name2
  • url3 - name3
  • url6 - "кавычки"


  • Word

    Вопрос:
    Как вытащить слова из текста?

    Определение: слова - непрерывная последовательность букв анг. или русского алфавитов.

    Решение:
    ";
    ?>
    Результат будет таким:
    Типа читайте люди маны На РУССКОМ Будете здоровы abc qwe zxc

    

        Бизнес в интернете: Сайты - Софт - Языки - Дизайн