Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> klasa abstrakcyjna - wymuszenie składowej, kilka prolemów
Apo
post
Post #1





Grupa: Zarejestrowani
Postów: 426
Pomógł: 1
Dołączył: 2.10.2005

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


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 1)
mariuszn3
post
Post #2





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

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


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

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

 



RSS Aktualny czas: 19.08.2025 - 07:00