Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Экзамен / web / example1 / Введение в PHP.doc
Скачиваний:
101
Добавлен:
18.05.2015
Размер:
3 Mб
Скачать

Магические методы

Функции, __construct, __destruct, __call, __callStatic, __get, __set, __isset, __unset, __sleep, __wakeup, __toString, __invoke, __set_state , __clone , имена которых начинаются с символа “_“ , являются магическими в PHP классах и имеют особую функциональность.

Методы доступа к свойствам объектов __get($name) и __set($name,$value) позволяют легко проводить динамическое назначение свойств объектам. В качестве параметров этим методам передаются имена свойств класса.

Метод __set() также получает и значение, которое устанавливается для свойства. Методы __get() и __set() вызываются только в том случае, если требуемого свойства вообще нет в классе.

<?php

class MyClass {

private $properties;

function __set($name, $value) {

echo "задание нового свойства $name = $value";

$this->properties[$name]=$value;

}

function __get($name) {

echo "чтение значения свойства ", $name;

return $this->properties[$name];

}

}

$obj = new MyClass;

$obj->property = 1; // Выводит "задание нового свойства property=1"

$a = $obj->property; // Выводит "чтение значения свойства property"

echo $a; // выводит 1;

?>

При вызове в PHP 5 несуществующего метода объекта автоматически вызывается специальный метод __call().

<?php

class MyClass {

function __call($name, $params) {

echo "Вызван метод $name с параметром $params[0]";

}

}

$obj = new MyClass;

echo $obj->method(1); // Выводит "Вызван метод method

// с параметром 1"

?>

В качестве параметров __call() принимает имя вызываемого метода и передаваемые этому методу параметры.

В PHP 5 псевдо-константа __METHOD__ возвращает имя класса и вызываемый метод.

<?php

class MyClass {

public function myMethod() {

echo "вызов метода ", __METHOD__;

}

}

$obj = new MyClass;

$obj->myMethod();//Выводит "вызов метода MyClass::myMethod"

function myFunction() {

echo "вызов функции ", __METHOD__;

}

myFunction(); // Выводит "вызов функции myFunction"

?>

При обращении к функции вне класса __METHOD__ возвращает только имя функции.

В PHP 5 введен еще один специальный метод класса - __toString().

<?php

class MyClass {

function __toString() {

return "вызван метод __toString()";

}

}

$obj = new MyClass;

echo $obj; // Выводит "вызван метод __toString()"

?>

Метод класса __toString() позволяет выполнить перегрузку преобразования объекта в строку.

Обработка ошибок

Начиная с PHP 5 введена современная схема обработки исключений. Конструкция try/catch/throw позволит весь код обработки ошибок локализовать в одном месте сценария.

<?php

try {

$fp = @fopen("file.txt", "w"); 

if (!$fp) throw new Exception("Невозможно открыть файл!");

// Запись данных в файл

fclose($fp);  }

catch (Exception $exception) {

echo "Ошибка в строке ", $exception->getLine();

echo $exception->getMessage(); // Выводит "Невозможно

// открыть файл"

}

?>

В конструкции можно использовать несколько блоков catch. Также возможно создание собственных классов исключений, производных от встроенного класса Exception.

Ошибки php и директива error_reporting

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

$f=fopen(“fff.dat”,”r”) or die(“Error”);

Стандартно рассматриваются три типа ошибок в скриптах: синтаксические, логические и ошибки времени выполнения. С помощью оператора @ можно подавить вывод сообщения о любой ошибке в выражении. Например $a=@(1/0); приведет к значению $a=false;

Уровень обработки сообщений об ошибках устанавливается как значение директивы error_reporting в файле php.ini. В PHP установлено значение по умолчанию error_reporting = E_ALL & ~E_NOTICE, что означает отображение всех ошибок и предупреждений, за исключением логических ошибок, которые имеют уровень E_NOTICE.

В PHP обрабатываются три уровня ошибок: информационные ошибки, ошибки с возможностью действия (предупреждения) и неустранимые (фатальные) ошибки.

Информационные ошибки: E_STRICT, E_NOTICE, E_USER_NOTICE – компилятор столкнулся с логической проблемой, которая может привести к ошибке выполнения.

Ошибки с возможностью действия (предупреждения) означают, что возможно придется завершить работу с выдачей сообщения. Ошибка - E_WARNING предупреждение времени выполнения связанное с возможностью выполнения функции или блока. Аналогично E_USER_WARNING генерируемое пользователем предупреждение. E_COMPILE_WARNING предупреждения времени компиляции.

Неустранимые (фатальные) ошибки возникают тогда, когда выполнение или загрузка программы невозможны. E_ERROR фатальные ошибки времени выполнения. E_PARSE ошибки разбора времени компиляции. E_COMPILE_ERROR фатальные ошибки времени компиляции. E_CORE_ERROR фатальные ошибки при начальном старте PHP.

Приведем значения нескольких констант, определяющих вывод типов ошибок и предупреждений: 1 - E_ERROR , 2 - E_WARNING, 4 - E_PARSE и т.д

Файл php.ini может быть недоступен Параметр error_reporting в этом случае может быть установлен функцией error_reporting() в скрипте. Параметр display_error=off отключает вывод сообщений об ошибках на экран. Параметр log_errors=on включает регистрацию ошибок в журнал ошибок error_log.

Любой скрипт может "упасть" при наступлении "критичных" условий. Чтобы свести такой риск к минимуму всегда нужно:

проверять результаты вызова функций: обязательно убедитесь, что возвращаемые данные находятся в интервале допустимых значений;

проверять результаты системных вызовов: Хороший пример - проверка ответа системы при вызове функции sql_connect(). Стоит проверить этот ответ и убедиться, что подключение к БД действительно имело место. Если этого не сделать, то все запросы к БД могут не состояться, а некоторые данные могут быть утеряны.

