Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zablokowanie dostępu do klasy na jakiś czas
Forum PHP.pl > Forum > PHP > Object-oriented programming
tuner
Chciałbym na jakiś czas zablokować dostęp do klasy "engine" lub zablokować dostęp do tej klasy, klasie "module". Nie chcę by klasa "module" czytała/modyfikowała/zapisywała dane klasy "engine". Inne klasy takie jak "template" muszą mieć do danych "engine" dostęp.

Ktoś wie jak coś takiego rozwiązać?
hwao
Wewnatrz kalsy, hmmm
Mysle ze jest pare rozwiazan smile.gif ale to zalezy od tego jak rozumiesz dostep smile.gif prawdopodbnie i tak bedzie sie dalo uzystac ale mozesz probowac tak.
+ mala edycja smile.gif
Wiec smile.gif
http://wiki.php.pl/index.php/Singleton
  1. <?php
  2. final class Singleton {
  3. private static $oInstance = null;
  4.  
  5. public static function getInstance( $class = null ) {
  6. if( is_null( self::$oInstance ) ) {
  7.  self::$oInstance = new Singleton();
  8. }
  9. if( !is_object( $class ) ) return false;
  10. if( get_class( $class ) == 'zakazana' ) return false;
  11. return self::$oInstance;
  12. }
  13.  
  14. private function __construct() {}
  15. }
  16. ?>


Mozna np tak probowac;)
matid
Chyba prędzej tak:
  1. <?php
  2. final class Singleton
  3. {
  4.  
  5. private static $oInstance = null;
  6.  
  7. private static $aForbidden = array( 'module' );
  8.  
  9. public static function getInstance()
  10. {
  11. if( is_null( self::$oInstance ) )
  12. {
  13.  self::$oInstance = new Singleton();
  14. }
  15. $aBackTrace = debug_backtrace();
  16. $sClass = isset( $aBackTrace[1]['class'] ) ? $aBackTrace[1]['class'] : NULL;
  17. if( in_array( $sClass, self::$aForbidden ) )
  18. {
  19. return false;
  20. }
  21. return self::$oInstance;
  22. }
  23.  
  24. private function __construct(){}
  25.  
  26. }
  27.  
  28. ?>


Jestem tylko ciekaw czy jest możliwość wywołania jakieś funkcji przy każdym dostępie do klasy. Coś jak __get, __set i __call, tylko musiałoby działać dla wszystkich przypadków, a nie tylko tych niezdefiniowanych.
tuner
Obiekt klasy "engine" utworzony przez singleton już istnieje. Chciałbym zablokować jakiejś klasie modyfikowanie danych tego obiektu ("engine"), korzystania z metod itp.
matid
Cytat(tuner @ 2005-05-19 21:55:50)
Obiekt klasy "engine" utworzony przez singleton już istnieje. Chciałbym zablokować jakiejś klasie modyfikowanie danych tego obiektu ("engine"), korzystania z metod itp.

No właśnie tego tyczyła 2 część mojej wypowiedzi, ale po wnikliwym myśleniu (czyt. google) stwierdzam, że najprawdopodobniej jest to niemożliwe, no chyba że na początku każdej funkcji będziesz sprawdzał, czy ma zostać wywołana czy nie i zastosujesz hermetyzację danych (czyli metody get, set, np. getName, setName, getId, setId, itp., a w nich wewnętrznie będziesz sprawdzał, czy można funkcję wywołać). Innego wyjścia nie widzę.
tuner
Tez myslalem o takim sposobie, ale bylby niewygodny.
hawk
Dobrego sposobu nie ma, i to nie tylko w php, ale w większości języków. Tobie potrzebne są aspekty, a php takowych nie ma.

Ale w php można zrobić inną rzecz: dekoratora na rzeczywistą klasę engine, który miałby tylko jedną metodę: __call i wywoływałby przezroczyście odpowiednią metodę enginu, sprawdzając uprzednio (debug_backtrace), czy klasa wywołująca ma do tego prawo. Nie jest to wydajne i eleganckie, ale jest możliwe.
tuner
Bo mam pewien problem. Klika obiektów pochodnych od klasy "module" może pracować jednocześnie (modułem jest księga gości, menu, sonda itp.). Mogą zatem każdy po kolei zmienić wygląd Theme'u, tytuł strony itd. i w takim razie to co wyświetli się na ekranie może być wielką zagadką. Chciałem wprowadzić prawa dla poszczególnych modułów - te z największymi mogły by modyfikować, te z mniejszymi nie.
dr_bonzo
Moim zdaniem kazdy modul powinien ingerowac tylko w obszar mu przeznaczony -- tzn menu -- tworzy tylko menu, nie rusza naglowka, tytulu itd, tzn. szablon menu powinien zawierac tylko menu.
tuner
Rzeczywiście moduł menu nie ingeruje w nic. Ale np. moduł infopages zmienia nazwę strony na "Strona >> Wyświetlony artykuł" jednocześnie coś tam jeszcze mogąć zmienić. I jeśli będzie kilka takich modyfikujących modułów to będzie hell.
dr_bonzo
No to niech te moduly przekazuja do jadra (lub jakiegos innego modulu odpowiedzialnego tylko za tytul) systemu swoje skladowe tytulu -- jadro utworzy z nich caly tytul: np PAGE.pl > Artykul: blabla | Wyniki ankiety "jakies pytanie"...
tuner
smile.gif Tak już zrobiłem. Chodzi mi przedewszystkim o zmiany w silniku i w theme'ie. Moduł może sobie zmienić wyświetlany szablon z 'index_usermenu.tpl' na 'index_nomenu.tpl'. A jeśli później uruchomiony moduł zmieni na 'index_costam.tpl' to ten wyświetlanie danych pierwszego modułu może szlag trafić, a wynik będzie nieprzewidywalny.
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.