Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: __autoload()
Forum PHP.pl > Forum > PHP > Object-oriented programming
theoden
Mam takie pytanie. Funkcja __autoload() spróbuje dołączyć plik jeżeli będe chcial skorzystać z klasy która nie została jeszcze zdefinjowana. Działa to oczywiście i plik z klasą zostaje dołączony tyle że :

  1. //dołączony.php
  2. <?
  3. # Global variable - check point
  4. define(&#092;"ERROR_HANDLER_LOADED\",true);
  5.  
  6.  
  7. class Error_Handler extends Exception {
  8.  
  9.  
  10. /**
  11.  * @var string
  12.  * @access private
  13.  */
  14.  
  15. private $error_messages;
  16.  
  17. /**
  18.  * Construct
  19. * @param string $message Message from exception
  20. * @param int $code Code of exception 
  21. * @access public 
  22. */ 
  23.  
  24. public function __construct($message=null, $code = 0)
  25. {
  26.  
  27. $this->error_messages = array();
  28. $this->load_errors();
  29. # We make sure that everything is asigned properly
  30. parent::__construct($message, $code);
  31. }
  32.  
  33. /**
  34.  * Loading all errors
  35.  * @return bool
  36.  * @access private
  37.  */
  38. private function load_errors()
  39. {
  40.  
  41. global $ERRORS;
  42.  
  43. if (empty($ERRORS))
  44. return false;
  45.  
  46. foreach ($ERRORS as $key => $value){
  47. $this->error_messages[$key] = $value;
  48. }
  49. echo &#092;"<pre>\";
  50. print_r($this->error_messages);
  51. echo &#092;"</pre>\";
  52. return true;
  53. }
  54.  
  55. /**
  56.  * Display errors (Param $message from __construct)
  57.  * @return void
  58.  * @access public
  59.  */
  60.  
  61. public function alert()
  62. {
  63. print self::getCode() . ' : ' . $this->error_messages[$this->message];
  64. }
  65. }
  66.  
  67. // US English
  68. $ERRORS[&#092;"SAMPLE_ERR_CODE\"] = \"This is an error message.\";
  69. $ERRORS[&#092;"SAMPLE\"] = \"This.\";
  70.  
  71. try {
  72. throw new Error_Handler('SAMPLE_ERR_CODE');}
  73. catch (Error_Handler $e){
  74. $e->alert();}
  75.  
  76.  
  77. ?>

metoda function load_errors() nie widzi tablicy $ERRORS i nie może wczytać sobie komunikatu. Jeżeli normlanie plik dołączony dam jako
  1. <?php
  2.  
  3. require_once $plik.php
  4.  
  5. ?>

To wszystko działa jak powinno. Stąd moje pytanie czy __autoload() chodź ma np. w manualu w swoim ciele require* to dołancza tylko interfejsy klas czy poprostu tylko je zwraca bo jeżeli dam tak :
  1. <?php
  2.  
  3. function __autoload($klasa)
  4. {
  5. require_once $plik . '.php';
  6. // i teraz 
  7. echo $ERRORS['cosTam'];
  8. }
  9. echo $ERRORS['cosTam']; // tu już nie widzi.
  10.  
  11. ?>

to widzi zmienną z tablicy.
dr_bonzo
__autoload() jesli ma require* to TYLKO dolacza ten plik.

  1. <?php
  2. private function load_errors()
  3. {
  4.  
  5. global $ERRORS;
  6. ?>

Zamiast czegos takiego zrob:
  1. <?php
  2. private function load_errors( $arrMessages )
  3. {
  4.  
  5. (...)
  6.  
  7. $obj->load_errors( $ERRORS );
  8.  
  9. ?>

Uniezaleznia to klase od danych zewnetrznych, mozna ja bedzie wykorzystac w innym kodzie bez jej przerabiania (inaczej musialbys pilnowac zeby istniala w odpowiednim momencie tablica $ERRORS).
FiDO
Przenosze na PHP5.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.