I PHP 5 finns det ett antal magiska metoder, vilka du bara drar nytta utifall du programmerar objektorienterat.D
De nya metoderna är:
- __construct
- __destruct
- __autoload
- __call
- __callStatic
- __get
- __set
- __isset
- __unset
- __sleep
- __wakeup
- __toString
- __set_state
- __clone
I detta inlägg kommer jag dock bara ta upp de vanligaste, nämligen __construct, __get, __set, __autoload samt __toString.
__construct…
…är konstruktorn för ett objekt och anropas varje gÃ¥ng en klass instansieras. Ett exempel är:
Class HelloWorld
{
public function __construct($name)
{
echo ‘Hello world, ‘ . $name . ‘!’;
}
}
$world = new HelloWorld(‘Alexander’);
Vilket kommer att skriva ut “Hello world, Alexander!”.
I konstruktorn skall alla privata variabler instansieras, dock är det även användbart att göra till exempel anslutningar mot databaser m.m.
__get & __set
Dessa två magiska funktioner används när man till exempel vill skapa eller komma åt en variabel som inte existerar, eller är skapad dynamiskt. Ett exempel är:
Class HelloWorld
{
public function __get($key)
{
return $this->$key;
}
public function __set($key, $value)
{
$this->$key = $value;
}
}
Skulle vi sedan utföra något liknande:
$world = new HelloWorld;
$world->name = "Alexander"; // __set
echo $world->name; // __get
Skulle vi helt enkelt skriva ut Alexander. Notera att det inte finns någon privat variabel som håller mitt namn, utan den skapas dynamiskt via vår __set-method, och hämtas sedan vårt __get-anrop.
__autoload…
… är en funktion jag använder i vartenda projekt jag bygger. Med auto loading kan vi tillämpa lazy loading, vilket innebär att man inte hämtar nÃ¥gonting förrens man behöver det. Det betyder att vi inte behöver nÃ¥gra rader som require_once ‘helloworld.class.php’, utan allting sköts automatiskt
Exempel:
function __autoload
($class)
{
require_once $class .
‘.php’;
}
$class = new HelloWorld;
När vi anropar $class = new HelloWorld, kommer PHP märka att vi inte har laddat klassen, och istället för att kasta en E_WARNING eller E_NOTICE, kommer klassnamnet skickas till vår __autoload(), som sedan inkluderar rätt fil. Detta är väldigt användbart då man kan spara stora resurser på det.
__toString
Denna magiska method berättar helt enkelt för PHP hur klassen skall omvandlas till en sträng. När vi kör till exempel echo $class, får vi object of class Class could not be converted to string. Skulle vi däremot definiera en __toString skulle PHP skriva ut det vi specifierar i vår magiska method.
Exempel:
<?php
Class HelloWorld
{
private $name;
public function __construct($name)
{
$this->name = $name;
}
public function __toString()
{
return ‘Hello world, ‘ . $this->name . ‘!’;
}
}
?>
Kör vi:
$class =
new HelloWorld
("Alexander);
echo $class;
kommer sÃ¥ledes “Hello world, Alexander!”