<
УЦ Контакт

Лидер IT образования

Как приятно знать, что ты что-то узнал (Мольер)

 
03056, Киев, пер. Ковальский 13, 1-й этаж, офис №2
 
Программы курсов

Акция! Студентам - Скидка 15%! Слушателям IT Academy бесплатное посещение English Club

Статья>>Курсы программирование PHP - новые технологии

Курсы web-программистов ждут всех желающих.

Беря во внимание то, PHP сегодня -  самая популярная технология разработки серверной части сайтов, и то, что  PHP 4, по версиям многих, революционная сравнивая с предыдущими,  пятая версия не может не вызывать  интерес среди веб-программистов.
По словам разработчиков PHP 5, ничего нового в этой версии ждать не стоит - все дополнения носят так называемый ”эволюционный” характер. Но несмотря на это все дополнения весьма полезны и ожидаемые.
Первым делом разработчики переделали принцип работы с объектами. Вспоминая что объектно-ориентированное программирование в предыдущих версиях существовало лишь ранних этапах разработки,  поэтому использовали его крайне редко, то  в PHP 5 есть громадный потенциал реализации объектного программирования. Помимо этого, в PHP присутствует огромное количество весьма полезных расширений для  создании графики использования XML, работы с различными источниками данных, и пр.

Главное различие работы с обьектами в PHP5 от PHP4 состоит в том, что присвоение объекта или передача его как параметр функции выполняется по умолчанию по ссылке, а не по его собственному значению, как в ранних версиях.
Если в PHP 4 обработка обьектов была такой же, как и простых типов данных, что частенько вызывалоло к копирование одного и того же объекта, то в PHP5 этого нет, потому что каждый объект имеет уникальный числовой идентификатор (handle), который используется при работе с обьектом.
Представленный ниже код, показывает различия в работе с обьектами в PHP4 и в PHP5

<?
     class MyClass {
         var $property;
     }
     $my1 = new MyClass;
     $my1->property = 1;
     $my2 = $my1;
     $my2->property = 2;
     echo $my1->property; // Выводит 1 в PHP4 и 2 в PHP5
     echo $my2->property; // Выводит 2
?>
В PHP 4 $my2 является копией объекта $my1, а в PHP 5 и $my1 и $my2 указывают одинаковый объект, иоператор $my2 = $my1 копирует лишь идентификатор обьекта.
Разные методы по работе с обьектами имеют место потому, что Zend Engine 1, котроый выполнял все сценарии в PHP 4, сохранял значения всех типов одинаково в структуре, которая называется zval (Zend VALue). В PHP 5 тоже присутствует zval, но теперь он служит для хранения только типов данных, а объекты, располагаются в другой структуре, называемой Object Store. В Zval хранятся лишь идентификаторы объектов, поэтому при присвоении или передачи обьектов в функцию передается идентификатор обьекта.
С помощью этого значительно улучшается работа со сценариями, где используются обьекты

Курсы программирование PHP. Изучаем механизм клонирование объектов

Мы выяснили, что в PHP 5  все объекты передаются по своей ссылке. Но если нам необходимо именно копирование объекта, так как это имело место в PHP 4, то в PHP 5 нам теперь нужно использование нового метода __clone(). При использовании его объект копируется со своими методами, свойствами а также их значениями:
<?php
     class MyClass{
         var $property;
     } 
     $my1 = new MyClass;
     $my1->property = 1;
     $omy2 = clone $obj1;
     echo $my1->property; // Выводит 1
     echo $my2->property; // Выводит 1
     $my2->property = 2;
     echo $obj2->property; // Выводит 2
?>
Обратите внимание - к методу __clone() нельзя обратиться непосредственно чтобы скопировать обьект мы пользуемся ключевым словом clone.
Метод __clone() не нужно описывать в самом классе, ноего явное определение позволит нам поменять значения свойств  объекта что копируется:
<?php
     class MyClass{
         var $property;
         function __clone() {
             $this->property = 2; 
         }
     } 
     $my1 = new MyClass;
     $my1->property = 1;
     $my2 = clone $obj1;
     echo $my1->property; // Выводит 1
     echo $my2->property; // Выводит 2
