Сделай Сам Свою Работу на 5

Узнаём, о чём сообщает PHP





 

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

В PHP контроль вывода сообщений транслятора определяется функцией error_reporting и значением директивы error_reporting в php.ini. Рекомендуемое её значение E_ALL - т.е. выводить сообщения о всех потенциально опасных ситуациях. К ним в PHP относятся, например, использование неинициализированной переменной, обращение к несуществующему элементу массива и т.д.

Для включения максимально подробного вывода сообщений транслятора поставьте в начале программы вызов функции error_reporting:

 

// Для PHP4

error_reporting(E_ALL);

 

или поставьте значение error_reporting = E_ALL в php.ini.

 

С более подробном описании возможных уровней reporting можно знакомится в PHP документации - Error Handling and Logging Functions.

Для PHP5 введен уровень E_STRICT, который включает вывод сообщений о использовании в коде устаревших методов программирования (например, используется var для описания внутренних переменных класса). Он не входит в E_ALL, поэтому для PHP5 рекомендуемый уровень сообщений E_ALL | E_STRICT (т.е. E_ALL и E_STRICT). Соответственно, для задания вывода всех сообщений от транслятора надо вызвать error_reporting с таким параметром:



 

// Для PHP5

error_reporting(E_ALL | E_STRICT);

 

Если вы установили вывод ошибок и ошибки по не выводятся, то возможно вывод ошибок в script output отключен. Проверьте значение опции ini файла display_errors (она включает вывод ошибок непосрественно в script output) и, если она выключена, включите её.

 

// проверяет значение опции display_errors

if (ini_get('display_errors') != 1) {

// включает вывод ошибок вместе с результатом работы скрипта

ini_set('display_errors', 1);

}

 

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



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

 

Пишем устойчивый код

 

· Сравниваем константу с переменной, а не наоборот. Сколько раз Вам приходилось выяснять, что ошибка в программе связанна с использованием оператора "=" вместо "=="? Что бы приходилось реже, используйте сравнения вида

 

if (10 == $i) {

// что-то делаем

}

 

В случае использования "=" вместо "==" транслятор выдаст ошибку "Parse error: parse error in ... on line ...". Таким образом ошибка обнаруживается значительно быстрее.

 

· Не используем значение дважды. Конечно, это преувеличение. Но если в программе возникает необходимость использовать значение несколько раз, можно порекомендовать объявить константу и использовать её вместо значения. Для PHP4 существует единственный способ объявить константу - использовать функцию define.

 

define ('BEFORE_RENDER', 'beforeRender');

 

Константы в классах объявлять нельзя. Расширение PHP 5 для определения констант сходно с тем, которое было осуществлено при расширении от C до C++ – используется ключевое слово const. Но константы таким образом можно создавать только внутри классов.

 

class ControlEvents {

const BEFORE_RENDER = 'beforeRender';

}

print ControlEvents::BEFORE_RENDER;

 

Но для обращения к такой константе необходимо знать имя класса. Константы могут быть также добавлены непосредственно в класс. Но PHP не поддерживает такой метод. Поэтому придется объявить их как обычные переменные:



 

class Control {

var $BEFORE_RENDER = 'beforeRender';

function render() {

$eventFunction = $this->BEFORE_RENDER;

$this->$eventFunction();

}

}

 

· Проверка параметров функции. В PHP параметром в функцию можно передать любую переменную. Но вот алгоритму функции может быть вовсе не все равно, что за переменную ему передали. Поэтому в начале функции полезно проверять её входные параметры на необходимый тип и диапазон значений. Для проверки типа используются следующие функции:

· gettype(Mixed $var) - возвращает тип переменной. Наиболее часто используемые типы: "boolean", "integer", "double", "string", "array", "object", "resource", "NULL".

· функции проверки на тип: is_bool(Mixed $var), is_integer(Mixed $var), is_double(Mixed $var), is_string(Mixed $var), is_array(Mixed $var), is_object(Mixed $var), is_resource(Mixed $var) - возвращают true или false.

Для определения класса объекта используются функции:

· get_class(Object $obj) - возвращает имя класса, экземпляром которого является obj.

· is_a(Object $obj, String $class) - проверяет, является ли obj экземпляром сласса class или класса, унаследованного от class.

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

 

/**

* Функция showControl принимает один параметр $control,

* этот параметр должен являться классом и являться

* экземпляром класса HTMLControl либо классом,

* унаследованным от HTMLControl.

*/

function showControl(&$control) {

is_a($control, 'HTMLControl') or $control == null or exit('Type missmatch.');

...

}

 

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

function checkParameter(&$var, $class) {

if (!is_a($var, $class) && $var != null)

SFExit('Type missmatch.');

}

 

