Czytałem, że metoda __toString() jest maginczą. Wiem mniej więcej do czego służy. Wytłumaczcie mi dlaczego w poniższym przykładzie w momencie przy
<?php
?>
wykonywane jest __toString() obiektu Foo? Przecież w zmiennej $objAdam trzymane jest Collection..
<?php
class Collection {
private $_members = array(); // elementy kolekcji
public function addItem($obj, $key = null) {
if($key) {
if(isset($this->_members
[$key])) { echo "Klucz "$key" jest już zajęty!"; } else {
$this->_members[$key] = $obj;
}
} else {
$this->_members[] = $obj;
}
}
public function removeItem($key) {
if(isset($this->_members
[$key])) { unset($this->_members
[$key]); } else {
echo "Błędny klucz "$key"!"; }
}
public function getItem($key) {
if(isset($this->_members
[$key])) { return $this->_members[$key];
} else {
echo "Błędny klucz "$key"!"; }
}
}
class Foo {
private $_name;
private $_number;
public function __construct($name, $number) {
$this->_name = $name;
$this->_number = $number;
}
public function __toString() {
return $this->_name . ' ma numer ' . $this->_number;
}
}
$colFoo = new Collection();
$colFoo->addItem(new Foo("Adam", 14), "adam");
$colFoo->addItem(new Foo("Marek", 37), "marek");
$colFoo->addItem(new Foo("Jacek", 49));
$objAdam = $colFoo->getItem("adam");
print $objAdam; // wyświetla "Adam ma numer 14" $colFoo->removeItem("adam"); // usuwa obiekt 'adam'
try {
$colFoo->getItem("adam"); //zgłasza wyjątek KeyInvalidException
} catch (KeyInvalidException $kie) {
print "Kolekcja nie zawiera elementu o kluczu 'adam'"; }
?>