Both method calls and member accesses can be overloaded via the __call, __get and __set methods. These methods will only be triggered when your object or inherited object doesn't contain the member or method you're trying to access. All overloading methods must not be defined as static.
Since PHP 5.1.0 it is also possible to overload the isset() and unset() functions via the __isset and __unset methods respectively.
void
__set ( string name, mixed value )
mixed
__get ( string name )
bool
__isset ( string name )
void
__unset ( string name )
Class members can be overloaded to run custom code defined in your class by defining these specially named methods. The $name parameter used is the name of the variable that should be set or retrieved. The __set() method's $value parameter specifies the value that the object should set the $name.
Esempio 19-18. overloading with __get, __set, __isset and __unset example <?php class Setter { public $n; private $x = array("a" => 1, "b" => 2, "c" => 3);
private function __get($nm) { echo "Getting [$nm]\n";
if (isset($this->x[$nm])) { $r = $this->x[$nm]; print "Returning: $r\n"; return $r; } else { echo "Nothing!\n"; } }
private function __set($nm, $val) { echo "Setting [$nm] to $val\n";
if (isset($this->x[$nm])) { $this->x[$nm] = $val; echo "OK!\n"; } else { echo "Not OK!\n"; } }
private function __isset($nm) { echo "Checking if $nm is set\n";
return isset($this->x[$nm]); }
private function __unset($nm) { echo "Unsetting $nm\n";
unset($this->x[$nm]); } }
$foo = new Setter(); $foo->n = 1; $foo->a = 100; $foo->a++; $foo->z++;
var_dump(isset($foo->a)); //true unset($foo->a); var_dump(isset($foo->a)); //false
// this doesn't pass through the __isset() method // because 'n' is a public property var_dump(isset($foo->n));
var_dump($foo); ?> |
Il precedente esempio visualizzerĂ : Setting [a] to 100 OK! Getting [a] Returning: 100 Setting [a] to 101 OK! Getting [z] Nothing! Setting [z] to 1 Not OK!
Checking if a is set bool(true) Unsetting a Checking if a is set bool(false) bool(true)
object(Setter)#1 (2) { ["n"]=> int(1) ["x:private"]=> array(2) { ["b"]=> int(2) ["c"]=> int(3) } } |
|
mixed
__call ( string name, array arguments )
Class methods can be overloaded to run custom code defined in your class by defining this specially named method. The $name parameter used is the name as the function name that was requested to be used. The arguments that were passed in the function will be defined as an array in the $arguments parameter. The value returned from the __call() method will be returned to the caller of the method.
Esempio 19-19. overloading with __call example <?php class Caller { private $x = array(1, 2, 3);
public function __call($m, $a) { print "Method $m called:\n"; var_dump($a); return $this->x; } }
$foo = new Caller(); $a = $foo->test(1, "2", 3.4, true); var_dump($a); ?> |
Il precedente esempio visualizzerĂ : Method test called: array(4) { [0]=> int(1) [1]=> string(1) "2" [2]=> float(3.4) [3]=> bool(true) } array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } |
|