function SFExit(&$message) {

print $message . '<br>';

$backtrace = debug_backtrace();

for($i = 0; $i < count($backtrace); $i++) {

print $i . ': ' . $backtrace[$i]['file'] . '(' .

$backtrace[$i]['line'] . ')<br>';

}

exit();

}

 

Примечание: Функция debug_backtrace введена только в PHP 4.3.0.

Пример их применения:

 

function showControl(&$control) {

checkParameter($control, 'HTMLControl');

...

}

 

Для PHP5 некоторые проверки типов параметров можно задать непосредственно в описании функции. Предыдущий пример на PHP5 будет выглядеть следующим образом:

 

function showControl(HTMLControl $control) {

...

}

 

Asserts

 

Во время создания и отладки программы можно использовать встроенный механизм добавления проверок в код программы. Он называется asserts (или assert-проверки). Идея его состоит в том, что в код программы добавляются специальные проверочные конструкции, которые можно отключить для production сайта, но в любой момент включить при разработке.

Следующие фрагменты кода примерно аналогичны:

 

/* Использование Asserts */

assert_options (ASSERT_ACTIVE, 1);

 

function showControl(&$control) {

assert('is_a($var, \'HTMLControl\') || $var == null');

...

}

/* Использование if конструкций */

define('ASSERT_ACTIVE', 1);

