<?php
class Student
{
private $_id;
private $_name;
public $_courses;
public function __construct($id, $name)
{
$this -> _id = $id;
$this -> _name = $name;
$this -> courses = new CourseCollection();
$this -> courses -> setLoadCallBack('_loadCourses', $this);
}
public function getName()
{
return $this -> _name;
}
public function getID()
{
return $this -> _name;
}
private function _loadCourses(Collection $col)
{
$arCourses = StudentFactory::getCoursesForStudent($this -> _id, $col);
}
public function __toString()
{
return $this -> _name;
}
}
?>
<?php
require_once('class.KeyInvalidException.php');
require_once('class.KeyInUseException.php');
class Collection
{
private $_members = array(); private $_onLoad; //funkcja zwrotna
private $_isLoaded = false; //flaga określająca, czy funkcja zwrota została już wysłana
public function addItem($obj, $key = null)
{
$this -> _checkCallBack();
if($key)
{
if(isset($this->_members
[$key])) throw new KeyInUseException("Klucz \"$key\" jest już zajęty!");
else
$this->_members[$key] = $obj;
}
else
$this->_members[] = $obj;
}
public function removeItem($key)
{
$this -> _checkCallBack();
if(isset($this->_members
[$key])) unset($this->_members
[$key]); else
throw new KeyInvalidException("Błędny klucz \"$key\"!");
}
public function getItem($key)
{
$this -> _checkCallBack();
if(isset($this->_members
[$key])) return $this->_members[$key];
else
throw new KeyInvalidException("Błędny klucz \"$key\"!");
}
public function keys()
{
$this -> _checkCallBack();
}
public function length()
{
$this -> _checkCallBack();
return sizeof($this->_members
); }
public function exists($key)
{
$this -> _checkCallBack();
return (isset($this->_members
[$key])); }
/*
Ta metoda pozwala na zdefiniowanie funkcji, którą
należy wywołać, aby wypełnić kolekcję.
Jedynym parametrem tej funkcji powinna być
kolekcja do wypełnienia.
*/
public function setLoadCallBack($functionName, $objOrClass = null)
{
if($objOrClass)
$callback = array($objOrClass, $functionName); else
$callback = $functionName;
//sprawdzanie czy funkcja zwrotna da się wywołać
if(!is_callable($callback, false, $callableName))
{
throw new Exception("Funkcja zwrotna $callableName nieprawidlowa!");
return false;
}
$this -> _onLoad = $callback;
}
private function _checkCallBack()
{
if(isset($this -> _onLoad
) && !$this -> _isLoad
) {
$this -> _isLoaded = true;
call_user_func($this -> _onLoad, $this);
}
}
}
?>
Błąd zwracany przez przeglądarkę
Cytat
Funkcja zwrotna Student::_loadCourses nieprawidlowa!
Student #1 nie istnieje w bazie danych!
Nie rozumiem dlaczego Collection::setCallBack() nie może wywołać Student::_loadCourses (IMG:
style_emoticons/default/worriedsmiley.gif)