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

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

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

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

Подсчет объектов или статических членов и методов. Обработка исключительных ситуаций

Подсчет объектов

Подсчет объектов или статических членов и методов

Для того, чтобы воспользоваться членами или методами, не всегда обязательно объявлять объект класса. Объявление внутренних компонентов класса статическими при помощи ключевого слова static делает их доступными в любой момент без объявления объекта класса. Обращение к таким компонентам осуществляется при помощи следующей конструкции:

класс: :компонент(член или метод)

Рассмотрим пример простейшего класса, содержащего один статический метод и одну статическую переменную.

Статические члены и методы
<?php
class StaticClass
{
//Объявляем статический член класса
static $member="Это статический член класса <br>";
//Объявляем статический метод класса
static function method()
{
echo "Вызван статический метод класса <br>";
}
}
//Вызываем статический метод класса,
//объявление объекта не требуется.
StaticClass::method();
//Выводим статическую переменную в окно браузера
echo StaticClass::$member;
?>

Как видно из листинга, для обращения к статическим методам и членам не требуется явное обновление объекта.

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

Счетчик объектов
<?php
class Counter
{
//Объявляем статический член класса
static $counter=0;
//Объявляем конструктор класса
function __construct()
{
//Увеличиваем счетчик объектов
Counter::$counter++;
}
function __destruct()
{
//Уменьшаем счетчик объектов
Counter::$counter--;
}
}
//Объявляем 5 объектов класса Counter
$obj1=new Counter;
$obj2=new Counter;
$obj3=new Counter;
$obj4=new Counter;
$obj5=new Counter;
//Выводим число объектов
echo Counter::$counter; //5
?>

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

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

Открытие класса в конструкторе и закрытие в деструкторе
<?php
class Counter
{
//Счетчик одновременного открытия файлов
static $counter=0;
//имя файла
var $name;
//дескриптор файла
var $file;
//Объявляем конструктор класса
function __construct()
{
//увеличиваем счетчик открытых файлов
Counter::$counter++;
$this->name=Counter::$counter;
if(Counter::$counter<=3)
{
$this->file=@fopen($this->name, "r");
if(!$this->file)
{
echo "Ошибка открытия файла";
$this->is_open=false;
}
//флаг is_open равен true, если удалось открыть файл,
//и false - в случае неудачи
$this->is_open=true;
}
else
{
$this->is_open=false;
echo "Невозможно открыть файл - исчерпан лимит <br>";
Counter::$counter--; //файл не был открыт
}
}
function __destruct()
{
//если файл был открыт закрываем его
if($this->is_open)
{
@close($this->file);
}
//уменьшаем счетчик открытых файлов
Counter::$counter--;
}
}
//Объявляем 5 объектов класса Counter
$obj1=new Counter;
$obj2=new Counter;
$obj3=new Counter;
$obj4=new Counter;
$obj5=new Counter;
//Выводим число объектов
echo Counter::$counter; //3
?>

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

Обработка исключительных ситуаций

Для реализации механизма обработки исключительных ситуаций в РНР5 введены следующие три ключевых слова: try (контролировать), thow (генерировать, бросать), и catch (ловить).

Служебное слово try позволяет выделить в любом месте скрипта так называемый контролируемый блок, за которым следует один или несколько блоков обработки исключений, вводимых с помощью ключевого слова catch:

try
{
// операторы
}
catch (Exception $exp)
{
//блок кода обработки исключительной ситуации
}

Обработчики всегда располагаются после контролируемого оператором try блока кода. Среди операторов контролируемого блока могут быть любые операторы и объявления РНР. Исключительная ситуация генерируется при помощи ключевого слова thow:

thow выражение_генерации_исключения;

После оператора thow следует объявление объекта исключения. При генерации исключения выполнение основной программы прекращается и происходит выполнение кода обработчика исключительной ситуации. Как и все объекты, объект класса исключений (Exception) объявляется при помощи ключевого слова new, при этом конструктор принимает два параметра: строку с сообщением об ошибке и код ошибки.

Рассмотрим пример обработки ошибки, генерируемой в контролируемом блоке.

Простой пример обработки ошибки
<?php
//Начало контролируемого блока
try
{
//Генерируем исключение
throw new Exception("Произошла исключительная ситуация", 9);
}
//Начало блока обработки исключительной ситуации
catch (Exception $e)
{
echo "Исключение ". $e->getCode(). ": ". $e->getMessage()."<br>";
echo "в файле ". $e->getFile(). "<br>";
echo "строка ". $e->getLine()."<br>";
}
?>

Класс исключений Exception содержит четыре метода:

  • getCode() — возвращает код ошибки (первый параметр конструктора);
  • getMessage() — возвращает строку сообщения об ошибке (второй параметр конструктора);
  • getFile() — возвращает имя файла, в котором было сгенерировано исключение;
  • getLine() — возвращает номер строки, в которой произошла генерация исключения.

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

.

Пример обработки исключительной ситуации.

<?php
function OutputPositiveNumber($number)
{
if($number>=0)
{
echo "Функции OutputPositiveNumber передано положительное число: $number>=0 <br>";
}
else
{
throw new Exception ("Функции OutputPositiveNumber передано отрицательное число: $number", 1);
}
}
//Начало контролируемого блока
try
{
OutputPositiveNumber(45);
OutputPositiveNumber(-100); //эта строка вызовет исключение
OutputPositiveNumber(100);
}
//Начало блока обработки исключительной ситуации
catch (Exception $e)
{
echo "Исключение " .$e->getCode(). ": ". $e->getMessage(). "<br>";
echo "в файле ". $e->getFile(). "<br>";
echo "строка ". $e->getLine()."<br>";
}
?>

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

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

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

Применение механизма исключений при работе с классами
<?php
class WorWiFi
{
//Буфер
var $buff;
//Имя файла
var $filename;
//Конструктор класса
function __construct($filename)
{
//Имя файла помещаем в член filename
$this->filename=$filename;
//Проверяем существование файла
if(!file_exists($this->filename))
throw new Exception("файл $filename не существует", 21);
//открытие файла
$fd=fopen($filename, "r");
if(!$fd) exit ("Ошибка открытия файла");
//чтение файла
$this->buff=fread($fd, filesize($this->filename));
//закрытие файла
fclose($fd);
}
//Метод выводит содержимое файла
function getContent()
{
return $this->buff;
}
//Метод выводит размер файла
function getSize()
{
return filesize($this->filename);
}
//Метод выводит число строк в файле
function getCount()
{
//Если файл загружен
if(!empty($this->filename))
{
$arr=file($this->filename);
return count($arr);
}
else return 0;
}
}
?>

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

Обработка исключений
<?php
require_once("368.php");
try
{
echo "<pre>";
$first=new WorWiFi("proba.txt");
$second=new WorWiFi("filt.txt");
echo "Размер (в байтах): {$first->getSize()} <br>";
echo "Число строк: {$first->getCount()} <br>";
echo "{$first->getContent()} <br>";
echo "{$second->getContent()} <br>";
echo "</pre>";
}
catch (Exception $e)
{
echo "Исключение " .$e->getCode(). ": ". $e->getMessage(). "<br>";
echo "в файле ". $e->getFile(). "<br>";
echo "строка ". $e->getLine()."<br>";
}
?>