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ą (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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)
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...
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
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 10:24