[PHP] Nested class definitions

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Scyth
  • Registratie: Juli 2001
  • Laatst online: 16-03-2024

Scyth

Fat finger, three beer

Topicstarter
Ik ben nu al bijna 4 uur aan het prutsen maar ik kom er niet uit. Ik heb een php file, fetchPage.php, zonder classdev of whatever. 't doel van deze PHP file is het includen van een moederklasse, die vervolgens allemaal plugin classes in haar plugIn variabele gooit als objecten. Dát werkt al. De plugIns worden daadwerkelijk geladen, en zijn ook te benaderen vanuit elke andere plugin met de :: operator.

Echter, om de functionaliteit van de moederklasse over te erven naar de een-na-belangrijkste klasse wil ik een plugin als extend maken. Maar zodra ik 'extends boot' in de classdev van de plugin zet, crasht ALLES, en word er NUL output gegenereerd. Zelfs echo 'foobar'; werkt niet meer, ook al zet ik 'm bovenaan in fetchPage.php

Wat is er mis met de volgende code?

fetchPage.php:
PHP:
1
2
3
// echo 'foobar';     //Dit werkt dus al niet meer zodra in parser.php 'extends boot' staat.
require_once($_SERVER['DOCUMENT_ROOT'].'/_includes/_system/boot.php');
$boot = new boot; $fN = $boot->plugIns;


in combinatie met de volgende classes:

boot.php:
PHP:
1
2
3
4
5
6
7
8
9
  class boot {
    var $plugIns;

    function boot() {
      require_once($_SERVER['DOCUMENT_ROOT']."/parser.php");
      $this->plugIns['parser'] = new parser();
    }

  }

en parser.php:
PHP:
1
2
3
  // require_once($_SERVER['DOCUMENT_ROOT'].'/boot.php');
  class parser extends boot {
  }


Nogmaals, zodra ik extends boot weghaal, werkt het geheel wel weer, echter zonder de moederfunctionaliteit van boot in parser.

[ Voor 0% gewijzigd door Scyth op 03-01-2007 23:18 . Reden: typo ]

Dell Studio XPS 16
Project: BavBierSub 1.0 BavBierSub 2.0


Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
En wat krijg je als je dit even bovenaan je script toevoegt:

PHP:
1
error_reporting ( E_ALL );

March of the Eagles


Acties:
  • 0 Henk 'm!

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-08 20:35
Ik denk dat je te maken hebt met een circular reference.
Doordat parser boot extend, bevat hij dus ook de class variable plugIns deze bevat weer een reference naar parser, welke op zijn beurt weer een een variabele plugIns bevat welke een reference bevat naar parser... enz. Je komt dus nooit uit deze loop en daardoor loopt waarschijnlijk alles de soep in. Ik vind het ook maar een rare constructie om in je base class je subclass aan te maken..

If I can't fix it, it ain't broken.


Acties:
  • 0 Henk 'm!

  • Scyth
  • Registratie: Juli 2001
  • Laatst online: 16-03-2024

Scyth

Fat finger, three beer

Topicstarter
Hacku schreef op woensdag 03 januari 2007 @ 23:19:
En wat krijg je als je dit even bovenaan je script toevoegt:

PHP:
1
error_reporting ( E_ALL );
Toegevoegd aan eerst fetchPage.php: geen output.
Toegevoegd aan boot.php (eej, je weet maar nooit): ook geen output.

Het gaat fout zodra boot probeert de nieuwe instance van parser aan te maken, en die op te slaan in z'n global array $plugIns
Borizz schreef op woensdag 03 januari 2007 @ 23:22:
Ik vind het ook maar een rare constructie om in je base class je subclass aan te maken..
Neemt niet weg dat het niet onmogelijk moet zijn :)

[ Voor 21% gewijzigd door Scyth op 03-01-2007 23:27 ]

Dell Studio XPS 16
Project: BavBierSub 1.0 BavBierSub 2.0


Acties:
  • 0 Henk 'm!

  • dexonic
  • Registratie: Februari 2003
  • Laatst online: 16-12-2019

dexonic

efficient != nuttig

zet eerst eens $boot = new boot(); neer ipv new boot;

verder probeer eens wat met constructors..
zelfde code met constructors werkt hier wel..

PHP:
1
2
3
4
5
6
<?php
echo 'foobar';     //Dit werkt dus al niet meer zodra in parser.php 'extends boot' staat.
require_once('boot.php');
$boot = new boot(); 
$fN = $boot->plugIns;
?>


PHP:
1
2
3
4
5
6
7
8
9
10
11
<?php
  class boot {
    public $plugIns;

    function __construct() {
      require_once('parser.php');
      $this->plugIns['parser'] = new parser();
    }

  }
?>


PHP:
1
2
3
4
5
6
7
8
9
<?php
  
  class parser extends boot {
  
    function __construct()
    {}
    
  }
?>


krijg hier netjes foobar te zien etc...

edit typo

[ Voor 3% gewijzigd door dexonic op 03-01-2007 23:36 ]


Acties:
  • 0 Henk 'm!

  • dexonic
  • Registratie: Februari 2003
  • Laatst online: 16-12-2019

