PHP object array en __get() $object->level1arr->level2arr

Pagina: 1
Acties:
  • 1.110 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • aex351
  • Registratie: Juni 2005
  • Laatst online: 02:04

aex351

I am the one

Topicstarter
stuk code :
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class test 
{
    //bevat een assoc array
    private $_array;
    
    //haalt waarde op uit array $object->level1arr;
    public function __get($value)
    {
        return $this->_array[$value];
    }
}

$object = new test;
$object->level1arr ; //prints "dit is mijn test text"
$object->level1arr->level2arr ; //werkt niet
$object->level1arr['level2arr'] ; //prints "dit is mijn test text2"

//de array ziet er zo uit
$_array['level1arr'] = 'dit is mijn test text';
$_array['level1arr']['level2arr']  = 'dit is mijn test text2';


Nu is mijn vraag waarom haalt de de __get niet de level2arr uit de array.

nme mag, indien noodzakelijk, topic titel naar eigen wens aanpassen. Kon niets beters denken O-)

[ Voor 26% gewijzigd door aex351 op 21-08-2006 22:05 ]

< dit stukje webruimte is te huur >


Acties:
  • 0 Henk 'm!

  • mr._Anderson
  • Registratie: Februari 2000
  • Niet online

mr._Anderson

[Een man is nog geen Tweaker]

aex351 schreef op maandag 21 augustus 2006 @ 21:53:
stuk code :
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class test 
{
    //bevat een assoc array
    private $_array;
    
    //haalt waarde op uit array $object->level1arr;
    public function __get($value)
    {
        return $this->_array[value];
    }
}

$object = new test;
$object->level1arr ; //prints "dit is mijn test text"
$object->level1arr->level2arr ; //werkt niet


Nu is mijn vraag waarom haalt de de __get niet de level2arr uit de array.

nme mag, indien noodzakelijk, topic titel naar eigen wens aanpassen. Kon niets beters denken O-)
$ teken voor value zetten?

[ Voor 92% gewijzigd door mr._Anderson op 21-08-2006 21:57 ]

-=[Een wijs man zei eens: als een tweaker heb ik zo mijn TCP-IP connecties. Deze uitspraak staat tot op de dag van vandaag © mr._Anderson]=-=[ AMD64 overclock en registratie site: AMDGeeks.net


Acties:
  • 0 Henk 'm!

  • aex351
  • Registratie: Juni 2005
  • Laatst online: 02:04

aex351

I am the one

Topicstarter
Dat is een fout van mijn schets, maar lost niet het probleem op.

< dit stukje webruimte is te huur >


Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 12:54
Ik zie in die test class geen enkele level1arr en level2arr terug komen? Wat probeer je nou precies te bereiken, wat de code gaan doen?

Acties:
  • 0 Henk 'm!

  • aex351
  • Registratie: Juni 2005
  • Laatst online: 02:04

aex351

I am the one

Topicstarter
Sybr_E-N schreef op maandag 21 augustus 2006 @ 21:59:
Ik zie in die test class geen enkele level1arr en level2arr terug komen? Wat probeer je nou precies te bereiken, wat de code gaan doen?
Ja die array moet je zelf er even bij bedenken. iets in de vorm van :
PHP:
1
2
$array['level1arr'] = 'dit is mijn test text';
$array['level1arr']['level2arr']  = 'dit is mijn test text';

heb meteen de startpost even geupdate

[ Voor 4% gewijzigd door aex351 op 21-08-2006 22:06 ]

< dit stukje webruimte is te huur >


Acties:
  • 0 Henk 'm!

  • wica
  • Registratie: Februari 2002
  • Laatst online: 21-02 09:21

wica

De duivel jacht op me

Omdat $array['level1arr'] geen opject is

object->level1arr['level2arr'] zal beter doen :)

RFC | The Linux Document Project | gentoo.


Acties:
  • 0 Henk 'm!

  • aex351
  • Registratie: Juni 2005
  • Laatst online: 02:04

aex351

I am the one

Topicstarter
wica schreef op maandag 21 augustus 2006 @ 22:05:
Omdat $array['level1arr'] geen opject is

object->level1arr['level2arr'] zal beter doen :)
ja maar ik wil juist op deze manier door de array komen : object->level1arr->level2arr

< dit stukje webruimte is te huur >


Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 13:59

DexterDee

I doubt, therefore I might be

Dan zul je een object moeten teruggeven in plaats van een associative array in de __get :)

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

  • aex351
  • Registratie: Juni 2005
  • Laatst online: 02:04

aex351

I am the one

Topicstarter
DexterDee schreef op maandag 21 augustus 2006 @ 22:10:
Dan zul je een object moeten teruggeven in plaats van een associative array in de __get :)
PHP:
1
2
3
4
5
    //haalt waarde op uit array $object->level1arr;
    public function __get($value)
    {
        return (object) $this->_array[$value];
    }


