[PHP/OOP] ik zie rare dingen

Pagina: 1
Acties:

  • GiLuX
  • Registratie: Juni 1999
  • Laatst online: 12-11-2025
let op het volgende:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class firstClass{

   var $val="";
   var $aClass="";

    function set_val($val_){
        $this->val=$val_;
    }

    function get_val(){
        return $this->val;
    }

    function set_className($val_){
        $this->aClass=$val_;
    }

    function get_className(){
        return $this->aClass;
    }

   function firstClass(){
    //leeg
   }

   function someFunction(){
    $tmp=$this->get_className();  
    $nC = new $tmp;
    $nC->third($this->val);
   }
}


class seccondClass extends firstClass{
    function seccond(){
        $this->someFunction();
    }
}


class thirdClass extends firstClass{
    function third($val_){
        echo $val_;
    }
}

$bla= new seccondClass();
$bla->set_val("hello universe");
$bla->set_className("thirdClass");
$bla->seccond();

bovenstaande werkt al zie je duidelijk staan dat:
$bla->set_className("thirdClass"); haakjes mist,
je zou denken dat je:
$bla->set_className("thirdClass()");
zou moeten neerzetten om dit te laten werken,
sterker nog, als je die haakjes wel neerzet krijg je een":
Fatal error: Cannot instantiate non-existent class: thirdclass()

wat ik ook raar vindt is dat ik uberhaubt die $tmp oplossing moet gebruiken omdat dit ook niet werkt:

$nC = new $this->get_className();

het kan ook heel goed zijn dat ik al te lang zit te staren en dingen over het hoofd zie,
afgezien van het feit dat bovenstaande code verre van logisch inelkaar steekt op het eerste gezicht ;)

"I disagree with what you are saying, but I will defend to the death your right to say it." -- not clear who


Verwijderd

Bij mij geeft ie geen foutmelding en drukt 'ie de tekst af 'hello universe' :?
Wat probeer je eigenlijk te doen met deze constructie?
Ikka nie begrijp...

  • spine
  • Registratie: Juni 2001
  • Niet online

spine

VISHUDDHI

wat is dit voor vage class constructie?

//edit
ow jippie ik was niet de eerste :)

[BSDFreaks.nl] [www.Dark-Future.org] [Alizarin.nl]


  • GiLuX
  • Registratie: Juni 1999
  • Laatst online: 12-11-2025
nee,
geeft geen fout melding,
maar zet nu eens:

$bla->set_className("thirdClass()");

neer ipv:

$bla->set_className("thirdClass");

mijn punt is dat het toch werkt al roep je die thirdClass aan als var en niet als functie.

"I disagree with what you are saying, but I will defend to the death your right to say it." -- not clear who


  • GiLuX
  • Registratie: Juni 1999
  • Laatst online: 12-11-2025
ja vaag,
ik weet,
ben aan het uitzoeken hoe php met OOP omgaat.

"I disagree with what you are saying, but I will defend to the death your right to say it." -- not clear who


  • spine
  • Registratie: Juni 2001
  • Niet online

spine

VISHUDDHI

Op dinsdag 13 november 2001 00:18 schreef GiLuX het volgende:
nee,
geeft geen fout melding,
maar zet nu eens:

$bla->set_className("thirdClass()");

neer ipv:

$bla->set_className("thirdClass");

mijn punt is dat het toch werkt al roep je die thirdClass aan als var en niet als functie.
ik zie de fout niet......
$bla->set_className("thirdClass");
klopt toch?

[BSDFreaks.nl] [www.Dark-Future.org] [Alizarin.nl]


Verwijderd

Dit is inderdaad vaag, dit is één van de vage problemen die me al vaker is opgevallen met PHP wanneer bepaalde strings worden meegegeven aan een keyword ("new" in dit geval).

To the point, als je "thirdClass()" meegeeft aan set_className($val_) dan werkt dit sowieso niet want je krijgt dan in principe een
code:
1
new thirdClass()

Met andere woorden, hij probeert meteen de niet-bestaande functie thirdClass() in thirdClass uit te voeren.
Dus die eerst maar eens maken.
Dan zal je zien dat ie het nog niet doet :'(
Daar is dus het vage probleem waar ik het net over had.
Hiervoor heb ik een workaroundje gemaakt:
ipv:
code:
1
2
3
  $tmp=$this->get_className();  
  $nC = new $tmp;
  $nC->third($this->val);

dit doen:
code:
1
2
3
  $tmp=$this->get_className();  
  $teststrg="new ".$tmp.';';
  eval($teststrg);

De teststrg is dan "new thirdClass();"
Zoals je misschien al weet, executeert eval() z'n argument.

Zo ziet 'ie er nu uit bij moi:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
class firstClass{
   var $val="";
   var $aClass="";

    function set_val($val_){
        $this->val=$val_;
    }

    function get_val(){
        return $this->val;
    }

    function set_className($val_){
        $this->aClass=$val_;
    }

    function get_className(){
        return $this->aClass;
    }

   function firstClass(){
    //leeg
   }

   function someFunction(){
        $tmp=$this->get_className();  
           $teststrg="new ".$tmp.';';
        eval($teststrg);
        #     $nC = new ${$this->get_className()};
        #     $nC->third($this->val);
   }
}


