[PHP] variabelen dynamisch aanmaken in Object

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • JoostMartijn
  • Registratie: December 2003
  • Laatst online: 17-04 15:22
Mede Tweakers,

Ik heb een vraag! En wil iets wat waarschijnlijk niet mogelijk is binnen PHP. Ik heb gezocht zowel in dit forum als in andere forums als in Google. Ik heb mijn antwoord nog niet kunnen vinden, dit heeft er mogelijk ook mee te maken dat ik niet goed weet waar ik naar moet zoeken.

1. Ik heb een array met een aantal veld namen er in (naam, omschrijving, soort_veld, enz).
2. Ik heb een aantal stappen voor een aanmeld functie laten we in dit voorbeeld uitgaan van 3

Nu moeten er aan de hand van het aantal stappen variabelen gemaakt worden. Zo ver werkt alles prima. Ik wil alleen in het object deze variabelen kunnen gebruiken met this->. Ik kan er niet gewoon private of public voor gooien ( Lijn 5 in de code )

PHP:
1
2
3
4
5
6
7
public function SetVarsArray(){
    for($i = 0; $i < $this_aantal_step; $i++){
        $a = $i + 1;
        foreach($this->_array_vars as $field){
             ${"step_" . $this->_active_step . "_" . $field} = array();                         }
    }
}

Windsoft


Acties:
  • 0 Henk 'm!

  • Thomasje
  • Registratie: Augustus 2002
  • Laatst online: 29-05-2024

Thomasje

Semacode

Zou je kunnen uitleggen waarom je dit zou willen? Dan kunnen we misschien ook andere oplossingen geven.

Acties:
  • 0 Henk 'm!

  • Kettrick
  • Registratie: Augustus 2000
  • Nu online

Kettrick

Rantmeister!

Wat je probeert te doen zou je met variabele variabele namen op kunnen lossen, maar ik denk dat je beter af bent met een meerdimensionale array. Zoeken op deze keywords zou je verder moeten helpen :)

Acties:
  • 0 Henk 'm!

  • JoostMartijn
  • Registratie: December 2003
  • Laatst online: 17-04 15:22
Ik wil een 'Meld je aan' object maken die meerdere stappen en functies ( online betalen ) bevat. Nu heb ik een formhandler (zelf gemaakt) zodat ik met 10 regeles een compleet formulier met 8 velden kan afhandelen. Om dit te kunnen gebruiken in meerdere stappen in combinatie met AJAX wil ik dit met het aanmeld object meerdere stappen kunnen maken. Elke stap heeft andere velden.

Windsoft


Acties:
  • 0 Henk 'm!

  • Thomasje
  • Registratie: Augustus 2002
  • Laatst online: 29-05-2024

Thomasje

Semacode

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private function __get($name) {
    if (isset($this->param[$name])) {
        $res = $this->param[$name];
    } else {
        $res = false;
    }
    return $res;
}

private function __set($name, $val) {
    if (isset($this->param[$name])) {
        $this->param[$name] = $val;
        $res = true;
    } else {
        $res = false;
    }
    return $res;
}


Ik zou nooit dynamisch een object of var aanmaken, maar ik denk dat je dit zoekt!

Link naar artikel: http://www.sematopia.com/?p=150

[ Voor 5% gewijzigd door Thomasje op 10-11-2008 11:53 ]


Acties:
  • 0 Henk 'm!

  • JoostMartijn
  • Registratie: December 2003
  • Laatst online: 17-04 15:22
RoeLz -> 'meerdimensionale array'

De arrays die gebruikt worden hebben al heel veel dimensie's om het een beetje overzichtelijk te houden zodat iemand anders er ook aan kan werken wil ik dit beperken. Vandaar de variabele variabelen. Maar dan moet ik deze variabelen wel buiten de 'SetVarsArray' functie kunnen gebruiken.

Windsoft


Acties:
  • 0 Henk 'm!

  • Kettrick
  • Registratie: Augustus 2000
  • Nu online

