[php] Scope probleem met xml parser

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 15-09 16:19

alienfruit

the alien you never expected

Topicstarter
Ik ben bezig met het bouwen van framework dat uit modules is opgebouwd, nu heb ik een xml formaat bedacht waar de gebruiker kan opgeven welke modules er kunnen worden gebruikt (incl. klassenaam, redirect e.d.). Hiervoor heb ik vervolgens een klasse gemaakt dit het parsen van die xml bestand regelt (die het later in een hashmap moet zetten e.d.) alleen nu maak ik gebruik van de volgende xml_parser wrapper: http://phpxmlclasses.sour...ss=class_path_parser.html

Als ik de bovenstaande wrapper gebruikt in me modules klasse krijg ik een scope probleem omdat ik dmv. van de set_handler functie een functie moet opgeven (event a-like) die tag gegevens afhandeld. Alleen deze functie (zie regel 25) blijkt niet te vallen in de scope van de klasse maar er buiten. Iemand enige idee hoe dit op te lossen valt?

Ik heb de volgende code tot nu toe:

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
require_once( GREENPULP_DOCROOT . "conf/greenpulp.constants.inc.php" );
require_once( GREENPULP_LIBRARY . "iflib.object.inc.php" );
require_once( GREENPULP_LIBRARY . "iflib.xml.inc.php" );

class modules extends Object {
        var $p_modules;
        var $p_reloadcount;
        var $p_xmlparser;
        var $p_conf_file;
        
        function modules( $conf_file = '' ) {
            $this->p_modules       = array();
            $this->p_reloadcount = 0;
            $this->p_conf_file  = $conf_file;   
            // initialize modules class...
            $this->init();
        }
        
        function init() {
            $this->load();
        }
        
        function load() {
            $this->p_xmlparser = new Xml();
            $this->p_xmlparser->set_handler( "/greenpulp-config/module-mappings/module", 'xml_module' );
            //
            // set the file name...
            if ( $this->p_conf_file != '' ) {
                //
                // start parsing of the configuration file...
                if ( !$this->p_xmlparser->parse_file( $this->p_conf_file ) ) {
                    // error
                    print "Error: " . $this->p_xmlparser->get_error();
                }
            }
            $this->p_xmlparser = NULL;
        }       


        function addModule ( $path, $forward, $name ) {
            print "Path=<code>{$path}</code>\n"; 
            print "Path=<code>{$forward}</code>\n"; 
            print "Path=<code>{$name}</code>\n"; 
        }
        //
        // XML PARSER EVENT METHODS
}

        function xml_module( $name, $attribs, $content ) {
            //$this->addModule( $attribs['path'], $attribs['forward'], $attribs['name'] );
}


Zoals je ziet valt de xml_module event methode voor de parser nu buiten de klasse maar dit wil ik niet! Zo kan ik overigens ook de hashmap vullen e.d.

