Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> rzutowanie typów, jak dokonać rzutowanie typu na na inny niż standardowy 'object'
sticker
post
Post #1





Grupa: Zarejestrowani
Postów: 611
Pomógł: 19
Dołączył: 28.02.2005
Skąd: Wrocław

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


przykjładowe klasy

  1. <?php
  2. class user implements IData2Xml{
  3.  private $x;
  4.  public getXml(){
  5.  //tu sie kowertują dane do xmla
  6. }
  7. }
  8.  
  9. class news implements IData2Xml{
  10. public $costam;
  11. public $author; // autor w tym przypadku to objekt typu user
  12. public setAuthor($param){
  13.  $this->author = $param;
  14. }
  15.  public getXml(){
  16.  // xml z tej klasy plus
  17. /*linia o numerze x */ $xml = $doc->importNode($this->author->getXML()); 
  18. }
  19.  
  20. }
  21. ?>


Problem jest taki ( w linii o numerze x ) że w klasie news nie można wywołać metody getXml bo parser nie wie czym jest author i do tego mówi że nie jest obiektem co już jest komplentą bzdurą smile.gif
Skoro nie wie to probuje to rzutować ale na co? na obiekt typu news sie nie da, na interfejs IData2XML również. W innnych obiektowych językach mógłym nawet pokusić sie o obejście problemu poprzez zmiane nazwy metody na toString i jej przeciążaniu, ale klasa w php w domyśle nie dziedziczy po typie object wiec z intefejsu object też tego nie wyłuskam. Nie mam pojęcia jak sobie z tym poradzić a google mówi żeby coś serializować i odserializować ale ja nie wiem jak to obejść tym sposobem
Poda ktoś pomocną dłoń?


--------------------
Go to the top of the page
+Quote Post
LBO
post
Post #2





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


A czy w jakiś sposób ustawiasz $author? W konstruktorze? Ręcznie wywołujesz?
Bo jeżeli nie, to się nie dziw, gdyż zmienna ta jest niezainicjowana.
Go to the top of the page
+Quote Post
sticker
post
Post #3





Grupa: Zarejestrowani
Postów: 611
Pomógł: 19
Dołączył: 28.02.2005
Skąd: Wrocław

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


Cytat(LBO @ 18.04.2007, 15:29:52 ) *
A czy w jakiś sposób ustawiasz $author? W konstruktorze? Ręcznie wywołujesz?
Bo jeżeli nie, to się nie dziw, gdyż zmienna ta jest niezainicjowana.


  1. <?php
  2. $u = new user();
  3. $u->setX('cos');
  4. $n = new news();
  5. $n->setAuthor($u);
  6. ?>


normalne gety i sety po kolei wszystko Wszystko zainicjowane a komunikat mniej wiecej taki
call to a member function getXml() on a non-object

chyba znalazłem odpowiedź i to w manualu ale było to głęboko zakopane smile.gif

  1. <?php
  2. function typecast($old_object, $new_classname) {
  3. if(class_exists($new_classname)) {
  4. $old_serialized_object = serialize($old_object);
  5. $new_serialized_object = 'O:' . strlen($new_classname) . ':"' . $new_classname . '":' .
  6.  substr($old_serialized_object, $old_serialized_object[2] + 7);
  7. return unserialize($new_serialized_object);
  8. }
  9. else
  10. return false;
  11. }
  12. ?>


Może sie komuś przyda więc wklejam... i duzy minus dla php5 że nie robi tego w prosty sposób sad.gif

Niestety rzutowanie działa jak funkcja random raz widzi obiekty a raz zgłasza błąd PHP5 i obiektowość to mit i można go sobie między bajki włożyć ..!


--------------------
Go to the top of the page
+Quote Post
Łukasz O.
post
Post #4





Grupa: Zarejestrowani
Postów: 191
Pomógł: 5
Dołączył: 13.01.2007

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


drobne modyfikacje (dopisałem brakujące metody)
  1. <?php
  2. class user{
  3. private $x;
  4. public function setX($co){
  5. $this->x=$co;
  6. }
  7. public function getXml(){
  8. print 'getX: '.$this->x.'<br/>';
  9. }
  10. }
  11.  
  12. class news{
  13. public $costam;
  14. public $author;
  15. public function setAuthor(user $param){
  16. $this->author=$param;
  17. }
  18. public function getXml(){
  19. $this->author->getXml();
  20. }
  21. }
  22. $u = new user();
  23. $u->setX('cos');
  24. $n = new news();
  25. $n->setAuthor($u);
  26. $n->getXml();
  27. ?>

wszystko działa jak należy - a u Ciebie jak dobrze widzę jest literówka - w klasie user masz metodę "getXml" a odwołujesz się do niej przez "getXML"

poza tym jak chcesz mieć autora typu "user" to daj w konstruktorze funkcji setAuthor(user $param)


--------------------
"Don't tell me you want a bridge - show me the canyon you want to cross" Giuseppe Delena
Go to the top of the page
+Quote Post
menic
post
Post #5





Grupa: Zarejestrowani
Postów: 493
Pomógł: 0
Dołączył: 14.06.2003
Skąd: Tomaszów Lubelski/Rzeszów

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


Cytat(Łukasz O. @ 19.04.2007, 13:50:43 ) *
wszystko działa jak należy - a u Ciebie jak dobrze widzę jest literówka - w klasie user masz metodę "getXml" a odwołujesz się do niej przez "getXML"
wielkosc liter przy nazwach metod nie ma znaczenia...


--------------------
Jak masz cos zrobic dobrze...
...To musisz zrobić to sam.

Uchwycić moment...
Go to the top of the page
+Quote Post
Łukasz O.
post
Post #6





Grupa: Zarejestrowani
Postów: 191
Pomógł: 5
Dołączył: 13.01.2007

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


ups - zagalopowałem się - co nie zmienia faktu, że nigdy nie spotkałem się z "losowością" rzutowania typów


--------------------
"Don't tell me you want a bridge - show me the canyon you want to cross" Giuseppe Delena
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 - 12:53