
Подсчет объектов или статических членов и методов
Для того, чтобы воспользоваться членами или методами, не всегда обязательно объявлять объект класса. Объявление внутренних компонентов класса статическими при помощи ключевого слова 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>";
}
?>
 
               
               
               
               
              
Комментарии(0)
Для добавления комментариев надо войти в систему и авторизоватьсяКомментирование статей доступно только для зарегистрированных пользователей:Зарегистрироваться