Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: rzutowanie typów
Forum PHP.pl > Forum > PHP > Object-oriented programming
sticker
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ń?
LBO
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.
sticker
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ć ..!
Łukasz O.
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)
menic
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...
Łukasz O.
ups - zagalopowałem się - co nie zmienia faktu, że nigdy nie spotkałem się z "losowością" rzutowania typów
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.