Этом пример наглядно демонстрирует, почему
Пример 20
<?if($a==5 && $b!=0)> <b>Normal html text</b> <?endif>
Этом пример наглядно демонстрирует, почему иногда желательнее использовать ключевое слово endif вместо закрывающей фигурной скобки. Это намного более читаемо чем следующий фрагмент:
и они будут делать одно
Пример 21
<?if($a==5 && $b!=0) {> <b>Normal html text</b> <? } >
Обе версии верны, и они будут делать одно и тоже.
Эта функция теперь может быть
Пример 22
<? Function Test ( echo "This is a test\n"; ); >
Эта функция теперь может быть вызвана из любого места в программе, после ее определения. Типичный вызов может быть:
Определяемые пользователем функции действуют подобно
Пример 23
<? Test(); >
Определяемые пользователем функции действуют подобно внутренним функциям PHP, Вы можете передавать им аргументы получать возвращаемое значение. Ниже приводится синтаксис для определения функции, с 3-мя аргументами и, возвращает их сумму:
Оператор return используется для возврата
Пример 24
<? Function Sum $a,$b,$c ( return($a+$b+$c); ); echo Sum($a,$b,$c); >
Оператор return используется для возврата значения из функции. Только одиночное значение может быть передано, используя этот механизм, однако, если должно передаваться большее количество значений между функцией и основным кодом, то для этой цели могут быть использованы глобальные переменные. Это приводит нас к разделу по области видимости переменных.
Эта программа ничего не выведет,
Пример 25
$a=1; /* глобальная переменная */ Function Test ( echo $a;/* ссылка на локальную переменную */ ); Test();
Эта программа ничего не выведет, так как оператор echo работает с локальной версией переменной $a , и ей не было присвоено значение внутри этой области видимости. Вы можете обратить внимание, что это немного отличается от языка C, где глобальные переменные автоматически доступны функциям, если только специально не отменяются локальным определением. Это может вызвать некоторые проблемы, в случае когда люди могут неосторожно изменять глобальную переменную. В PHP/FI глобальная переменная должна быть объявлена глобальной внутри функции, если предполагается что она будет использоваться в этой функции. Пример:
к любой из них будут
Пример 26
$a=1; $b=2; Function Sum $first,$second ( global $a,$b; $b = $a + $b; ); Sum(); echo $b;
Эта прграмма выведет "3". После объявления $a и $b глобальными внутри функции, все ссылки к любой из них будут относится к их глобальной версии. Нет никакого ограничения на число глобальных переменных, которые могут использоваться функцией. Однако, переменная должна существовать в глобальной области видимости до вызова функции. Нельзя создать новые глобальные переменные изнутри функции.
Другая важная особенность областии видимости переменных это статические переменные. Статическая переменная существует только в локальной области видимости, но при этом не теряет своего значения, когда выполнение программы оставляет эту область. Рассмотрите следующий пример:
Эта функция совершенно бесполезна, так
Пример 27
Function Test ( $a=0; echo $a; $a++; );
Эта функция совершенно бесполезна, так как, каждый раз при вызове, она устанавливает $a в 0 и печатает "0". Оператор $a++, который увеличивает переменную, не дает никакого результата, так как, как только проиходит выход из функции переменная $a исчезает. Чтобы сделать полезную функцию подсчета, которая не будет терять значения текущего счетчика, переменная $a объявляется статической:
каждый раз при вызове функции
Пример 28
Function Test ( static $a=0; echo $a; $a++; );
Теперь, каждый раз при вызове функции Test(), она будет печатать значение $a и затем увеличивать его.
Без статических переменных не обойтись и в том случае, когда функция вызывается рекурсивно. Рекурсивная функция это функция, вызывающая саму себя. При написании рекурсивных функций требуется проявлять осторожность, так как возможна ситуация когда функция будет вызывать саму себя постоянно. Нужно удостовериться, что есть адекватный способ завершения рекурсии. Следующая простая функция рекурсивно считает до 10:
Function Test
Пример 29
Function Test ( static $count=0; $count++; echo $count; if($count < 10 { Test(); } );
и порядок операций, так что
Пример 30
<? $a = 2 + 1 > Сложение <? $a = 2 - 1 > Bычитание <? $a = 2 * 1 > Умножение <? $a = 2 / 1 > Деление <? $a = 2 % 1 > Деление по модулю
Поддерживаются и скобки и порядок операций, так что следующая запись верна:
подобные операторы увеличения
Пример 31
<?$a = (2"+1")*3+6/3>
Поддерживаются C- подобные операторы увеличения += и уменьшения -= . То есть.
Пример ? $a += $b
Пример 32
<? $a += $b>
Это эквивалентно:
подобные поразрядные операторы
Пример 33
<? $a = $a + $b>
Поддерживаются C- подобные поразрядные операторы =& и |=. То есть.
Пример ? $a &== 4
Пример 34
<? $a &== 4>
Это эквивалентно:
Пример $a = $a & 4
Пример 35
<? $a = $a & 4>
Вышеупомянутый пример показывает использование цикла
Пример 36
<? $a=0; while($a <100) { $a++; echo $list[$a]; } >
Вышеупомянутый пример показывает использование цикла while, чтобы отобразить содержимое массива. ПРЕДУПРЕЖДЕНИЕ, хотя язык PHP поддерживает операторы типа ++ и -- для увеличения или уменьшения переменной, они не обрабатываются точно так же как в языке C . В PHP нет концепции пре- и пост- инкрементирования как это есть в С. Как объяснянолось в разделе Конструкции Языка, выше, тоже может быть получено и с циклом while(); endwhile;.
PHP поддерживает switch конструкцию очень
Пример 37
PHP поддерживает switch конструкцию очень похожую на эквивалентную в C.
<? $a=0; switch($a) { case 1; echo "a is 1"; break; case "hello"; echo "a is hello"; break; default; echo "a is unknown"; break; } >
Выше - пример конструкции switch. Она подобна последовательности конструкций if/elseif/else, но более легко читаема. Единственое различие между конструкцией switch PHP и подобным ему в C - это, что в конце каждой строки используется точка с запятой. Нет никаких двоеточий.Как объяснялось в раздел Конструкции Языка, выше, тот же самое может быть получено с switch(); endswitch;.
Все эти конструкции могут быть конечно же вложены и использоваться друг внутри друга, точно так же как в C. Различные файлы в каталоге примеров дистрибуции PHP обеспечат хорошую отправную точку для изучения языка.
в начале нашей второй страницы,
Пример 38
<?SecureVar("data")>
Где-нибудь в начале нашей второй страницы, то прием с методом GET не cработает. Переменная "data", появилась бы пустой, если бы не была получена непосредственно из формы методом POST на первой странице.
SecureVar() фактически принимает в качестве аргумента регулярное выражение, так что можно задавать образцы имен переменных, которые должны обработываться этим безопасным способом. Например,
Отметит любую переменную со словом
Пример 39
<?SecureVar(".*data.*")> Отметит любую переменную со словом "data" где-нибудь в имени, как являющуюся безопасной.
Пожалуйста обратите внимание, что формам метода POST не свойственно
безопасность. Люди могут подражать передаче любых данных методом POST просто
выполнив команду telnet на HTTP порт вашей системы. Вы должны принять
соответствующие меры защиты, чтобы такую возможность, если есть
заинтересованность фактической защите.
что произойдет, если Вы сделаете
Пример 40
$a = 1; Тип будет integer $b = 1.5; Тип будет double $c = "1"; Тип будет string
Теперь, что произойдет, если Вы сделаете что-нибудь вроде:
Синтаксический анализатор рассматривает первую часть
Пример 41
$d = $a + $c;
Синтаксический анализатор рассматривает первую часть арифметического выражения и использует его для результата а также характер действия, которое должно быть выполнено. В вышеупомянутом прмере, так как $a - integer, $d будет тоже integer, и выполнение целочисленного сложения , даст результат:
$d = 2 Тип integer
Пример 42
$d = 2 Тип integer
Следовательно:
Пример $d = $c + $a
Пример 43
$d = $c + $a
Результаты в:
Вышесказанное имеет смысл для меня,
Пример 44
$d = "11" Тип - string
Вышесказанное имеет смысл для меня, и как только Вы поймете это, это будет возможно осуществимо и для вас. Однако, когда используются более сложные выражения, это может привести к чрезвычайной путанице.
Решение состоит в механизм простого приведения типа .
Фактически все переменные автоматически преобразовываются во все 3 типа, и только внутренний флажок отмечает, какого типа переменная, фактически. Так, когда я говорю:
в таблице идентификаторов
Пример 45
$a = 1;
Внутри в таблице идентификаторов я сохраняю 3 версии.
может перемещать флажок, указывающий тип
Пример 46
Integer: 1 <--- flag Double: 1.0 String: "1"
Функция SetType() может перемещать флажок, указывающий тип переменной.
Также существуют функции для того,
Пример 47
SetType($a,"double");
Это вынудит рассматривать $a, как double в дальнейшем.
Функция GetType() возвращает тип.
GetType($a) вернет, в этом случае, "double" .
Также существуют функции для того, чтобы возвратить 3 различных типа без перемещения флажка типа.
Перегруженный оператор не изменяет характер
Пример 48
IntVal($a) вернет 1 DoubleVal($a) вернет 1.0 StrVal($a) вернет "1"
Перегруженный оператор не изменяет характер переменных PHP, но дает Вам некоторые инструментальные средства, для лучшей работы с ними. PHP - не нечто, что напоминало бы не вполне развитый Perl. PHP должен быть малым и быстрым. Perl имеет дело ловушкой перегруженных операторов, заставляя оператор вроде '+' работать только с числами. Если Вы суммировать строки, нужно использовать оператор '.'. Как только появляются отдельные операторы для каждого типа, это делает язык намного более сложным. То есть. Вы не можете использовать '==' для строк, Вам придется использовать 'eq'. Я не вижу смысла, особенно для чего-то вроде PHP, где большинство скриптов будут довольно простыми и в большинстве случаев, написанными непрограммистами, которые хотят язык с базовым логичным синтаксисом, который не требует больших навыков.
Реальное сообщение об ошибке, которое
Пример 49
$err_code = @dbmopen($filename,"w");
Реальное сообщение об ошибке, которое должно было бы быть выведено, может быть проверено во внутренней переменной PHP, $phperrmsg.
Более общий подход, для подаления вывода сообщений об ошибках - это использование функции SetErrorReporting(). С помощью этой функции вывод сообщений об ошибках может быть заблокирован для всех блоков программы, помещением вызова типа:
Это выключает все сообщения об
Пример 50
SetErrorReporting(0);
Это выключает все сообщения об ошибках. Им можно затем разрешить снова с помощью вызова:
Пример SetErrorReporting(1);
Пример 51
SetErrorReporting(1);
Проблемы защиты
Проблемы защиты
PHP/FI не читает никакие .htaccess файлы, которые могут присутствовать в каталоге. Это означает что если у вас есть файлы, которые защищены с использованием стандартного, основанного на особенности сервера .htaccess контроля доступа, потенциально хакеры могут обойти эту защиту, загружая страницу через PHP/FI.
Имеется пара различных решений для этой проблемы. Самое простое - использовать особенность PATTERN_RESTRICT, находящуюся в php.h. Это позволяет вам определить расширение (или шаблон расширений) файлов, которые можно передавать для анализа PHP/FI. Если у файла другое расширение и кто-либо пытается загружать через PHP/FI, появится сообщение: в доступе отказано.
Другое решение состоит в том, чтобы использовать механизм управления доступом PHP/FI, чтобы подражать установке контроля доступа, который определен в вашем .htaccess файле. Хранение этой информации в двух местах может быть утомительно, хотя и две эти системы не разделяют все те же самые особенности.
Проблема может также быть решена использованием установки прав доступа к файлу. PHP/FI может быть установлен, чтобы выполнить setuid как любой пользователь, которого Вы пожелаете. Затем файлам, которые должны читаться PHP/FI, могут быть установлены соответствующие биты доступа. Для файлов, которые не должны читаться PHP/FI, должны быть установлены владелец с другим идентификатором пользователя и соответственно измененные права доступа.
Регистрация Доступа
Регистрация Доступа
Регистрация Доступа - другая опциональная особенность, которую можно разрешить во время компиляции, отвечая "Yes" на вопрос в скрипте установки. Данные регистрации доступа могут быть сохранены в dbm файле или в базе данных mSQL. Последний более мощен, но он также немного более труден в установке.
Чтобы использовать dbm файлы для сохранения данных о регистрации доступа, нужно определить каталог, в котором могут быть записаны файлы с данными о регистрации. PHP попытается создать этот каталог, если он не существует, но для того чтобы быть уверенным, что каталог имеет соответствующие права на доступ, вам воможно захочется создать этот каталог самостоятельно перед первым запуском PHP. Права доступа к каталогу должны быть такими, чтобы пользователь с идентификатором, под которым выполняется программа cgi PHP , имел право на запись.
Для использования базы данных mSQL для регистрирации доступа, нужно сначала удостовериться, что в системе установлен mSQL и он выполняется. Затем необходимо создать базу данных. Заданное по умолчанию имя - "phpfi", хотя оно может быть изменено в src/php.h. Для создания базы данных, введите:
Регулярные Выражения
Регулярные Выражения
Регулярные выражения используются для сложного манипулирования строками в PHP/FI. Поддержка интерфейса между скриптом и регулярными выражениями осуществляется через следующие функции: Reg_Match(), Reg_Replace(), и Reg_Search(). Первым аргументом для всех трех функций - это строка, задающая регулярное выражение. Этот строка состоит из регулярных и специальных символов. Регулярные символы имеют то же значение что и при в других командах Unix, в то время как специальные символы имеют специальное значение. Далее следуюет - полный список специальных символов и их значения как это воспринимает синтаксический анализатор PHP/FI:
`.'
Является специальным символом, который соответствует любому символу, за исключением символа новой строки. Используя конкатенацию, мы можем задавать регулярные выражения подобно 'a.b', которое соответствует любой трех-символьной строке, которая начинается с 'a' и заканчивается 'b'.
`*'
Сам по себе это не конструкция; это - суффикс, который означает, что предшествующее регулярное выражение, может быть повторено сколь угодно много раз. В строке "fo*", символ "*" применяется к символу "o', так "fo*" задает "f" с последующим любым количеством символов "o".
В случае нулевого количества символов "o" строка "fo*" будет также соответствовать "f".
Символ "*" Всегда применяет к *наименьшему* возможному предшествующему выражению. Таким образом, "fo*" задает повторение "o", а не повторение "fo".
Процесс сравненияr обрабатывает конструкцию "*", пытаясь согласовать настолько много повторений насколько много их их может быть найдено. Затем он продолжает обработку остальной части шаблона. Если, впоследствии, появится несоответсвтие с шаблогам, происходит возврат, путем отбрасывания некоторых повторений "*", в случае, если это делает возможным совпадение остальной части шаблона. Например, шаблон "c[ad]*ar" для строки "caddaar", "[ad]*" сначала совпадает с "addaa", но это не позволяет совпасть следующему символу "a" в шаблоне. Так последнее совпадение "[ad]" отменяутся, и следующий символ "a" пробуется вновь. Теперь шаблон сооветствует.
`+'
"+" Подобен "*" за исключением того, что требуется по крайней мере одно соответствие для предшествующего образца. Таким образом, "c[ad]+r" не совпадает с "cr", но совпадет с чем либо еще что может быть задано шаблоном "c[ad]*r".
`?'
"?" Подобен "*" за исключением того, что позволяет задать нуль или более соответствий для заданного шаблона. Таким образом, шаблон "c[ad]?r" будет задавать строки "cr" или "car" или "cdr", и ничего больше.
`[ ... ]'
"[" начинает "множество символов", которое завершается символом "]". В самом простом случае, символы между этими двумя скобками формируют множество. Таким образом, "[ad]" задает символы "a" или "d", и "[ad]*" задает любоую п оследовательность символов "a" и "d" (включая и пустую строку), из чего следует, что шаблон "c[ad]*r" задает "car", и т.д.
Диапазон символов также может быть включен в множество символов, с помощью символа "-", помещенного между двумя другими. Таким образом, шаблон "[a-z]" задает любой символ нижнего регистра. Диапазоны могут свободно перемежаться с одиночными символами, как в шаблоне "[a-z$%.]", который задает любой символ нижнего регистра или символы "$", "%" или точку.
Обратите внимание, что символы, обычно являющиеся специальными, внутри множества символов больше не являются таковыми. Внутри множества символов существует полностью отличный набор специальных символов : "]", "-" и "^".
Для того чтобы включить "]" в множество символов, нужно сделать его первым символом. Например, шаблон "[]a]" задает символ "]" или "a". Чтобы включить символ "-", нужно использовать его в таком контексте, где он не может указывать диапазон: то есть или первым символом, или сразу после диапазона.
`[^ ... ]'
"[^" начинает "исключающее множество символов", который задает любой символ за исключением заданных. Таким образом, шаблон "[^a-z0-9A-Z]" задает любой символ *за исключением* букв и цифр.
"^" не является специальным символом в множестве, если только это не первый символ. Символ следующий после "^" обрабатывается так, как будто он является первым (это может быть "-" или "]").
`^'
Является специальным символом, который задает пустую строку - но только в случае если он стоит в начале строки шаблона. Иначе шаблон не будет соответствовать. Таким образом, шаблон "^foo" задает "foo" в начале строки.
`$'
Подобен "^", но только задает конец строки. Так шаблон, "xx*$" задает строку с одним или более символом "x" в конце строки.
`\'
Имеет два значения: экранирует вышеперечисленные специальные символы (включая "\"), и задает дополнительные специальные конструкции.
Так как "\" экранирует специальные символы, "\$" является регулярным выражением, задающим только символ "$", а "\[" является регулярным выражением, задающим только "[", и так далее.
В основном, "\" с последующим любым символом соответствует только этому символу. Однако, есть некоторые исключения: символы, который, когда "\" предшествует специальная конструкция. Такие символы обычно всегда задают их собственное значение.
Никакие новые специальные символы не определены. Все расширения к синтаксису регулярных выражений сделаны, определением новые двух-символьных конструкций, которые начинаются с "\".
`\|'
Задает альтернативу. Два регулярных выражения A и B с "\|" между ними формируют выражение, которое задает что-либо чему соответствует или А или B.
Так выражение, "foo\|bar" или "foo" или "bar", но никакую другую строку.
"\|" применяется к максимально большим окружающим выражениям. Только "\(...\)" вокруг выражений могут ограничивать мощность "\|".
Существует полная возможность перебора с возвратами , когда задано множество "\|".
`\( ... \)'
является конструкцией группирования , которая служит трем целям: 1. Заключать в себя множество "\|" альтернатив для других операций. Так, шаблон "\(foo\|bar\)x" соответствует или "foox" или "barx".
2. Включать сложное выражение для постфиксного "*". Так шаблон "ba\(na\)*" задает "bananana", и т.д., с любым (ноль или болеее ) количеством "na".
3. Отметить искомую подстроку для последующего обращения.
Эта последняя функция - не следствие идеи относительно группировки выражений скобками; это - отдельная особенность, которая задает второе значение для той-же самой конструкции "\(...\)" , так как нет практически никакого конфликта между этими двумя значениями. Вот объяснение этой особенности:
`\DIGIT'
После окончания конструкции "\(...\)" , анализатор запоминает начало и конец текста, совпавшего с этой конструкцией. Затем, позднее в регулярном выражении можно использовать "\" с поледующей цифрой (DIGIT), что означает "задать тот же самый текст, который соответствовует DIGIT нахождению в конструкции '\(...\)'". "\(...\)" конструкции пронумерованы в порядке возрастания в регулярном выражении.
Строкам задающим первые девять конструкций "\(...\)" , появляющимся в регулярном выражении - соответствуют числа от 1 до 9. "\1" до "\9" может быть использовано для обращения к тексту, соответствующей "\(...\)" конструкции. Эти 9 сохраненных конструкций известны также как регистры.
Например, шаблон "\(.*\)\1" задает любую строку, который состоит из двух идентичных частей. "\(.*\)" задает первую часть, которая может быть всем чем угодно, но последующая "\1" задает точно тот же тексту.
Сохраненные конструкции или регистры могут использоваться внутри одиночных выражений, или, они могут быть извлечены и использоваться где-либо еще. Добавление третьего параметра к reg_match() или reg_search() определит массив, в который будут записаны 9 регистров. При этом записывается дополнительный регистр (нулевой элемент) в котором задана строка совпавшая со всем выражением. Например:
SELECT MULTIPLE и PHP
SELECT MULTIPLE и PHP
Тэг SELECT MULTIPLE в конструкции HTML позволяет пользователям сделать множественный выбор из списка. Выбранные объекты впоследствии передаются обработчику формы. Проблема состоит в том, что все они будут переданы с одним и тем же именем объекта. То есть.
Определение грамматики вашей Функции
Шаг 1 - Определение грамматики вашей Функции
если ваша функция принимает от 0 до 6 аргументов, то доступны - предопределенные грамматики. Вы можете пропустить этот шаг.
Грамматика вашей функции определяется в файле parse.raw. Первым делом нужно
добавить лексему. Лексема - ключевое слово, из букв верхнего регистра,
которое обычно совпадает с именем вашей функции. Все лексемы определены
вначале файла parse.raw. Порядок не имеет значения. Затем нужно сформировать
фактическое правило грамматики YACC. Рассмотрите существующие правила, и
найдите функцию, которая похожа на добавляемую. Имейте в виду, что
большинство нормальных функции - стандартные функции, которые считывают
параметры из стека выражений. Ваша функция скорее всего будет отнесена к
этой группе, в этом случае вам не нужно будет трогать файл parse.raw.
Добавление вашей функции к хэш-таблице лексического анализатора
Шаг 2 - Добавление вашей функции к хэш-таблице лексического анализатора
чтобы сделать это, подредактируйте lex.c, и найдите хэш-таблицу вблизи верхней части файла. Найдите строку, static cmd_table_t cmd_table[22][30] = {, которая определяет начало хэш-таблицы. [22] [30] определяет размер 2 мерного массива, который содержит хэш-таблицу. 22 это на единицу большая максимальная длина имени функции, и 30 относится к максимальному числу функций в любом хэш списке. Если Вы превышаете любое из этих ограничений, просто увеличьте их прямо здесь.
Эта хэш-таблица завоевала бы в соревнованиях абсолютное звание самой простой хэш-таблицы во всем мире. Хэш значение - это длина строки имени функции, которую нужно хэшировать. Так для нашего примера Time(), нужно добавить вход для значения хэша 4 . Таким образом мы добавляем следующую строку к хэш-списку для 4:
Войдите в каталог src...
в каталог cgi-bin вашей системы. Если у вас нет прав сделать это и вы желаете установить пакет в ваш собственный персональный каталог, вы можете сделать это, но в таком случае нужно установить setuid бит для выполняемой программы командой: chmod u+s /path/php.cgi
Если Вы не установите setuid бит для выполняемого файла, то любые файлы, созданные программой будут принадлежать пользователю с идентификатором, под которым выполняется web сервер. Если это приемлемо, то вы можете спокойно оставить setuid бит.
Написание вашей реалбной функции
Шаг 3 - Написание вашей реалбной функции
Вы можете фактически писать вашу функцию на любом языке, который вам
нравится, лишь бы только он поддерживал соглашение о вызовах для нормальных
функций C, и у вас есть выбор создать ли ее объектным файлом или
библиотечным файлом, совместимым с компоновщиком на вашей системе. Вообще,
мы будем предполагать, что функцию написана на C. Все функции, идущие с
PHP/FI, были написаны на C. Функция Time() или UnixTime(), как она
вызывается внутри PHP, может быть найдена в файле date.c и выглядит:
Добавление прототипа вашей функции в php.h
Шаг 4 - Добавление прототипа вашей функции в php.h
В нижней половине файла php.h Вы найдете полный список прототипов всех функций в php. Они сгруппированы по файлам, в которых они появляются. Просто добавьте ваш прототип к соответствующему месту в этом файле. В нашего примера Time() будет добавлена следующая строка:
Если Вы устанавливаете...
Шаг 4. (Если Вы устанавливаете программу в виде модуля Apache)
Перейдите в каталог src Apache, в который должны быть
скопированы файлы mod_php.c и mod_php.h. Если они еще не были
скопированы, что может произойти из-за проблем с правами
доступа, скопируйте эти два файла вручную. Подредактируйте ваш
файл Конфигурации Apache (Configuration), и добавьте в строку
EXTRA_LIBS libphp.a, которая была создана в конце Шага 3
. А
также добавьте строку:
Module php_module mod_php.o
в самом конце файла. Затем введите: ./Configure и затем make , чтобы перекомпилировать ваш файл httpd Apache. Инсталлируйте этот файл.
Затем Вам нужно подредактировать ваш Apache conf/srm.conf файл и добавить строку :
AddType application/x-httpd-php .phtml
Это определяет новый MIME тип, application/x-httpd-php, который будет вызывать модуль PHP, для обработки любого файла с расширением .phtml. Вы можете выбрать любое расширение, которое вам по душе.
Можно сделать так, чтобы не все могли выполнять PHP файлы. Для этого вы можете поместить вышеупомянутую AddType строку внутри <Location/path > .... < /Location > директивы в access.conf файле, чтобы только в определенных директориях вашего сервера PHP мог обрабатывать документы.
Теперь Вы готовы перезапустить ваш httpd сервер. Для более подробной информации см. примечания по конфигурированию модуля Apache.
Тестирование программного обеспечения
После установки вы можете протестировать, работает ли ваша программа, введя URL, подобный следующему в вашем броузере:
http://your.site.domain/cgi-bin/php.cgi
При этом должна показаться страница, которая содержит номер версии наряду с другой полезной информацией.
Чтобы проверить работу модуля Apache, создайте любой файл с .phtml расширением, поместите в него тэг подобно: <?phpinfo () > и посмотрите будет ли он анализироваться.
Использование программного обеспечения Чтобы фактически использовать программное обеспечение на существующем HTML файле, Вы можете просто добавить путь к вашему файлу вышеупомянутому URL. То есть.
http://your.site.domain/cgi-bin/php.cgi/path/file.html
Вам нужно взглянуть на раздел Переадресация CGI этой документации. При выполнении PHP/FI с переадресацией вы можете автоматически задавать чтобы URL подобно http:/your.site.domain/file.phtml мог анализироваться PHP/FI.
Это не относится к пользователям программы, выполненной в виде модуля Apache.
Компилирование
Шаг 5 - Компилирование
Вы должны помнить о том что нужно переделывать синтаксический анализатор
всякий раз, когда измененяется файл parse.raw. Введите: make parser, чтобы
сделать это. Затем сделайте нормальную компиляцию, введя: make, если только
это выполнено.
Вышлите мне ваши добавления!
Шаг 6 - Вышлите мне ваши добавления!
Если Вы хотите, чтобы ваши функции, были добавленны к следующему выпуску
PHP/FI, пошлите их мне. Возможно самый лучший способ это сделать - это с
помощью контекстно-зависимого diff. Чтобы сделать это, вам нужна будет копия
немодифицированной дистрибуции. Просто сделайте, diff -c, для файлов,
которые были изменены, сравнивая их с первоначальными файлми. Пожалуйста не
высылайте мне изменения в файле parse.c, так как тот файл генерируется
автоматически. Вместо этого высылайте мне различия в файле parse.raw.
Time() - это пример, иллюстрирующий шаги, при добавлении функции. Возможно, что функция, которую Вы захотите добавить будет немного более сложной чем этот пример. Возможно вы захотите передавать параметры вашей функции и манипулировать этими параметрами каким-либо способом. Возможно вы даже захотите чтобы она вызывалась различными способами. Эти понятия будут проиллюстрированы PHP/FI функцией Crypt(). См. также раздел, озаглавленный Замечания по хаканию Кода для несколько большего числа технических деталей относительно написания кода для PHP/FI.
Грамматика Crypt() в parse.raw:
%token CRYPT . . . | CRYPT '(' expr ',' expr ')' { if(GetCurrentState(NULL) || inCase || inElseIf) Crypt(1); } | CRYPT '(' expr ')' { if(GetCurrentState(NULL) || inCase || inElseIf) Crypt(0); }
Здесь показано, как определить грамматику, которая позволяет, вызывать функцию с 1 или 2 параметрами. Вы можете написать различные функции, чтобы обрабатывать оба случая, или просто посылать параметр режима, как выполнено здесь, для указания режима, в котором функция вызвана. Обратите внимание, что в этом случае нельзя использовать одну из предопределенных INTFUNC грамматик, так как ваша функция может принимать переменное число параметров.
Другой иллюстрируемый аспект - как фактически представить параметры функции . В большинстве случаев Вы захотите использовать идентификатор expr. Этот идентификатор означает, что параметр - выражение. Выражение может быть литеральное значение, обращение к функции или комбинация многих выражений. См. parse.raw для полного определения грамматики yacc для выражений для большего количества деталей.
Запись Хэш-Таблицы в lex.c:
и Установки Шаг 1.
Шаги Установки Шаг 1.
Выполните программу установки: ./install
Вам будет задан ряд вопросов. Если Вы их не понимаете, то
просто нажимайте "Return". Заданный по умолчанию
набор должен удовлетворять требования для большинства систем.
Это однако не имеет отношения к вопросам, определяющим каталог
для ваших конфигурационных и лог файлов. Выберите любой
каталог, к которому httpd (обычно пользователь
"nobody") имеет доступ по записи. Вы можете создать
этот каталог вручную где-нибудь и просто сменить владельца с
помощью команды
могут быть сгруппированы внутри одной
Синтаксис
Каждая команда PHP начинается с тэга <? и заканчивается
>. Или команды
могут быть сгруппированы внутри одной пары <? > и
отделяться друг от
друга символом ; .
Поддерживаются переменные, имена переменных начинаются с символа $. Так например, чтобы присвоить значение 5 переменной a и затем отобразить ее, можно написать следующий фрагмент:
Скрипт язык PHP/FI
Скрипт язык PHP/FI
Скрипт язык PHP подобен по синтаксису языку C по многим показателям. Он поддерживает переменные, массивы, обращения к функциям, различные типы переменных и множество других вещей, которые вам могут потребоваться для написания сложных cgi программ.
В последующих разделах описана каждая функция PHP/FI и они могут быть быстро
найдены простым добавлением #function_name к url этого документа, так как
каждое функциональное описание снабжено тэгом имени.
Ссылки на переменные
Ссылки на переменные
Иногда удобно иметь способ ссылаться на имена переменных . То есть имя переменной может установливаться и использоваться динамически. Нормальной переменной присваивается значение оператором типа:
Установление подлинности HTTP
Установление подлинности HTTP
Ловушки HTTP аутентикации в PHP/FI доступны только в случае, если пакет выполняется как модуль Apache. В программе для PHP/FI в виде модуля Apache , возможно использование команда Header() , чтобы послать сообщение "Authentication Required" к броузеру пользователя, которое приведет к появлению окна ввода с запросом Пользователь/Пароль (Username/Password). Как только пользователь ввел свое имя и пароль, URL, содержащий PHP/FI скрипт будет вызыван снова с переменными, $PHP_AUTH_USER, $PHP_AUTH_PW и $PHP_AUTH_TYPE установленными соответственно имени пользователя, его паролю и типу аутентикации. Только На текущий момент поддерживается только "Базовая"("Basic") аутентикация.
Фрагмент примерa скрипта , который запросит аутентикацию пользователя при обращении к странице:
Внутренние функции
Внутренние функции
PHP имеет целый ряд встроенных функций. Функции точно также как и в языке C. Некоторые из них имеют один или более аргументов, некоторые возвращают значения, которые затем могут быть присвоены переменной или использоваться как аргумент для другой функции. Например: