Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> unserialize na obiekcie wewnatrz jego metody?how
php1983
post 5.08.2008, 14:45:32
Post #1





Grupa: Zarejestrowani
Postów: 19
Pomógł: 1
Dołączył: 3.08.2008
Skąd: Radom

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


Czy można uzyskać dostęp do całej klasy, wewnątrz jej własnej metody? Chciałbym wczytać klase obsługującą sesje, wydaje mi się, że najpierw wołam session_start(), później wczytuje? Czy taka klasa może się sama załadować i zastąpić, tą zachowaną w sesji? $this=unserialize($class) nie działa.


jaśniej się nie wyraźę, to max moich zdolności lexykalnych tongue.gif

Może kod:

  1. <?php
  2. class o_Csesion{
  3. public $counter;
  4.  
  5. function __construct(){
  6. $this->counter=0;
  7. }
  8. public function start(){
  9. }
  10. public function end(){
  11. }
  12. function save(){
  13. $_SESSION['o_Csesion']=serialize($this);
  14. }
  15. function restore(){
  16. if(isset($_SESSION['o_Csesion'])){
  17. $temp=unserialize($_SESSION['o_Csesion']);
  18. $this->counter=$temp->counter;
  19. //MERITUM
  20. //a jakby sie dało tak:
  21. //$this=unserialize($_SESSION['o_Csesion']);
  22. //
  23. //ale sie nie da?
  24. //
  25.  
  26. }
  27. echo &#092;"<a href=index.php>wywolano start tej sessji: \".++$this->counter
  28. .&#092;" razy.\";
  29. }
  30. }
  31. ?>


Dzięki!

Edit (05-08-2008):

Wygrzebałem odpowiedź do tego problemu, wiec odpisuje na swojego posta w celu info. Domyślam się dlaczego nikt mi ni odpisał. Pewnie jest wielu sfrustrowanych, bo musieli przepisać lub poprawić skrypty napisane na php4:

W php5 $this już nie jest "mutable". Nie można go do niego przypisać innego obiektu tej samej klasy. Wogóle, że dało się w php4, to był przypadek, bo nigdy celowo nie zaimplementowano takiego przypisania i nie zostało ono udokumentowane. Podkreśla to bug-eliminator na stronie: http://bugs.php.net/bug.php?id=27659 .

Dowcipy w kontekscie:

Cytat
This works in php 4. Perhaps this is a feature change but
I could not find a reference to any alternatives so I am
submitting a bug just in case.


...to ze strony bug-reprot...

Cytat
There is a _LOT_ of code out there using that. Metabase
among others. Is there an alternative? This could be a
huge problem if there is none.

...

How Silly. We used $this for just about every result set in a db query.
We have like a hundred applications. I just ran a sript on our whole
htdocs directory and changed them all to $result.


... a njfajniejsze:

Cytat
Actually this is expected behavior. We explicitly decided to have $this
being readonly because of interna problems with the new engine.


...to akurat od szefa wszyskich szewow.


Przykładowe workaround'y:

Oto potencjalne rozwiązanie. Tam gdzie chcesz przypisać coś do $this, zrób tak:

  1. <?php
  2. $this->Object = new Whatever();
  3. ?>


Albo, odserializowując dane sessji:

  1. <?php
  2. $this->Session = unserialize($data);
  3. ?>


Teraz jest wybór: raz - oddelegowanie każdej metody, która musi zostać oddelegowana.
Więc, $this przydałaby się metoda dla każdej metody w $Object. Każda z metod mogłaby
przypominać coś jak to:

  1. <?php
  2. function nameOfFunction()
  3. {
  4.  return $this->Object->nameOfFunction();
  5. }
  6. ?>



Jeden workarołnd jest w pierwszym poście, ale można go jeszcze ulepszyć:

  1. <?php
  2. $this = $foo;
  3.  
  4. will something like this:
  5.  
  6. foreach (get_object_vars($foo) as $key => $value)
  7. $this->$key = $value;
  8. ?>


Jeszcze jest coś z użyciem __set(), __get(), __call()...

Jeśli ktoś na jakie lepsze obejście to proszę, temat otwarty.

Jeszcze jak to sie robi w osCommerce:
http://kb.siteground.com/article/oscommerc...ssign_this.html

  1. <?php
  2. osCommerce 2.2-MS2 gets same error when open admin folder. Error in file
  3. includes/classes/upload.php. 
  4. On Windows/IIS5/ISAPI.
  5.  
  6. Resolwed by commenting:
  7. // self destruct
  8. // $this = null;
  9.  
  10. Worked at PHP4
  11.  
  12. Good Luck!
  13. ?>
</a href=index.php>

Ten post edytował php1983 5.08.2008, 14:47:25


--------------------
Anti-loyal: xp; ubuntu; c++; asm; php 5.2; mysql 5.1; apache 2.2; vs '08 con vs.php; Zend S.
Go to the top of the page
+Quote Post
Sedziwoj
post 5.08.2008, 15:54:21
Post #2





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


@php1983
Wydaje mi się że coś po prostu kombinujesz, w Java nie ma takiego czegoś a żyją.
Powiedz co tak na prawdę chcesz osiągnąć, bo widzę tą klasę niby do obsługi sesji, ale nie widzę potrzeby takiej serializacji.
Do tego:
Cytat
When serializing objects, PHP will attempt to call the member function __sleep prior to serialization. This is to allow the object to do any last minute clean-up, etc. prior to being serialized. Likewise, when the object is restored using unserialize() the __wakeup member function is called.

Moim zdaniem powinieneś zapisywać tylko dane, do tego te dane nie powinny stanowić części tego obiektu.

Tak na prawdę większość problemów z "niemożliwością" jest problemami z planowaniem jak ma to funkcjonować.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
php1983
post 5.08.2008, 22:25:02
Post #3





Grupa: Zarejestrowani
Postów: 19
Pomógł: 1
Dołączył: 3.08.2008
Skąd: Radom

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


Mam nadzieje, że można tu po angielsku, bo nie chciało mi się wszystkiego tłumaczyć. Próbowałem postawić propela, nie spałem całą noc, ale to chyba nie na ten temat. Dzięki za fragment manuala, rozumiem, że niedouczony jestem. tongue.gif
aaevil.gif

Chce, żeby ta klasa od sesji, zchowywała wszystkie potrzebne klasy, było by dobrze, żeby iamogła zapamiętać w sesjii swoje własne ustawienia, a nie chce pisać jeszcze jednej klasy do obsługi klasy obsługującej sesje.

wstydnis.gif


--------------------
Anti-loyal: xp; ubuntu; c++; asm; php 5.2; mysql 5.1; apache 2.2; vs '08 con vs.php; Zend S.
Go to the top of the page
+Quote Post
Sedziwoj
post 5.08.2008, 22:35:03
Post #4





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


A próbowałeś wykorzystać session_set_save_handler()?


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
php1983
post 6.08.2008, 05:18:41
Post #5





Grupa: Zarejestrowani
Postów: 19
Pomógł: 1
Dołączył: 3.08.2008
Skąd: Radom

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


Tak, tylko w innym niż ten celu. A czymożna zarejestrować funkcje obsługi sesji, które są metodami klasy do obsługi sesji?


--------------------
Anti-loyal: xp; ubuntu; c++; asm; php 5.2; mysql 5.1; apache 2.2; vs '08 con vs.php; Zend S.
Go to the top of the page
+Quote Post
Sedziwoj
post 6.08.2008, 08:49:40
Post #6





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


Jak zawsze jak czegoś szukam znów w manual'u to nie znajduję:]
A zamiast nazwy funkcji przekazujesz
  1. <?php
  2. array( $object, $method_name )
  3. ?>


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
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: 25.04.2024 - 09:22