<?php

$conn = @sql_connect ($host, $user, $pass);

if (!$conn) {

die (sprintf ("Ошибка [%d]: %s", sql_errno (), sql_error ()));

}

?>

Установка уровня error_reporting в файле php.ini на E_ALL: уровень error_reporting должно быть выставлено на наивысший уровень. При другой конфигурации, многие ошибки типа "неверное регулярное выражение", "недопустимое значение" могут ускользнуть.

Файлы

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

Для того, чтобы вставить другие файлы в текущий текстовый файл PHP, может использоваться директива include filename. Строка filename содержит имя включаемого файла.

При работе с файлами в PHP используются три действия: 1) открытие файла для чтения или записи, 2) чтения или записи, 3) закрытие файла.

Открытие файла:

int fopen (string filename, string mode [, int use_include_path]). Функция осуществляет открытие локального или удаленного файла с именем, указанным в filename, и возвращает его дескриптор (номер). Режим открытия файла mode, может принимать следующие значения:

"r" - файл открывается только для чтения. "r+" - открывается на чтение и на запись. Текущий указатель файла устанавливается в его начало.

"w" - Файл открывается только для перезаписи. Указатель файла устанавливается в его начало. Всё старое содержимое файла теряется, счётчик длины файла устанавливается равным 0. Если файл с указанным именем не существует, функция пытается его создать. "w+" - Файл открывается на чтение и на запись. Указатель файла устанавливается в его начало. Всё старое содержимое файла теряется.

"a" - Файл открывается на добавление (запись). Указатель файла помещается в конец файла. Если файл с указанным именем не существует, функция пытается его создать. "a+" - Файл открывается на чтение и на запись. Вот несколько примеров открытия файлов с помощью fopen()

$fp = fopen ("/home/a/bases.dat", "r");

$fp = fopen ("/home_dir/client/count.txt", "w+");

$fp = fopen ("http://www.yahoo.com/pp.txt", "r");

В случае успешного завершения функция fopen() возвращает "ссылку" на открытый файл, а в случае ошибки эта функция возвращает булевское значение false.

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

URL, содержащие недопустимые символы (например, пробельные символы в имени файла), необходимо кодировать перед их использованием с помощью функции urlencode (). Функция urlencode () принимает единственный параметр (URL, подлежащий кодированию) и возвращает закодированный URL. Использование функции fореn()

<?php

/* Открыть файл для чтения */

$fr = fopen("myfile.txt", 'r');

/* Открыть бинарный файл для чтения/добавления */

$fr = fopen("myfile.dat", 'ba+');

/* Открыть файл для чтения/записи (искать файл в пути,

заданном директивой include_path)*/

$fr = fopen("code.php", 'w+', true);

/* Открыть файл index.php, для чтения по протоколу HTTP */

$fr = fopen("http://www.php.net/index.php", 'r');

/* Открыть файл index.php, для чтения по протоколу FTP */

$fr = fopen("ftp://ftp.php.net/index.php", 'r');

/*Закодировать URL, затем открыть для чтения по протоколу HTTP */

$url = "http://www.php.net/this is my invalid URL.php";

$url = urlencode($url);

$fr = fopen($url, 'r');

?>

Закрытие файла: bool fclose ($fp).

Для работы с текстовыми файлами наиболее часто используются функции: fgets (), которая извлекает строку из файла, и fputs (), которая записывает строку в файл.

Функция считывания строки string fgets ( $fp, $length) возвращает строку длиной до length-1 байт, считанную из файла $fp. Операция чтения завершается после загрузки length-1 символов, либо после обнаружения символа конца строки, либо при обнаружении признака конца файла. Вот пример построчного вывода на экран, содержимого файла:

<? //pr415

$fp = fopen ("pr415.php", "r");

while (!feof ($fp)) {

$stroka = fgets ($fp, 80);

echo $stroka."<BR>";

}

fclose($fp);

?>

Загрузка строки с пропуском HTML-тегов выполняется функцией: string fgetss ($fp, $length [, string allowable_tags]). Функция работает идентично fgets(), однако считанной строки удаляются все HTML-теги, которые в ней присутствуют. Есть возможность использовать необязательный третий аргумент, для указания разрешенных тегов, которые удалены не будут.

Альтернативой fgets () является функция fscanf (). Синтаксис функции fscanf () показан ниже:

fscanf ($filename, $format , $var_one [, $var_two ...]]])

где $filename — входной поток, $format задает шаблон для чтения, а $var_one, $var_two представляют собой переменные, в которых сохраняются разобранные фрагменты данных (эти параметры необходимо передавать по ссылке). В случае успешного завершения ввода fscanf () возвращает количество разобранных элементов, а случае ошибки возвращает значение false. Запись форматированных данных в файл выполняет функция

fprintf ($filename, $format , $var_one [, $var_two ...]]]):

<?php if (!($fp = fopen('date.txt', 'w'))) {     return; } fprintf($fp, "%04d-%02d-%02d", $year, $month, $day);

?>

Допустимые символы форматирования функции fscanf () и fprintf()

%b Двоичное число.

%с Одиночный символ.

%d Десятичное число со знаком.

%u Десятичное число без знака.

%f Число с плавающей запятой.

%о Восьмеричное число.

%s Строка.

%x Шестнадцатиричное число.

Функция fputs () служит для записи строки (или любых других данных) в указанный поток и имеет следующий синтаксис: fputs($filename, $data [, int $length]), где $filename представляет выходной поток, $data содержит записываемые данные, а необязательный параметр $length задает размер фактически записываемых данных.

Соседние файлы в папке example1