Опубликован: 01.03.2005 | Доступ: свободный | Студентов: 35447 / 5532 | Оценка: 4.31 / 4.06 | Длительность: 16:41:00
ISBN: 978-5-9556-0026-0
Лекция 6:

Объекты и классы в PHP

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >

Объектная модель PHP5

Кроме нового названия для конструкторов и появления деструкторов в PHP5 произошло еще достаточно много изменений. Мы не будем обсуждать их подробно, только опишем в общих чертах. Основное изменение – это передача значений параметров класса по ссылке и присвоение объектов по ссылке, а не по значению, как это было в PHP4. В PHP5 если создаются две равные переменные типа объект, то они указывают на одно значение и изменяются одновременно (мы приводили похожий пример с переменными строкового типа). В связи с этим появился новый механизм для создания копий объектов – так называемое клонирование. В PHP4 все методы и переменные класса доступны извне, т.е. они всегда являются открытыми. В PHP5 переменные и методы можно делать открытыми (доступными отовсюду), закрытыми (доступными только внутри класса ) и защищенными (доступными внутри класса и в его производных классах ). Кроме того, появилась возможность создавать интерфейсы и абстрактные классы и многое другое. В целом объектная модель в PHP5 значительно усовершенствована для более точного соответствия объектно-ориентированной парадигме программирования.

Решение задачи

Итак, мы хотели по выбору пользователя генерировать форму для ввода описания статьи или человека и отображать данные, введенные в эту форму. Попробуем решить эту задачу, используя объектно-ориентированный подход. Для начала создадим форму, где пользователь выбирает, что он хочет создать, – описание статьи или человека (точнее, это будут две формы):

<form action="task1.php">
Создать описание статьи: <input type=submit
    name=art_create
    value="Create Article">
</form>
<form action="task1.php">
Создать описание личности: <input 
   type=submit name=pers_create 
   value="Create Person">
</form>

Теперь напишем файл для обработки этих форм. В нем создадим два класса – статьи и личности. У каждого класса имеется метод для инициализации его переменных и метод для отображения объектов данного класса. При решении задачи будут использованы две функции, встроенные в PHP для работы с классами и объектами. Это функция get_class (объект), возвращающая имя класса, экземпляром которого является объект, переданный ей в качестве параметра. И функция get_class_vars (имя класса ), которая возвращает массив всех свойств класса и их значений по умолчанию. Аналогично можно получить массив имен всех методов класса: get_class_methods (имя класса )

<?php
// Создаем классы Статей и Личностей. 
// Статья имеет заголовок, автора и 
// описание. Личность имеет имя, фамилию
// и e-mail
class Article {
  var $title;
  var $author;
  var $description;
// метод, который присваивает значения
// атрибутам класса
  function Article($t="Название отсутствует",
      $a="Автор отсутствует",
      $d="Описание отсутствует"){
    $this->title = $t;
    $this->author = $a;
    $this->description = $d;
  }
//метод для отображения экземпляров класса
  function show(){
   $art = "<h2>$this->title</h2><font
   size=-1>$this->description</font><p>Автор:
   $this->author</p>";
    echo $art;
  }
}
// Определение класса Личностей
class Person {
  var $first_name;
  var $last_name;
  var $email;
//метод, который присваивает значения атрибутам класса
  function Person($t="Имя не введено",
    $a="Фамилия не введена",$d="Email не указан"){
    $this->first_name = $t;
    $this->last_name = $a;
    $this->email = $d;
  }
//метод для отображения экземпляров класса
  function show(){
    $art = "<h2>$this->first_name</h2><font
      size=-1>$this->last_name</font><p>e-mail:
$this->email</p>";
    echo $art;
  }
}
// Далее следует собственно создание и отображение
// экземпляров выбранного класса
if (isset($_GET["art_create"])){ //Если была выбрана статья
  $art = new Article; // создаем представителя класса статей
  $art_vars = get_class_vars(get_class($art)); //какие
                      // аргументы этого класса нужно задать
  Make_form($art,$art_vars,"art_create"); //вызов функции
                      // создания формы
  if (isset($_GET["create_real"])){ Show_($art_vars); }
  // если данные этой формы отправлены, то вызываем
  // функцию показа
}
//то же самое, если была выбрана личность
if (isset($_GET["pers_create"])){
  $art = new Person;
  $art_vars = get_class_vars(get_class($art));
  Make_form($art,$art_vars,"pers_create");
  if (isset($_GET["create_real"])){ Show_($art_vars); }
}
// функция создания формы
function Make_form($art,$art_vars,$glob){
  $str = "<form>";   // html код формы записывается
                     // в строку $str
  //перебираем список переменных класса объекта $art
  foreach ($art_vars as $var_name => $var_value){
    $str .="$var_name<input type=text name=$var_name><br>";
    //создаем элемент формы с именем свойства класса
  }
  $str .= "<input type=hidden name=$glob>"; // чтобы не
                                   // забыть, что мы создаем
  $str .= "<input type=submit name=create_real
    value='Create and Show'></form>";
echo "$str";   // выводим форму
}
// функция показа объекта
function Show_($art_vars){
  global $art; //используется глобальное имя объекта
  $k = count($art_vars); //число свойств класса
                         // (переменных в форме)
  $p=0; //вспомогательная переменная
  foreach ($art_vars as $name => $value){
    $p++;
      if ($_GET["$name"]=="") $val= $art->$name;
      else $val = $_GET["$name"];
      if ($p<>$k) $par .='"'. $val.'",';
      else $par .='"'. $val.'"';
  }
  $const=get_class($art);
  $par = '$art->'.$const ."(" .$par.");";
  // теперь $par представляет собой php-код для вызова
  // метода класса $art, изначально
  // записанного в $par
  // например,
  // $art->Person('Vasia','Petrov','vas@intuit.ru');
  eval($par); // функция eval выполняет код,
              // содержащийся в $par
  $art->show();
}
?>
Листинг 6.6. Использование объектно-ориентированного подхода

Заключение

Итак, мы изучили основные понятия объектной модели, используемой в языке PHP. Были описаны правила создания классов и их представителей-объектов, способы задания начальных значений переменным класса, способы получения значений свойств и вызов методов классов.

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >
Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Сергей Крупко
Сергей Крупко

Добрый день.

Я сейчас прохожу курс  повышения квалификации  - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?