Ok wanneer ik het type cast naar een object dan krijg ik wel de gewenste resultaat alleen krijg ik weer een error van de base php class (stdClass) Fatal error: Cannot use object of type stdClass as array voorgeschoteld. Dit omdat ik ook dus ook waardes in de array wil setten met
PHP:
1
2
3
4
5
6
7
8
//stel waardes in :
public function __set($value, $arg) {

    foreach($arg as $key=>$inhoud) {
            $this->_array[$value] = array($key => $inhoud);  
        }
        $arg = null;
}
en dat dus niet samen gaat.

Wat is volgens jou het beste manier om een object op deze manier terug te geven ?

[ Voor 16% gewijzigd door aex351 op 21-08-2006 22:28 ]

< dit stukje webruimte is te huur >


Acties:
  • 0 Henk 'm!

  • wica
  • Registratie: Februari 2002
  • Laatst online: 21-02 09:21

wica

De duivel jacht op me

Waarom moet het een object zijn?

RFC | The Linux Document Project | gentoo.


Acties:
  • 0 Henk 'm!

  • jan-marten
  • Registratie: September 2000
  • Laatst online: 20:24
PHP:
1
2
3
4
5
6
$test = "hallo";
$test['hoi'] = "hi";

print $test;
print "<br>";
print $test['hoi'];
Heeft als resultaat "hallo<br>h".
Een string kun je niet tegelijk gebruiken als array?

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 00:18
jan-marten schreef op dinsdag 22 augustus 2006 @ 09:10:
PHP:
1
2
3
4
5
6
$test = "hallo";
$test['hoi'] = "hi";

print $test;
print "<br>";
print $test['hoi'];
Heeft als resultaat "hallo<br>h".
Een string kun je niet tegelijk gebruiken als array?
hmja, tuurlijk kun je een string niet als array gebruiken, dan overschrijf je de string, overigens is een string, in php, eigenlijk al een array. Maar omdat php zo verdomde makkelijk is met variabelen geeft dit geen errors, maar eigenlijk is dit gewoon niet netjes

|>


Acties:
  • 0 Henk 'm!

  • aex351
  • Registratie: Juni 2005
  • Laatst online: 02:04

aex351

I am the one

Topicstarter
jan-marten schreef op dinsdag 22 augustus 2006 @ 09:10:
PHP:
1
2
3
4
5
6
$test = "hallo";
$test['hoi'] = "hi";

print $test;
print "<br>";
print $test['hoi'];
Heeft als resultaat "hallo<br>h".
Een string kun je niet tegelijk gebruiken als array?
Dat doe ik toch ook niet.
wica schreef op maandag 21 augustus 2006 @ 22:50:
Waarom moet het een object zijn?
Omdat het OO gerelateerd is.

Heeft iemand nog een oplossing voor mijn probleem kunnen bedenken.

< dit stukje webruimte is te huur >


Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 13:59

DexterDee

I doubt, therefore I might be

aex351 schreef op dinsdag 22 augustus 2006 @ 18:58:
Omdat het OO gerelateerd is.

Heeft iemand nog een oplossing voor mijn probleem kunnen bedenken.
Leg eens uit welk probleem je probeert op te lossen hiermee. Technisch is de oplossing op je vraag relatief simpel. Je geeft óf een array óf een object terug en checkt met is_array of is_object of het een van beide is. Maar programmeertechnisch is dat eigenlijk nooit nodig (zelfs onwenselijk) en kun je het echt anders en veel beter oplossen. Maar daarvoor is het wel handig voor mij en de medelezers om uit te leggen wat je hiermee werkelijk probeert te bereiken :)

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

De oplossing voor jouw probleem is (bij je testcase) simpel:
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
<?php
class test 
{
    //bevat een assoc array
    private $_array;
    public function test($array)
    {
        $this->_array = $array;
    }

    //haalt waarde op uit array $object->level1arr;
    public function __get($value)
    {
        if (is_array($this->_array[$value])) 
               return new test($this->_array[$value]);
        else return $this->_array[$value];
    }
}

$object = new test;
$object->level1arr ; //prints "dit is mijn test text"
$object->level1arr->level2arr ; //werkt niet
$object->level1arr['level2arr'] ; //prints "dit is mijn test text2"

//de array ziet er zo uit
$_array['level1arr'] = 'dit is mijn test text';
$_array['level1arr']['level2arr']  = 'dit is mijn test text2';
?>

Zonder het hoe en waarom kan het best wel eens zijn dat deze oplossing niet nuttig is, maar misschien snap je nu wel het probleem waarom hij niet werkt.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
@TS:

Lijkt me een beetje onzinnig waar je mee bezig bent. Leg eens duidelijk uit waarom je dit zo wilt, want er zijn waarschijnlijk veek gemakkelijkere (en nettere) manieren om dit op te lossen.

Je opzet is ook wel erg vreemd trouwens. $_array['level1arr'] is namelijk zowel een string als een array, iets wat me echt mogelijk lijkt.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • flashin
  • Registratie: Augustus 2002
  • Laatst online: 17-12-2023
OO is een manier van werken om het je makkelijker en duidelijker te maken. Niet om het je moeilijker en onduidelijker te maken, waar je nu mee bezig bent.

OO is een denkstijl, maar je moet er wel lucratief mee omgaan.
Pagina: 1