Scrierea proprietăților prin magie în OOP în PHP
Metoda magică __set este apelată
la încercarea de a modifica valoarea unei proprietăți
inexistente sau ascunse. Ca parametri
primește numele proprietății și valoarea, care
îi este încercată asignarea.
Să analizăm un exemplu practic.
Să presupunem că avem următoarea clasă Test:
<?php
class Test
{
private $prop1;
private $prop2;
}
?>
Să creăm în această clasă o metodă magică
__set, care cu ajutorul funcției
var_dump va afișa numele proprietății,
căreia i s-a făcut accesul, și valoarea,
care a fost încercată a fi setată pentru această proprietate:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
var_dump($property . ' ' .$value);
}
}
?>
Să verificăm funcționarea clasei noastre:
<?php
$test = new Test;
$test->prop = 'value'; // var_dump din metoda __set va afișa 'prop value'
?>
Acum să setăm valoarea
proprietății, al cărei nume este stocat în variabila
$property:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value; // setăm valoarea
}
}
?>
Acum vom putea scrie în proprietățile private din afara clasei:
<?php
$test = new Test;
$test->prop1 = 1; // vom scrie 1
$test->prop2 = 2; // vom scrie 2
?>
Putem scrie, însă, să verificăm dacă ceva s-a scris acolo - nu, deoarece proprietățile sunt private.
Se poate face un getter pentru aceste proprietăți sau
se poate folosi metoda magică
__get. Să folosim a doua variantă:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value;
}
// Getter magic pentru proprietăți:
public function __get($property)
{
return $this->$property;
}
}
?>
Acum putem verifica funcționarea clasei noastre. Să verificăm:
<?php
$test = new Test;
$test->prop1 = 1; // vom scrie 1
$test->prop2 = 2; // vom scrie 2
echo $test->prop1; // va afișa 1
echo $test->prop2; // va afișa 2
?>
De fapt, desigur, nu ar trebui să permitem oricine să scrie în proprietățile private, altfel se pierde sensul acestor proprietăți private (este mai ușor să le faci publice și atât).
Prin urmare, această metodă trebuie aplicată doar atunci când există cu adevărat nevoie. În lecțiile următoare vom analiza și exemple de aplicare cu succes.