Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP5]Funkcja zwrotna
lDoran
post
Post #1





Grupa: Zarejestrowani
Postów: 172
Pomógł: 13
Dołączył: 15.11.2009

Ostrzeżenie: (0%)
-----


  1. <?php
  2. class Student
  3. {
  4. private $_id;
  5. private $_name;
  6.  
  7. public $_courses;
  8.  
  9. public function __construct($id, $name)
  10. {
  11. $this -> _id = $id;
  12. $this -> _name = $name;
  13.  
  14. $this -> courses = new CourseCollection();
  15. $this -> courses -> setLoadCallBack('_loadCourses', $this);
  16. }
  17.  
  18. public function getName()
  19. {
  20. return $this -> _name;
  21. }
  22.  
  23. public function getID()
  24. {
  25. return $this -> _name;
  26. }
  27.  
  28. private function _loadCourses(Collection $col)
  29. {
  30. $arCourses = StudentFactory::getCoursesForStudent($this -> _id, $col);
  31. }
  32.  
  33. public function __toString()
  34. {
  35. return $this -> _name;
  36. }
  37. }
  38. ?>
  1. <?php
  2. require_once('class.KeyInvalidException.php');
  3. require_once('class.KeyInUseException.php');
  4.  
  5. class Collection
  6. {
  7. private $_members = array();
  8. private $_onLoad; //funkcja zwrotna
  9. private $_isLoaded = false; //flaga określająca, czy funkcja zwrota została już wysłana
  10.  
  11. public function addItem($obj, $key = null)
  12. {
  13. $this -> _checkCallBack();
  14.  
  15. if($key)
  16. {
  17. if(isset($this->_members[$key]))
  18. throw new KeyInUseException("Klucz \"$key\" jest już zajęty!");
  19. else
  20. $this->_members[$key] = $obj;
  21. }
  22. else
  23. $this->_members[] = $obj;
  24. }
  25.  
  26. public function removeItem($key)
  27. {
  28. $this -> _checkCallBack();
  29.  
  30. if(isset($this->_members[$key]))
  31. unset($this->_members[$key]);
  32. else
  33. throw new KeyInvalidException("Błędny klucz \"$key\"!");
  34. }
  35.  
  36. public function getItem($key)
  37. {
  38. $this -> _checkCallBack();
  39.  
  40. if(isset($this->_members[$key]))
  41. return $this->_members[$key];
  42. else
  43. throw new KeyInvalidException("Błędny klucz \"$key\"!");
  44. }
  45.  
  46. public function keys()
  47. {
  48. $this -> _checkCallBack();
  49.  
  50. return array_keys($this->_members);
  51. }
  52.  
  53. public function length()
  54. {
  55. $this -> _checkCallBack();
  56.  
  57. return sizeof($this->_members);
  58. }
  59.  
  60. public function exists($key)
  61. {
  62. $this -> _checkCallBack();
  63.  
  64. return (isset($this->_members[$key]));
  65. }
  66.  
  67. /*
  68. Ta metoda pozwala na zdefiniowanie funkcji, którą
  69. należy wywołać, aby wypełnić kolekcję.
  70. Jedynym parametrem tej funkcji powinna być
  71. kolekcja do wypełnienia.
  72. */
  73. public function setLoadCallBack($functionName, $objOrClass = null)
  74. {
  75. if($objOrClass)
  76. $callback = array($objOrClass, $functionName);
  77. else
  78. $callback = $functionName;
  79.  
  80. //sprawdzanie czy funkcja zwrotna da się wywołać
  81. if(!is_callable($callback, false, $callableName))
  82. {
  83. throw new Exception("Funkcja zwrotna $callableName nieprawidlowa!");
  84. return false;
  85. }
  86. $this -> _onLoad = $callback;
  87. }
  88.  
  89. private function _checkCallBack()
  90. {
  91. if(isset($this -> _onLoad) && !$this -> _isLoad)
  92. {
  93. $this -> _isLoaded = true;
  94. call_user_func($this -> _onLoad, $this);
  95. }
  96. }
  97. }
  98. ?>


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)
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 00:33