dexonic

efficient != nuttig

vb dit output dus gewoon:
foobar
2

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
  
  class parser extends boot 
  {
    public 
      $lala;
    
    function __construct ()
    {
      $this->lala = 2;
    }
    
    function getLala ()
    {
      return $this->lala;
    }
    
  }
?>


PHP:
1
2
3
4
5
6
7
8
9
10
<?php

  echo 'foobar';     //Dit werkt dus al niet meer zodra in parser.php 'extends boot' staat.
  require_once('boot.php');
  
  $boot = new boot(); 
  $fN = $boot->plugIns;
  echo "<br />" . $fN['parser']->getLala();
  
?>

Acties:
  • 0 Henk 'm!

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-08 20:35
Scyth schreef op woensdag 03 januari 2007 @ 23:25:

[...]

Neemt niet weg dat het niet onmogelijk moet zijn :)
Het is zeker mogelijk, maar op de manier zoals je het nu doet vraag je gewoon om problemen.

If I can't fix it, it ain't broken.


Acties:
  • 0 Henk 'm!

  • Scyth
  • Registratie: Juli 2001
  • Laatst online: 16-03-2024

Scyth

Fat finger, three beer

Topicstarter
dexonic schreef op woensdag 03 januari 2007 @ 23:30:
zet eerst eens $boot = new boot(); neer ipv new boot;

verder probeer eens wat met constructors..
zelfde code met constructors werkt hier wel..
Vergeten te vermelden dat het hier om een PHP4-compatible script moet gaan, __construct is een PHP5 functie. Daarentegen wordt in PHP4 wel al standaard de functie aangeroepen die dezelfde naam heeft als de class.

Ow, en in 't laatste voorbeeld dat je gaf staat duidelijk waarom ik voor deze methode kies. $fN[plugInNaam]->functie() is gewoon té handig :D

Dell Studio XPS 16
Project: BavBierSub 1.0 BavBierSub 2.0


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Borizz schreef op woensdag 03 januari 2007 @ 23:22:
Ik denk dat je te maken hebt met een circular reference.
Die zijn onmogelijk als je ieder bestand maar eenmaal mag includen zoals bij het gebruik van require_once. Overigens had PHP dan op z'n minst een foutmelding gegeven dat er meerdere objecten met dezelfde naam bestonden.

Acties:
  • 0 Henk 'm!

  • dexonic
  • Registratie: Februari 2003
  • Laatst online: 16-12-2019

dexonic

efficient != nuttig

is op zich niks mis met de code...

doe eens wat in parser dan..
laat 'm wat teruggeven zoals in mijn vb..

en test of boot goed wordt aangemaakt..
includepaths goed etc..

dit werkt btw hier gewoon:

PHP:
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
<?php

    echo "ghallo";
  $boot = new boot(); 
  $fN = $boot->plugIns;
  echo "<br />" . $fN['parser']->getLala();
    
  class boot 
  {
    var $plugIns;

    function boot()
    {
      $this->plugIns['parser'] = new parser();
    }
  }
  
  class parser extends boot 
  {
    var $lala;
    
    function parser ()
    {
      $this->lala = 2;
    }
    
    function getLala ()
    {
      return $this->lala;
    }
  }

?>

[ Voor 60% gewijzigd door dexonic op 03-01-2007 23:54 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb het even in PHP4 getest, alles lijkt gewoon goed te werken hoor...

Toon eens code die ook echt misgaat?

Overigens vind ik dit ook een hele wazige aanpak ;)

[ Voor 19% gewijzigd door Verwijderd op 03-01-2007 23:55 ]


Acties:
  • 0 Henk 'm!

  • Scyth
  • Registratie: Juli 2001
  • Laatst online: 16-03-2024

Scyth

Fat finger, three beer

Topicstarter
Verwijderd schreef op woensdag 03 januari 2007 @ 23:55:
Toon eens code die ook echt misgaat?
Dat zijn echt lappen code, mijn voorbeelden hiervoor zijn stukjes die relevant zijn in mijn ogen voor 't probleem. Maar als die oplossing die net gegeven is wél werkt op PHP4, en die van mij niet, blijkt het probleem dus ergens anders te zitten. Ik ga even stap voor stap dingen toevoegen en kijken waar het dan wel mis gaat.

[update]
Naar aanleiding van de eerste post van dexonic en z'n laatste post kwam ik er dus achter dan een class die poogt een andere class te 'extenden', een constructor moet hebben, dwz; een functie met dezelfde naam als de class zelf. Deze kan overigens gewoon leeg blijven, hij moet alleen aan te roepen zijn dunkt me. Vaag probleem, maar met een simpel
PHP:
1
function parser(){}

in de source van parser.php werkt 't geheel gewoon weer naar behoren, echter met wat extra functionaliteit van boot.php.

Hartelijk dank iedereen! _/-\o_

Excuse me while( ik even ga uitzoeken waarom ik dit ookal precies weer wou; ){}.

[ Voor 40% gewijzigd door Scyth op 04-01-2007 00:15 ]

Dell Studio XPS 16
Project: BavBierSub 1.0 BavBierSub 2.0

Pagina: 1