[ Voor 18% gewijzigd door alienfruit op 27-07-2003 00:21 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ff die parser wijzigen dat ie ook een object krijgt en dat ie de methode op dat object uitvoert.

Acties:
  • 0 Henk 'm!

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
je probleem is niet volledig duidelijk, maar ik zie twee mogelijke oplossingen:

1. zet xml_module() in de klasse 'modules' :+ (ik neem aan dat dit niet kan of niet handig is, maar waarom eigenlijk?)
2. geef een functiereference mee aan elke instantie van 'modules'. misschien kun je in php geen functies aan een functie meegeven (het zijn immers geen first-class members); als dat zo mocht zijn, zul je een object(reference) mee moeten geven, waarvan 'modules' dan de juiste functie kan aanroepen.

[ Voor 5% gewijzigd door Apollo_Futurae op 27-07-2003 00:38 . Reden: gamma ]

Pas de replâtrage, la structure est pourrie.


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 15-09 16:19

alienfruit

the alien you never expected

Topicstarter
Apollo, ja xml_module() in de klasse modules werkt niet! Of ikz ou hem moeten plaatsen in de klasse Xml (heb um hernoemd van class_path_parser naar Xml) maar dat vind ik weer niet netjes. Daarom hoopte ik of het mogelijk is om hem een handler op te laten geven die zelfs buiten de xmlparser klasse valt.

Naja. Ik ga nu slapen ga er morgen wel weer mee verder

[ Voor 9% gewijzigd door alienfruit op 27-07-2003 00:48 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Misschien wel de handigste oplossing: singleton pattern gebruiken. Kan uiteraard alleen als je maar een instantie van klasse modules gebruikt maar het ding ruikt ernaar dat dat zo is...

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class modules extends Object
{
  // .. <knip>
  
  // deze methode toevoegen
  function & getInstance()
  {
    static $instance;
    if( !isset($instance) )
    {
      $instance = new modules();
    }
    return $instance;
  }
}

function addModule ( $path, $forward, $name )
{ 
   $modules =& modules::getInstance();
   $modules->addModule($path, $forward, $name );
}

[ Voor 4% gewijzigd door Verwijderd op 27-07-2003 01:49 ]


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 15-09 16:19

alienfruit

the alien you never expected

Topicstarter
Hoi Fladder!
Inderdaad deze klasse moet een singleton worden :)
Liefst heb ik dat die addModule-fucntie gewoon binnen de klasse valt, maar als dat zo 1-2-3 niet kan zonder deze klasse van de xml_parser te scheiden dan moet he tmaar op deze manier.

Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 15-09 16:19

alienfruit

the alien you never expected

Topicstarter
hmm. als ik in de addModule de array $this->p_modules vul en direkt in dezelfe functie er een print_r() van echo zie ik dat er waardes zijn. Alleen als ik nu na de load() call in de init() functie dit ook doe dan krijg ik alleen array() terug. Enig idee hoe dat komt?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
       function addModule ( $path, $forward, $name, $validate ) { 
            $module = array();
                $module['name']     = $name;    
                $module['path']      = $path;
                $module['forward']   = $forward;
                $module['validate']  = $valdate;

                // add a new module to the hashlist...
                $this->p_modules[ $name ] = $module;        
                print_r($this->p_modules);
                
                // we should store this information!
                // free the temporily module array
                $module = NULL;
        }       
        //
        // als ik nu de init() functie pas naar:
        function init() {
               load();
               print_r($this->p_modules);
        } 
        //
        // is deze print_r() alleen maar Array() ipv van de output die ik krijg in addModule!

[ Voor 74% gewijzigd door alienfruit op 27-07-2003 14:16 ]


Acties:
  • 0 Henk 'm!

Verwijderd

en hoe instantieer je je modules klasse? toch wel met getInstance() neem ik aan?

Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 15-09 16:19

alienfruit

the alien you never expected

Topicstarter
$modules_conf_file = GREENPULP_MODULES . "modules.xml";

$modules = new modules( $modules_conf_file );
print "Modules list\n<br>";
print_r( $modules->p_modules );
//$modules = NULL;

[ Voor 98% gewijzigd door alienfruit op 27-07-2003 17:47 ]


Acties:
  • 0 Henk 'm!

Verwijderd

sja dan is de modules waar init en load in plaatsvinden een andere instantie dan de modules waar addModule op wordt uitgevoerd. gebruik getInstance...

Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 15-09 16:19

alienfruit

the alien you never expected

Topicstarter
Ik heb er net naar gekeken maar het probleem bestaat nog steeds als ik de klasse aanmaak op de volgende manier (in me index.php): :|

PHP:
1
2
$modules_conf_file  = GREENPULP_MODULES . "modules.xml";
$modules = & modules::getInstance( $modules_conf_file );


Dan maakt hij nog steeds twee instanties van de modules klasse. Ik volg het nu niet meer :( Hij zou toch bij de tweede keer moeten zien dat er al een instantie bestaat en er vervolgens niet nog een maken?

[ Voor 144% gewijzigd door alienfruit op 28-07-2003 01:04 ]


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 15-09 16:19

alienfruit

the alien you never expected

Topicstarter
Misschien toch maar eens nadenken om deze klasse af te laten leiden van de xml parser klasse. Ook al vind ik dit niet netjes, dan zou ik beter een modues_xml klasse kunnen maken die ik dan gebruik in de modules klasse. Lijkt mij netter? Vinden jullie ook niet :?[/

Acties:
  • 0 Henk 'm!

Verwijderd

Kun je doen. Ik zou zeggen fix ff je probleempje en je bent klaar. Post es je code van getInstance() en addModule(..)

Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 15-09 16:19

alienfruit

the alien you never expected

Topicstarter
@fladder: Hierbij de volledige code die ik gebruik; als je nog suggestie hebt qua coding style e.d. dan hoor ik het graag. Alvast bedankt. Ik zie het probleem echt niet :'(

klik hier voor de broncode van class.modules.inc.phps

Vervolgens roep ik die klasse op deze manier aan:

code:
1
2
3
4
5
6
7
8
define( GREENPULP_DOCROOT,              '/sites/greenpulp/' ); 

require_once( GREENPULP_DOCROOT . "conf/greenpulp.constants.inc.php" );
require_once( GREENPULP_LIBRARY . "class.modules.inc.php" );

$modules_conf_file  = GREENPULP_MODULES . "modules.xml";

$modules = & modules::getInstance( $modules_conf_file );

[ Voor 40% gewijzigd door alienfruit op 28-07-2003 11:26 ]


Acties:
  • 0 Henk 'm!

Verwijderd

ben je java struts aan het nabouwen btw?

Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 15-09 16:19

alienfruit

the alien you never expected

Topicstarter
Nee, ik ben het niet aan het na bouwen (werkt prima onder Java!) maar wil het idee van hun configuratieschema wel gebruiken.

[ Voor 70% gewijzigd door alienfruit op 29-07-2003 10:20 ]


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 15-09 16:19

alienfruit

the alien you never expected

Topicstarter
Maar fladder weet je een oplossing voor mee probleem? In een ander topic zag dat je phrames en phpmvc gepost hebt ziet er wel leuk toch eens naar kijken hoe zei de MVC pattern in PHP hebben gemaakt. Qua OO is PHP niet echt fantastisch. Niet dat ik zelf een ster ben in OO ben hoor, ik doe dat ook maar op gevoel :) en wat ik zelf "goed" en handig vindt. Deze vakantie ga ik beginnen met het Design Patterns boek en Refactoring boek.

Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 15-09 16:19

alienfruit

the alien you never expected

Topicstarter
Hierbij wil ik medelen dat het probleem met hulp van fladder is opgelost. Ik ga niet melden wat het probleem, die is zo stom! :) Topic kan dicht!
Pagina: 1