Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zablokowanie dostępu do klasy na jakiś czas, lub blok dostępu do klasy 1, klasie 2
tuner
post 19.05.2005, 15:10:50
Post #1





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 10.12.2004

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


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ć?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
hwao
post 19.05.2005, 15:22:04
Post #2


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




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;)
Go to the top of the page
+Quote Post
matid
post 19.05.2005, 17:55:38
Post #3





Grupa: Zarejestrowani
Postów: 362
Pomógł: 0
Dołączył: 18.02.2004
Skąd: Knurów

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


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.

Ten post edytował matid 19.05.2005, 18:01:42
Go to the top of the page
+Quote Post
tuner
post 19.05.2005, 20:55:50
Post #4





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 10.12.2004

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


Obiekt klasy "engine" utworzony przez singleton już istnieje. Chciałbym zablokować jakiejś klasie modyfikowanie danych tego obiektu ("engine"), korzystania z metod itp.
Go to the top of the page
+Quote Post
matid
post 19.05.2005, 21:04:51
Post #5





Grupa: Zarejestrowani
Postów: 362
Pomógł: 0
Dołączył: 18.02.2004
Skąd: Knurów

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


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ę.

Ten post edytował matid 19.05.2005, 21:06:42
Go to the top of the page
+Quote Post
tuner
post 20.05.2005, 08:07:36
Post #6





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 10.12.2004

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


Tez myslalem o takim sposobie, ale bylby niewygodny.
Go to the top of the page
+Quote Post
hawk
post 20.05.2005, 08:29:01
Post #7





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

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


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.
Go to the top of the page
+Quote Post
tuner
post 21.05.2005, 12:58:43
Post #8





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 10.12.2004

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


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.
Go to the top of the page
+Quote Post
dr_bonzo
post 21.05.2005, 13:54:36
Post #9





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


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.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
tuner
post 21.05.2005, 14:37:46
Post #10





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 10.12.2004

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


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.
Go to the top of the page
+Quote Post
dr_bonzo
post 21.05.2005, 16:05:08
Post #11





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


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"...


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
tuner
post 21.05.2005, 17:39:55
Post #12





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 10.12.2004

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


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.
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 Wersja Lo-Fi Aktualny czas: 24.07.2025 - 20:03