?>
Метод __clone() не принимает аргументы, но позволяет обратиться к данному объекту при помощи указателя $this и обьекту получаемому в результате копирования через указатель $that. 

В PHP 5 добавлены такие спецификаторы доступа как , protected, public и private, которые позволяют нам указывать уроень доступа к различным методам и свойствам класса.

К вседоступным (public) методам и свойствам мы можем получить доступ без любых ограничений.
Защищенные (protected) обьекты класса могут быть доступны только внутри класса, где они были объявлены, и в дочерних от него классах.
Приватные (private) обьекты мог доступны только в том классе, где они были объявлены.
<?php
     class MyClass1 {
         public $public1 = "элемент public";
         protected $protected1 = "элемент protected";
         private $private1 = "элемент private"; 
         public function printPrivate1() {
             echo $this1->private1; 
         }
     } 
     $obj1 = new MyClass1;
     echo $obj1->public1; // Выводит "свободнодоступный элемент" 
 
     class MyClass2 extends myClass1 {
         public function printProtected1() {
             echo $this1->protected1; 
         }
     } 
     $obj2 = new MyClass1();
     $obj2->printProtected1(); // Выводит Protected элемент
 
     $obj1->printPrivate1(); //Выводит Private элемент"
 
     echo $obj1->protected1; // Происходит ошибка доступа 
     echo $obj1->private1; // Происходит ошибка доступа
?>
Если не был указан ни один из таких спецификаторов, то по умолчанию обьекту будет присвоен уровень доступа public. Точно такой же уровень доступности получают те свойства для создания которых использовалось ключевое слово var которое давно устарело и не рекомендуется для использования в PHP 5.


 Такой Метод как конструктор теперь будет вызыватся автоматически во время каждого создания объекта. И несмотря на то что конструктор возник в PHP давно (эту функцию выполнял метод, что назывался именем класса), но в PHP 5 изменилась схема наименования конструктора - метод __construct() отныне является конструктором класса.
По аналогии, деструктор класса __destruct() вызывается  при уничтожении объекта .
<?php
     class MyClass1 {

         function __destruct() {
             echo "деструктор запущен ";
         }
         function __construct() {
             echo "конструктор запущен ";
         }
        
     }
     $obj1 = new MyClass1(); // Выводит "конструктор запущен "
     unset($obj1); // Выводит " деструктор запущен"
?>
Ежели  нам нужно вызівать деструктор или конструктор базового класса, то нужно делать это явно, через  parent указатель.
<?php
     class MyClass1 {
         function __construct() {
             echo "конструктор базового класса запущен ";
         }
         function __destruct() {
             echo "деструктор базового класса запущен ";
         } 
     }
     class MyClass2 extends MyClass1 {
        function __destruct() {
            parent::__destruct();
        }

       function __construct() {
            parent::__construct();
        }
      
    }  
    $obj1 = new MyClass2(); // Выводит " конструктор
                                       // базового класса запущен"
    unset($obj1); // Выводит " деструктор базового класса запущен"
?>
Для лучшей совместимости с ранней версией PHP 5 делают следующем образом: если конструктор __construct() во время создания объекта в классе не найден , то PHP попытается выполнить тот метод, название которого совпадет с именем класса.  Тоесть. конструкторы PHP 4 будут функционировать с PHP 5 без всяких изменений кода.

      final class MyClass1 {
          // Код-описание класса
      }
      // Такой код вызовет ошибку
      // візова от финального класса
      class MyClass2 extends MyClass1 {
          // Код-описание класса
      }
?>
Если класс определяется как final, то и все методы подобного класса становятся автоматически финальными, так что, определить их явно как final теперь совершенно нету никакой необходимости.
Определить же свойства класса финальными – неправильно.