<?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 $_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) { throw new KeyInUseException("Klucz \"$key\" jest już zajęty!"); else $this->_members[$key] = $obj; } else $this->_members[] = $obj; } public function removeItem($key) { $this -> _checkCallBack(); else throw new KeyInvalidException("Błędny klucz \"$key\"!"); } public function getItem($key) { $this -> _checkCallBack(); return $this->_members[$key]; else throw new KeyInvalidException("Błędny klucz \"$key\"!"); } public function keys() { $this -> _checkCallBack(); } public function length() { $this -> _checkCallBack(); } public function exists($key) { $this -> _checkCallBack(); } /* 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) 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() { { $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!
Student #1 nie istnieje w bazie danych!
Nie rozumiem dlaczego Collection::setCallBack() nie może wywołać Student::_loadCourses
