[PHP]polymorfisme werkt niet :?

Pagina: 1
Acties:

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Ik heb modules.
Per module heb je 0 tot meerdere rows.
Deze row bestaat uit 2 dingen, de linkertext, en aan de rechterkant een checkbox, of een textfield, of een textarea, of een text, of een selectboxje, of noem maar op.
code:
1
$modules->addRow("Dit is l33t",new checkbox("blaat","value"));

Deze plaatst een row in de huidige module.

Verder heb ik nog deze classes:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class rightObject
{
     function getHTML()
     {
        // doet standaard niks
          echo "hmmm";
        return "";
     }
}

class checkbox 
{ 
    function checkbox($name,$extratext)
    {
        echo "doh";
        $this->name=$name;
        $this->extratext=$extratext;
    }

     function getHTML() 
     { 
         echo "woepie!";
        return "<input type='checkbox' name='$this->name' class='form'/> <i>$this->extratext</i>"; 
     }
}

Zo heb ik voor elke output type een aparte class.

En de code die alles op z'n plaats gaat zetten is:
code:
1
2
3
4
5
6
7
8
    function addRow($text,$rightObject=NULL)
    {
        array_print($rightObject);
        $id=count($this->moduleList);
        $step=count($this->moduleList[$id]->step);
        $rows=count($this->moduleList[$id]->step[$step]->rows);
        $this->moduleList[$id]->step[$step]->rows[$rows]=array($text,$rightObject->getHTML());  
    }

Deze zit in de modules class.
De output hiervan is:
doh
checkbox Object
(
[name] => blaat
[extratext] => value
)
woepie!
Fatal error: Call to a member function on a non-object in c:\apache\htdocs\all\admin\functions.inc.php on line 45
Die foutmelding is de laatste regel, dus die getHTML();
Hij maakt dus idd de class aan, en ik kan 'm ook array_printen in die methode. Maar probeer ik de methode $checkbox->getHTML uit te voeren, dan gaat het fout :?

Ziet iemand wat er fout gaat :?

Verwijderd

Ik ben niet gruwelijk thuis in PHP, maar moet je bij deze declaratie:
code:
1
2
3
4
5
checkbox Object
(
[name] => blaat
[extratext] => value
)

niet opgeven tot welke class dat object behoort?

//edit
daarnaast: je definieert nu wel functies in die class, maar geen properties.. als je dit doet:
code:
1
2
3
4
5
6
7
8
9
10
11
class checkbox 
{  var
     $name
     $extratext

     function getHTML() 
     { 
         echo "woepie!";
        return "<input type='checkbox' name='$this->name' class='form'/> <i>$this->extratext</i>"; 
     }
}

ofzoiets, zal het al beter gaan denk ik (ben delphi programmeur, geen php wizzard). Check www.php.net even voor de oo manual, daar staat e.e.a. duidelijker uitgelegd.
http://www.php.net/manual/en/

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op woensdag 03 juli 2002 10:17 schreef hezik het volgende:
Ik ben niet gruwelijk thuis in PHP, maar moet je bij deze declaratie:
code:
1
2
3
4
5
checkbox Object
(
[name] => blaat
[extratext] => value
)

niet opgeven tot welke class dat object behoort?
nee, want dit is output, het resultaat van de array_print. Hij kent de class dus wel.
//edit
daarnaast: je definieert nu wel functies in die class, maar geen properties.. als je dit doet:
code:
1
2
3
4
5
6
7
8
9
10
11
class checkbox 
{  var
     $name
     $extratext

     function getHTML() 
     { 
         echo "woepie!";
        return "<input type='checkbox' name='$this->name' class='form'/> <i>$this->extratext</i>"; 
     }
}

ofzoiets, zal het al beter gaan denk ik (ben delphi programmeur, geen php wizzard). Check www.php.net even voor de oo manual, daar staat e.e.a. duidelijker uitgelegd.
http://www.php.net/manual/en/
Hallo, ik slaap met de manual ;) En dit staat er dus echt niet in. En dat ik ze niet heb gedefinieerd is idd brak ;) maar het werkt wel, blijkt uit de array_print.

Verwijderd

Hmm, dit zou volgens mij gewoon moeten werken :?

Terug gebracht komt het hier op neer:
code:
1
2
3
function eenfunctie($obj) {
   echo $obj->getHTML();
}

Die je aanroept met:
code:
1
eenfunctie(new checkbox("blaat", "tekst"));

Daar lijkt mij niks mis mee. Is het niet een bug in PHP? Heb je het al in de Zend 2 alpha geprobeerd? Werkt het in zo'n versimpelde versie wel?

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op woensdag 03 juli 2002 10:46 schreef Zef het volgende:
Hmm, dit zou volgens mij gewoon moeten werken :?

Terug gebracht komt het hier op neer:
code:
1
2
3
function eenfunctie($obj) {
   echo $obj->getHTML();
}

Die je aanroept met:
code:
1
eenfunctie(new checkbox("blaat", "tekst"));

