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

snowman.gif Функциите __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() and __debugInfo() се наричат магически.
Повече на адрес: http://php.net.

Конструктори


РНР позволява да се създават конструктори за класовете. Предимството от създаването на метод- конструктор е, че той извършва инициализацията на обекта.
Функцията, която РНР предлага за дефиниране на конструктор, е __construct(). Синтаксисът на функцията __construct() е:

void __construct ([mixed $args = "" [, $... ]])

Функцията може да съдържа толкова аргумента, колкото са ви необходими. Ще преработя скрипта от файла phpClass.php, съдържанието на който можете да откриете на адрес:
http://dreamlandpoly.blogspot.com/p/classes-and-objects.html#phpClass. В случая броят на необходимите аргументи е 4.

Конструкторът за клас Metals ще създам със следния скрипт:

//Създава конструктор за клас Metals
function __construct(
$name, $physical_state, 

$boiling_temperature, $melting_temperature) { $this->name = $name; $this->physical_state = $physical_state; $this->boiling_temperature = $boiling_temperature; $this->melting_temperature = $melting_temperature; }
При създаването на конструктор за клас, за да създадем нови обекти, не е необходимо да извикваме set функциите поотделно, за да зададем стойност на всяка променлива. Тези променливи можем да инициализираме в момента на създаването на съответния обект по следния начин:

//Създаване на нови обекти
$Sodium = new Metals ("Натрий", "твърдо", "883°C", "97,79°C");
$Potassium= new Metals ("Калий", "твърдо", "759°C", "63,38°C");
$Zink= new Metals ("Цинк", "твърдо", "907°C", "419,53°C");


Създайте нов файл constructor.php. Копирайте съдържанието на файла phpClass.php в него. Премахнете съдържанието от ред 43 до ред 66 (от //Създаване на нов/нови обекти до $Zink->setMeltingTemperature("419,53°C");) включително. След добавяне на горните два скрипта, файлът constructor.php ще има следното съдържание:
<?php
//constructor.php
header('Content-Type: text/html; charset=utf-8'); 

class Metals {
//Деклариране на свойствата на класа
 public $name;   //име на метала
 public $physical_state;  //агрегатно състояние
 public $boiling_temperature; //температура на кипене
 public $melting_temperature; //температура на топене
 
//Деклариране на методите на класа
 public function setName (){
          $this->name ;
      }
      
  public function getName(){
          echo $this->name ."<br/>";
      }
 public function setPhysicalState (){
          $this-> physical_state;
      }
      
       public function getPhysicalState(){
          echo $this-> physical_state ."<br/>";
      }
 public function setBoilingTemperature (){
          $this-> boiling_temperature ;
      }
      
       public function getBoilingTemperature(){
          echo $this-> boiling_temperature ."<br/>";
      }
 public function setMeltingTemperature (){
          $this-> melting_temperature ;
      }
      
       public function getMeltingTemperature(){
          echo $this-> melting_temperature ."<br/>";
      }

//Създава конструктор  клас Metals 
     function __construct($name, $physical_state, 
$boiling_temperature, $melting_temperature) {
$this->name = $name;
$this->physical_state = $physical_state;
$this->boiling_temperature = $boiling_temperature;
$this->melting_temperature = $melting_temperature;
} } /*Създава нови обекти и инициализира променливите $name, $physical_state,
$boiling_temperature,
$melting_temperature
за всеки обект по време на създаването му */
$Sodium = new Metals
("Натрий", "твърдо",
"883°C", "97,79°C"); $Potassium= new Metals
("Калий", "твърдо",
"759°C", "63,38°C");
$Zink= new Metals
("Цинк", "твърдо",
"907°C", "419,53°C"); echo "<p style=\"color:red;\">
Създаване на обекти чрез използване на метод конструктор</p>"; //Получаваме имената на обектите echo 'Имената на обектите са: ' . '<br>'; $Sodium->getName(); $Potassium->getName( ); $Zink->getName(); //Получаваме агрегатното състояние на обектите echo 'Агрегатните състояния на обектите са: ' . '<br>'; $Sodium->getPhysicalState(); $Potassium->getPhysicalState(); $Zink->getPhysicalState(); //Получаваме температурата на кипене на обектите echo 'Температурите на кипене на обектите са: ' . '<br>'; $Sodium->getBoilingTemperature(); $Potassium->getBoilingTemperature(); $Zink->getBoilingTemperature(); //Получаваме температурата на топене на обектите echo 'Температурите на топене на обектите са: ' . '<br>'; $Sodium->getMeltingTemperature(); $Potassium->getMeltingTemperature(); $Zink->getMeltingTemperature(); echo "<br><br>"; ?>
Резултатът от изпълнението на скрипта:

constructor-php.png

Деструктори


По подобен начин може да се дефинира и метод- деструктор. Това се осъществява с помощта на функцията __destruct(). Деструкторите освобождават всички ресурси.
//Създава деструктор за клас Metals 
 function __destruct()
  {
    
      echo 'Обектът' . ' '. $this-> name . ' ' .' 
от клас "', __CLASS__, '" е разрушен.<br>'; }
Вмъкнете този код в тялото на клас Metals, непосредствено след метода конструктор, във файла constructor.php.
Резултатът от изпълнението на скрипта:

destructor-php.png

Когато се достигне края на файла, интерпретаторът автоматично освобождава всички ресурси.
В PHP за освобождаването на паметта от ненужните обекти и променливи се грижи garbage collector, който открива автоматично всички ресурси към които вече няма референции (не се използват).
По подразбиране в Apache сървъра garbage collector е включен. Можете да го изключите, като преработите php.ini конфигурационния файл или чрез функцията gc_disable(). Ако обаче го изключите, в паметта ще се натрупат много излишни данни, които никога няма да бъдат почистени. Този процес се нарича „memory leak“ (загуба на памет).
Понякога се налага да се изтрие обект по време на изпълнение на скрипта. Това се извършва с функцията unset(). Когато се извиква функцията unset() за конкретен обект, преди изтриването на обекта, ще се извика неговият деструктор.
sign.png

Няма коментари:

Публикуване на коментар