Kettrick

Rantmeister!

JoostMartijn schreef op maandag 10 november 2008 @ 11:53:
RoeLz -> 'meerdimensionale array'

om het een beetje overzichtelijk te houden zodat iemand anders er ook aan kan werken wil ik dit beperken. Vandaar de variabele variabelen.
Hier spreek je jezelf een beetje tegen als je het mij vraagt ;)

Als je array structuur duidelijk is is dat prima, het opsplitsen/omcatten van een prima data structuur ( de array ) naar een gare hack ( variabele variabelen ) zou ik zelf niet doen iig, ik denk ook niet dat je toekomstige collega's je dankbaar zijn ;)

Acties:
  • 0 Henk 'm!

  • JoostMartijn
  • Registratie: December 2003
  • Laatst online: 17-04 15:22
RoeLz -> We hebben het al besproken en we willen het graag in de eerste instantie zo oplossen.

Thomasje -> Bedankt dat je de link ook nog even toevoegde het ziet er uit dat dit inderdaad is wat zoek.

Jullie beide bedankt voor jullie snelle reacties

Windsoft


Acties:
  • 0 Henk 'm!

  • Thomasje
  • Registratie: Augustus 2002
  • Laatst online: 29-05-2024

Thomasje

Semacode

JoostMartijn schreef op maandag 10 november 2008 @ 11:58:
RoeLz -> We hebben het al besproken en we willen het graag in de eerste instantie zo oplossen.

Thomasje -> Bedankt dat je de link ook nog even toevoegde het ziet er uit dat dit inderdaad is wat zoek.

Jullie beide bedankt voor jullie snelle reacties
Graag gedaan, als je goed kijkt werkt dat ook gewoon met een array. Ik zou er nog eens goed over nadenken of je het zo wilt doen. Je kan beter een functie schrijven die je array uitleest en en juiste waarde terug geeft.

Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 21:26
Wat jij zoekt is een constructie die hierop lijkt:
PHP:
1
2
3
$bar = 'foo';
${$bar} = 'FOO2';
echo $foo; // print FOO2


Ik raad je met klem aan om niet van deze mogelijkheid gebruik te maken. Zoek eens beter na hoe het zit met de oplossing van Thomasje, want die is 100 maal beter.

Waarom ik die code dan hier neer zet? omdat je expliciet naar dit soort code vraagt en het technisch gezien wel kan.

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Variabele variabelen zijn goed te gebruiken. Tot je een jaar later je code moet bekijken. Of nog erger: iemand anders. Neem alsjeblieft het advies van RoeLz aan.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
doeternietoe schreef op dinsdag 11 november 2008 @ 10:19:
Wat jij zoekt is een constructie die hierop lijkt:
PHP:
1
2
3
$bar = 'foo';
${$bar} = 'FOO2';
echo $foo; // print FOO2


Ik raad je met klem aan om niet van deze mogelijkheid gebruik te maken. Zoek eens beter na hoe het zit met de oplossing van Thomasje, want die is 100 maal beter.

Waarom ik die code dan hier neer zet? omdat je expliciet naar dit soort code vraagt en het technisch gezien wel kan.
Ik heb een dergelijke constructie wel eens gebruikt om variabelen die binnen kwamen via een POST request om te zetten naar de naam maar dan zonder $_POST[] eromheen. Later kwam ik erachter dat extract() bestaat :X

Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb inderdaad gewoon een generiek recursief Config object met SPL.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
class Lode_Config_Array implements ArrayAcces, Iterator{
    
    protected $_storage = array();

    public function __construct(array $values = array()){
         if(count($values) > 0){
              forearch($values as $key => $value){
                     $this->offsetSet($key, $value);
              }
         }
    }
    public function offsetSet($offset, $value){
         if(is_array($value)){
               $this->_storage[$offset] = new self($value);
         }
         else{
               $this->_storage[$offset] = $value;
         }
    }
}
?>


Zoiets even snel uit mijn hoofd...
Pagina: 1