Daar lijkt mij niks mis mee. Is het niet een bug in PHP? Heb je het al in de Zend 2 alpha geprobeerd? Werkt het in zo'n versimpelde versie wel?
ja, daar komt het op neer. En het vreemde is nog wel dat ik wel print_r($obj); kan doen.
Mwah, zend2 installeren omdat een stukje code nog niet werkt lijkt me een beetje overkill ;)

Verwijderd

Random dom idee: Pass het object eens als reference :? Je weet het nooit met PHP ;)

edit: Ik zal eens het een en ander gaan testen.

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op woensdag 03 juli 2002 10:57 schreef Zef het volgende:
Random dom idee: Pass het object eens als reference :? Je weet het nooit met PHP ;)
wat denk je dat het 1e was dat ik heb geprobeerd? ;)

Verwijderd

Ik heb je code wat verandert (of verbetert) en dit werkt gewoon:
PHP:
1
<?class RightObject{     function getHTML()     {          // doet standaard niks              echo "hmmm";          return "";     }}class CheckBox  extends RightObject{       function CheckBox($name,$extratext)      {            $this->name=$name;            $this->extratext=$extratext;      }     function getHTML()      {           return "<input type='checkbox' name='$this->name' class='form'/> <i>$this->extratext</i>";      }}function eenfunctie($obj) {   echo $obj->getHTML();}eenfunctie(new CheckBox("blaat", "tekst"))?>

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

wat je nu veranderd hebt is dus dat een checkbox een rightobject extend, en dat eenfunctie () geen member is van een andere klasse?

imho is de hele klasse rightObject nutteloos, aangezien je niet kunt aangeven dat de rechter parameter van eenfunctie () een instantie moet zijn van rightObject. Die var kan dus vanalles zijn, als het maar een getHTML () methode heeft, en hoeft het dus niet per se een subklasse van rightObject te zijn :)

dus het enige echte 'verschil' lijkt me hier dat eenfunctie () geen memberfunctie is van een klasse maar een losstaande functie. Wat als je eenfunctie () nou onderbrengt in een klasse?

.edit: nope, dit werkt ook gewoon
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class CheckBox
{
    function CheckBox ($name,$extratext)
    {
        $this->name=$name;
        $this->extratext=$extratext;
    }
    
    function getHTML()
    {
        return "<insert random html zooi>";
    }
}

class Blaat
{
    function eenfunctie ($obj)
    {
        echo $obj->getHTML ();
    }
}

$blaat = new Blaat;

$blaat->eenfunctie (new CheckBox("blaat", "tekst"));

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Het was een heel ander probleem dat verder niks met de code te maken had die hij hier gaf.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

aargh |:(

ik ben zo vrij geweest je code die je gisteren stuurde over icq eens te testen, en de fout zit natuurlijk helemaal niet bij de checkbox, maar bij het geval als je juist geen checkbox meestuurd

$rightObject is dan NULL, en NULL heeft geen methode getHTML () :)

wat je moet doen is of controleren of $rightObject NULL is, of $rightObject niet naar NULL laten wijzen maar naar een lege RightObject:
code:
1
function addRow($text,$rightObject=new rightObject ())

(de eerste manier lijkt me beter)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Yep, dat sucked behoorlijk, dat ik (we) daar uren naar hebben zitten kijken :( )

Verwijderd

Goed bezig heren *D ;)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

prutser! :P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Op woensdag 03 juli 2002 16:28 schreef .oisyn het volgende:
prutser! :P
Talking to me? Ik ben wel de man die het probleem dus in een paar minuten oploste hè >:) Lite-mod my ass :P ;)

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
:'( ;)

Verwijderd

naar mijn weten is 't met Zend Engine 1 onmogelijk (met 2 wel mogelijk) om objecten als resultaat van een functie in 't zelfde statement direct te gebruiken

dus:

$obj->func()->func()->variabele = ..

zal niet werken (maar met Zend 2 dus wel)

Zef:
$this->moduleList[$id]->step[$step]->rows[$rows]=array($text,$rightObject->getHTML());

Verwijderd

Gebruikt hij ook niet, dus dat is sowieso niet het probleem :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op woensdag 03 juli 2002 16:30 schreef Zef het volgende:

[..]

Talking to me? Ik ben wel de man die het probleem dus in een paar minuten oploste hè >:) Lite-mod my ass :P ;)
nee ik had het tegen nielsz...
maar ik wil het ook wel tegen jou zeggen hoor, als je dat zo graag wilt ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Op woensdag 03 juli 2002 16:35 schreef abraxas het volgende:

Zef:
[..]
En wijs mij dan eens de functie aanroep aan?
Op woensdag 03 juli 2002 16:46 schreef .oisyn het volgende:
[..]
nee ik had het tegen nielsz...
maar ik wil het ook wel tegen jou zeggen hoor, als je dat zo graag wilt ;)
Neuh, je hoeft je belachelijk te maken hoor ;)

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
zeg, kap nou eens met mij belachelijk maken :D

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

en probeer ff ontopic te gaan ;)
nielsz belachelijk maken is veel te makkelijk :+

Doet iets met Cloud (MS/IBM)

Pagina: 1