function showControl(&$control) {

if (ASSERT_ACTIVE && !(is_a($var, 'HTMLControl') || $var == null'))

trigger_error('Assertion failed', E_USER_ERROR);

...

}

 

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

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

Все массивы REQUEST являются является обычными массивами, поэтому значения в них могут быть переопределены непосредственно.

Например:

 

if (isset($_GET['id']))

$_GET['id'] = (int)$_GET['id'];

else

$_GET['id'] = null;

 

Тема 16. Технология AJAX

Описание технологии

 

Ajax (от англ. Asynchronous JavaScript and XML ­– "асинхронный JavaScript и XML") — это подход к построению интерактивных пользовательских интерфейсов веб-приложений. При использовании Ajax веб-страница не перезагружается полностью в ответ на каждое действие пользователя. Вместо этого с веб-сервера догружаются только нужные пользователю данные. Ajax – один из компонентов концепции DHTML.

Об Ajax заговорили после появления 18 февраля 2005 г. статьи Джесси Джеймса Гарретта (Jesse James Garrett) «Новый подход к веб-приложениям». Ajax – это не самостоятельная технология, а идея.

Ajax базируется на двух основных принципах:

- использование DHTML для динамического изменения содержания страницы;

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

- с использованием XMLHttpRequest;

- через динамическое создание дочерних фреймов;

- через динамическое создание JavaScript с загрузкой тела script.

 

Использование этих двух принципов позволяет создавать намного более удобные веб-интерфейсы пользователя на тех страницах сайтов, где необходимо активное взаимодействие с пользователем. Использование Ajax стало наиболее популярно после того, как компания Google начала активно использовать его при создании своих сайтов, таких как Gmail, Google Maps и Google Suggest. Использование Ajax на этих сайтах подтвердило эффективность использования данного подхода.

Классическая модель веб-приложения действует следующим образом: большинство действий пользователя отправляют обратно на сервер HTTP-запрос. Сервер производит необходимую обработку – получает данные, обрабатывает числа, взаимодействует с различным ПО и затем выдаёт HTML страницу клиенту. Эта модель заимствована из первоначального применения веба как гипертекстовой среды. Сравнение подходов с применением технологии Ajax и без её применения представлено на рисунке 16.1.1

 

 

Рисунок 16.1.1 – сравнение традиционной модели веб-приложений (слева) с моделью Ajax (справа).

 

Приложение Ajax исключает взаимодействие типа старт-стоп-старт-стоп путём введения механизма Ajax как промежуточного слоя между пользователем и сервером. Может показаться, что добавляя новый уровень в приложение можно только замедлить его реакцию, но в данном случае это не так.

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

 

 

Рисунок 16.1.2 – сравнение диаграмм взаимодействия традиционного веб-приложения (сверху) и асинхронного приложения Ajax (снизу).

 

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

 

Реализация технологии

 

Рассмотрим реализацию технологии Ajax на примере демонстрации пользователю динамической подсказки при выборе имени пользователя.

 

 

Рисунок 16.2.1 – пример использования Ajax

 

При вводе символа, в поле Suggestions автоматически отображаются найденные в БД имена.

Рассмотрим текст формы:

 

<form>

First Name:

<input type="text" id="txt1" onkeyup="showHint(this.value)">

</form>

<p>Suggestions: <span id="txtHint"></span></p>

 

Это обычный HTML, в котором лишь добавлен вызов JavaScript-функции при вводе символов в текстовое поле. Рассмотрим текст функции showHint:

 

function showHint(str) { if (str.length==0) { document.getElementById("txtHint").innerHTML=""; return; } xmlHttp=GetXmlHttpObject() if (xmlHttp==null) { alert ("Browser does not support HTTP Request"); return; } var url="gethint.php?q="+str; xmlHttp.onreadystatechange=stateChanged; xmlHttp.open("GET",url,true); xmlHttp.send(null); }

 

Функция отправляет запрос на сервер и определяет функцию, которая будет вызвана при изменении состояния запроса (stateChanged):

 

function stateChanged()

{

if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")

{

document.getElementById("txtHint").innerHTML=xmlHttp.responseText;

}

}

 

Функция stateChanged вызывается браузером каждый раз, когда изменилось состояние запроса. Когда состояние запроса становится "complete" (запрос завершён и у нас есть его результаты), функция вставляет полученные от сервера данные в область txtHint.

Нам осталось только разобрать функцию GetXmlHttpObject:

 

function GetXmlHttpObject(handler)

{

var objXMLHttp=null;

if (window.XMLHttpRequest)

{

objXMLHttp=new XMLHttpRequest();

}

else if (window.ActiveXObject)

{

objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP");

}

return objXMLHttp;

}

 

Её относительная сложность обусловлна тем, что в разных браузерах объект XMLHttpRequest реализован разнвми способами. Функция это учитывает.

На стороне сервера данные возвращает вот такой код на PHP:

 

// массив имён

$a[]="Anna";

$a[]="Brittany";

$a[]="Cinderella";

$a[]="Diana";

$a[]="Eva";

$a[]="Fiona";

$a[]="Gunda";

$a[]="Hege";

$a[]="Inga";

$a[]="Johanna";

$a[]="Kitty";

$a[]="Linda";

$a[]="Nina";

$a[]="Ophelia";

$a[]="Petunia";

$a[]="Amanda";

$a[]="Raquel";

$a[]="Cindy";

$a[]="Doris";

$a[]="Eve";

$a[]="Evita";

$a[]="Sunniva";

$a[]="Tove";

$a[]="Unni";

$a[]="Violet";

$a[]="Liza";

$a[]="Elizabeth";

$a[]="Ellen";

$a[]="Wenche";

$a[]="Vicky";

 

// получаем параметр q

$q=$_GET["q"];

 

// если длина q больше нуля, ищем совпадения в массиве

if (strlen($q) > 0)

{

$hint="";

for($i=0; $i<count($a); $i++)

{

if (strtolower($q)==strtolower(substr($a[$i],0,strlen($q))))

{

if ($hint=="")

{

$hint=$a[$i];

}

else

{

$hint=$hint." , ".$a[$i];

}

}

}

}

 

// если ничего не найдено, говорим об этом пользователю

if ($hint == "")

{

$response="no suggestion";

}

else

{

$response=$hint;

}

 

// отправляем ответ браузеру

echo $response;

 

Объект XMLHttpRequest

 

Поскольку Ajax базируется на исплоьзовании этого объекта, рассмотрим его подробнее. Перечислим методы и свойства объекта:

 

XMLHTTPRequest.open("method", "URL", async, "uname", "pswd"

 

- method - тип запроса, например, GET;

- URL - URL запроса, например http://localhost/file.xml;

- async - если True, то будет использоваться асинхронный запрос, то есть выполнение скрипта продолжится после отправки запроса. В противном случае скрипт будет ожидать ответа от сервера, заморозив UI;

- uname, pswd - логин и пароль для простой веб-авторизации;

- XMLHTTPRequest.send("content") - отправляет запрос на сервер. Значением content могут быть данные для POST-запроса или пустая строка;

- XMLHTTPRequest.onreadystatechange - обработчик событий срабатывающий на каждое изменение состояния объекта. Состояния объекта могут быть следующими:

0 - до того как запрос отправлен (uninitialized)

1 - объект инициализирован (loading)

2 - получен ответ от сервера (loaded)

3 - соединение с сервером активно (interactive)

4 - объект завершил работу (complete)

- XMLHTTPRequest.responseText - возвращает полученные от сервера данные в виде строки;

- XMLHTTPRequest.responseXML - если ответ сервера пришел в виде правильного XML, возвращает XML DOM объект;

- XMLHTTPRequest.status - возвращает статус HTTP-ответа в виде числа. Например, 404 если запрашиваемая страница не была найдена на сервере.

 

 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.