Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: klasa abstrakcyjna - wymuszenie składowej, kilka prolemów
Forum PHP.pl > Forum > PHP > Object-oriented programming
Apo
Witam
Mam 3 klasy.
1. Dispather który dołącza plik z odpowiednią klasą na podstawie urla przekazanego przez router i wywołuje obiekt.
2. ActionController klasa abstrakcyjna która jest szablonem dla akcji
3. viewAction przykładowa klasa akcji

1 Problem dotyczy wymuszenia zadeklarowanej składowej w klasie abstrakcyjnej:

  1. <?php
  2.  
  3. abstract class ActionController {
  4.  
  5. private $privileges = array(); // ta skladowa musi byc zadeklarowana w każdej klasie dziedziczącej, próbowałem ro
    bić: abstract private $privileges = array(); ale wyskakuje tylko błąd
  6.  
  7. /*
  8. * Check access to action
  9. *
  10. */
  11. final public function _renderAccess()
  12. {
  13. if(in_array('admin', $this->privileges))
  14. echo 'Private';
  15. else
  16. echo 'Public';
  17. }
  18.  
  19. }
  20. ?>


Następnie mam problem z wywołaniem metody _renderAccess w taki sposób:

  1. <?php
  2.  
  3. class Dispather {
  4.  
  5. private $_action, $_controller;
  6. /**
  7. *
  8. *
  9. */
  10. public function isDispathable($controller, $action, $parameters)
  11. {
  12. $this->_controller = $this->controllerFormat($controller);
  13. $this->_action = $this->actionFormat($action); 
  14. $_directory = MODULE_DIR . $this->_controller . '/' . $this->_action . '.php';
  15.  
  16. if(is_null($this->_controller))
  17. throw new AposException("Controller directory never set.");
  18.  
  19. if(!is_readable($_directory))
  20. throw new AposException('Controller "'.$this->_controller.'" not found');
  21.  
  22. require_once($_directory);
  23.  
  24. $_action = new $this->_action . '()';
  25. $_action->_renderAccess(); // w taki sposób ta metoda wogle sie niechce wywołać
  26. }
  27.  
  28. }
  29. ?>



Klasa akcji
  1. <?php
  2.  
  3. require_once(APOS_DIR . 'framework/controller/ActionController.php');
  4.  
  5. class viewAction extends ActionController {
  6.  
  7. private $privileges = array('admin'); // tej składowej i tak nie zobaczy metoda _renderAccess i zwróci 'Public' nie wiem dlaczego
  8.  
  9. public function __construct()
  10. {
  11. echo 'newsConstruct';
  12. $this->_renderAccess(); // dopiero w taki sposób wykona sie ta metoda
  13. }
  14.  
  15. }
  16.  
  17. ?>



Z góry błogosławieństwo za pomoc smile.gif

Pozdrawiam Apo
mariuszn3
Chodzi o to, że zarówno w klasie ActionController jak i w klasie viewAction zadeklarowałeś $privileges jako parametry prywatne.. tak więc są to zupełnie dwa różne parametry.. ten w ActionController jest widoczny tylko przy wywołaniach w ActionControlller a ten w viewAction jest widoczny tylko przy wywołaniach w viewAction.
W obydwu klasach zamień private na protected wtedy w obydwu przypadkach będzie chodziło o ten sam parametr.
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-2024 Invision Power Services, Inc.