class seccondClass extends firstClass{
    function seccond(){
        $this->someFunction();
    }
}


class thirdClass extends firstClass{
    function third($val_){
        echo $val_;
    }
      function thirdClass(){
              echo 'thirdClass constructor<BR>';
      }
}

$bla= new seccondClass();
$bla->set_val("hello universe");
$bla->set_className("thirdClass");
$bla->seccond();

Tja, als final word wil ik zeggen dat OO in PHP nog in de kinderschoentjes staat.

edit: typo

  • GiLuX
  • Registratie: Juni 1999
  • Laatst online: 12-11-2025
tja mischien zit ik idd al te lang te kijken,

maarrrr,

als je een "new" doet dan roep je dus automatisch je constructor aan.

maar in dit geval wordt "$tmp" vervangen door "thirdClass".

dus:
code:
1
$nC = new thirdClass;

dit lijkt mij ongeldige code.

volgens mij is alleeen dit correcte code:
code:
1
$nC = new thirdClass();

(dus inclusief haakjes,
immers je roept de constructor aan als je een nieuwe instance aanmaakt, en de constructor is eigenlijk gewoon een functie (member...whatever je wil).

en functies moet je met haakjes aanroepen ook al geef je nix mee.

snappie nu mijn punt??

"I disagree with what you are saying, but I will defend to the death your right to say it." -- not clear who


  • GiLuX
  • Registratie: Juni 1999
  • Laatst online: 12-11-2025
Op dinsdag 13 november 2001 00:35 schreef brambo9000 het volgende:
Dit is inderdaad vaag, dit is één van de vage problemen die ....
.....Tja, als final word wil ik zeggen dat OO in PHP nog in de kinderschoentjes staat.
auw,
ja had constructor voor thirdClass vergeten :o

maar blijft wel vaag dat het werkt zonder haakjes.
vraag me af wat de hell er dan intern binnen php voor enge dingen gebeuren. :?

het schijnt allemaal een stuk beter te worden in php5.

"I disagree with what you are saying, but I will defend to the death your right to say it." -- not clear who


Verwijderd

Ikke snap, maar je had het ook stukken simpeler kunnen formuleren hoor...
Maar goed, 't is toch al laat :+

Het is krom, het is krom. Ge heeft gelijk...
Binnen PHP is het idd zo dat je de class kan instantiëren met
"new ClassName;" en "new ClassName();".
Mits de constructor geen argumenten verwacht natuurlijk kan je dus ook "new ClassName" gebruiken.
Echter, als de class geen constructor heeft werkt dus alleen maar "new ClassName";


Tja, ik denk dat het een bugje ofzow is :?
Of zit ik hier nu onzin te blaten?
Naja, it's late and me going :Z

Edit:
Hmm, kom tot ontdekking dat GoT zelfs 's nachts interressant kan zijn ende gezellig. :D

Verwijderd

Ik zie nix raars. Als een class geen constructor heeft of als de constructor geen argumenten krijgt moet je helemaal zelf weten of je
code:
1
2
3
4
5
new Class;

of

new Class();

doet.

En dat is niet vaag want dat is nou eenmaal de syntax van PHP.

  • GiLuX
  • Registratie: Juni 1999
  • Laatst online: 12-11-2025
Op dinsdag 13 november 2001 00:51 schreef fladder het volgende:
Ik zie nix raars. Als een class geen constructor heeft of als de constructor geen argumenten krijgt moet je helemaal zelf weten of je
code:
1
2
3
4
5
new Class;

of

new Class();

doet.

En dat is niet vaag want dat is nou eenmaal de syntax van PHP.
oh,
ok,
tnx :)

"I disagree with what you are saying, but I will defend to the death your right to say it." -- not clear who


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Tsja, hij probeert gewoon je variabele als functie uit te voeren...

Probeer zoiets maar:
PHP:
1
2
3
4
5
6
7
8
9
<?
function blaat()
{
  echo 'bladiebla';
}
$functie = "blaat";

$functie();
?>

Maar het zou goed kunnen, dat als je je errorreporting heel hoog zet, je een stel meldingen krijgt.

Btw, second schrijf je met 1 c ;)

  • GiLuX
  • Registratie: Juni 1999
  • Laatst online: 12-11-2025
;)
Op dinsdag 13 november 2001 01:08 schreef ACM het volgende:
...
PHP:
1
2
3
4
5
6
7
8
9
<?
function blaat()
{
  echo 'bladiebla';
}
$functie = "blaat";

$functie();
?>
eeeiiuuwww!
dat is bah!

dat gaat een beetje richting perl logica.

perl:
je typt een heleboel random code en met een beetje geluk doet het ook nog iets,
of:
je typt een heleboel duidelijke code en het doet iets heel anders.
Op dinsdag 13 november 2001 01:08 schreef ACM het volgende:
.....Btw, second schrijf je met 1 c ;)
nee hoor, dat zie je verkeerd,
ik schrijf het namelijk met 2 ccees ;)

"I disagree with what you are saying, but I will defend to the death your right to say it." -- not clear who


  • Orphix
  • Registratie: Februari 2000
  • Niet online
sidenote:
in C++ is een statement als
code:
1
SecondClass *Second = new SecondClass;

dus zonder de haakjes ook geldig, dit is dus geen bug maar een feature :Y)
Pagina: 1