[PHP] variabele variabelen binnen klasses

Pagina: 1
Acties:

Onderwerpen


  • 5v3n
  • Registratie: Juni 2010
  • Laatst online: 12-07 21:56
Hey iedereen,

Ik ben bezig met een php framework te bouwen en ik kwam een probleem tegen in dit stukje code dat ik schreef:

PHP: hoofdcontroller.php
13
14
15
16
17
function autolaad() {
    foreach($this->config['autolaad']['helpers'] as $helper) {
        $this->$helper = $this->laad->helper($helper);
    }
}


Deze code zou mij de mogelijkheid moeten geven om automatisch klasses te laden.

Als ik bijvoorbeeld in mijn configuratie bestand zet dat de url_helper geladen moet worden dan zou dit moeten gebeuren:

code:
1
$this->url_helper = $this->laad->helper('url_helper);


waarom? Omdat het framework zich gedraagt als 1 groot superobject, Iedere instance van een klasse of helper is een variabele in het hoofdobject, zo kunnen alle instances gemakkelijk met elkaar comuniceren.

Het probleem is dat "$this->$helper" niet het verwachte resultaat geeft,
ook "$this->$$helper" werkt niet, dat kan ik verklaren door het rode kadertje in deze link:

http://www.php.net/manual/en/language.variables.variable.php

Nu is mijn vraag: is er een andere manier om dit effect te bereiken? Of kennen jullie een workaround?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 03-11 10:27

Janoz

Moderator Devschuur®

!litemod

Waarom wil je runtime properties aan je object toe gaan voegen? Waarom wil je dit niet gewoon met een array (eigenlijk map) oplossen?

PHP:
1
2
3
4
5
function autolaad() { 
    foreach($this->config['autolaad']['helpers'] as $helper) { 
        $this->helpers[$helper] = $this->laad->helper($helper); 
    } 
}

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • 5v3n
  • Registratie: Juni 2010
  • Laatst online: 12-07 21:56
omdat ik daar niet aan gedacht heb :P

Ik vindt het een prima idee, maar kan je dan bijvoorbeeld dit doen?

$this->helpers['url']->bepaal_segmenten();

Als dat mogelijk is, is jouw oplossing ideaal. Ik zal het straks testen tenzij jij al weet of dat werkt.

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 23-10 08:50
moet je wel eerst een array toewijzen aan $this->helpers;

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Foo
{
  private $helpers = array();

  public function boo()
  {
    // doe iets
  }

  public function bar()
  {
    $this->helpers["url"] = new Foo();
    $this->helpers["url"]->boo();
  }
}


Maar zal je wel zelf een groot framework schrijven als je zulke dingen niet weet?

[ Voor 22% gewijzigd door Gamebuster op 11-03-2011 17:44 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


  • Reboot
  • Registratie: Januari 2009
  • Laatst online: 29-07 22:18
Een kleine tip, programmeer altijd in het engels. Veel simpeler naar mijn mening omdat alle code altijd engelstalig is.

  • Apache
  • Registratie: Juli 2000
  • Laatst online: 03-11 23:33

Apache

amateur software devver

PHP zit bij mij ver weg maar hier kan je toch __get() en __set() voor gebruiken?

If it ain't broken it doesn't have enough features


  • Raymond P
  • Registratie: September 2006
  • Laatst online: 13:16
Volgens mij wil je:
$this->{$helper} = $this->laad->helper($helper);

- knip -


  • X_lawl_X
  • Registratie: September 2009
  • Laatst online: 01-11 17:56
Kun je niet gewoon beter __autoload() gebruiken?

  • 5v3n
  • Registratie: Juni 2010
  • Laatst online: 12-07 21:56
@Gamebuster:

dat framework maak ik alleen omdat je er enorm veel van bij leert, zoals dit bijvoorbeeld, en misschien kan ik het later nog gebruiken ook. Bedankt om even te tonen dat het zal werken.

@Reboot: Ook bedankt voor jouw tip, ik zal eraan denken.

@apache: Ik zal daar wat over opzoeken, maar ik heb al een goede oplossing gekregen, toch bedankt.

@Raymond P: Ik dacht wel dat ik verkeerde syntax gebruiktte, die van jou ziet er uit alsof hij zou werken,
maar bij mijn test werkte hij niet :/ Ook jij bedankt voor je ideëen

@X_lawl_X: dat is inderdaad ook een oplossing, maar dat vraagt meer ombouw werk dan de oplossing van Gamebuster. Toch bedankt^^

Voor mij is het probleem opgelost, bedankt allemaal voor jullie hulp.
Pagina: 1