[PHP] __get test op object

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • vorlox
  • Registratie: Juni 2001
  • Laatst online: 02-02-2022

vorlox

I cna ytpe 300 wrods pre miute

Topicstarter
Beste Tweakers,

Stel ik heb de volgende class
PHP:
1
2
3
4
5
6
7
8
class customer {
    protected $grp_id;
    
    public function __get($key) {
        return $this->{$key};
    }
    
}


Kan ik nu op de een of andere manier binnen de __get functie afvangen of deze wordt aangeroepen op de volgende manier:
PHP:
1
2
3
4
5
$cus = new customer();

echo $cus->grp_id;
of
echo $cus->grp_id->name;


Ik wil namelijk eigenlijk een lazy loading toepassen echter het lijkt erop dat php het netjes in volgorde uitvoert
dus eerst de waarde terug geeft van customer -> grp en dan pas over die waarde obj->name doet.

M.a.w ik zou graag zoiets willen
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class customer {
    protected $grp_id;
    
    public function __get($key) {
        if(testOpLazy()) {
            $this->{$key} = new Object();
            $this->{$key}->getData();
            return $this->{$key};
        }
        else {  
            return $this->{$key};
        }
    }
    
}

[ Voor 19% gewijzigd door vorlox op 03-02-2010 12:35 ]


Acties:
  • 0 Henk 'm!

  • TwoR
  • Registratie: Augustus 2002
  • Laatst online: 10-10 11:37

TwoR

Gekleurde stippen

Wikipedia: Lazy loading
Zie daar het PHP example wil je zoiets?

Acties:
  • 0 Henk 'm!

  • vorlox
  • Registratie: Juni 2001
  • Laatst online: 02-02-2022

vorlox

I cna ytpe 300 wrods pre miute

Topicstarter
Ja en nee,
In het voorbeeld van wiki wordt er altijd een object gemaakt indien deze opgevraagd wordt.
Dus als ik vraag om
PHP:
1
echo $cus->grp_id (Returns object)

en
PHP:
1
echo $cus->grp_id->name (Returns object)

dan wordt er ook een object geretourneerd waar je dan vervolgens ->name van opvraagt.

Wat ik graag wil weten of ik kan afvangen of alleen de property wordt opgevraagd of dat er van die property ookweer een property wordt opgevraagd.

Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
PHP:
1
2
$group = $cus->grp_id;
echo $group->name;

Voorbeeld op wiki lijkt me wel duidelijk, je initialiseert het wanneer je het nodig hebt, door te controleren of de variabele null is, en daarop roep je gelijk je getData-functie aan.

En of er van die property weer een property aangevraagd wordt kun je niet weten. (Daarom bovenstaand voorbeeld, wat dan?)

Acties:
  • 0 Henk 'm!

Verwijderd

Je kunt toch met grp_id toch het zelfde grapje uithalen (let niet op de naamgeving)?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
class grp_id {
    protected $name = null;
    
    public function __get($key) {
        if ($this->{$key} == null) {
             $this->{$key} = 'Ik ben een random waarde uit een random bron';
        }

        return $this->{$key};
    }
    
}

[ Voor 0% gewijzigd door Verwijderd op 03-02-2010 20:07 . Reden: Initialisatie van het attribuut ;) ]


Acties:
  • 0 Henk 'm!

  • vorlox
  • Registratie: Juni 2001
  • Laatst online: 02-02-2022

vorlox

I cna ytpe 300 wrods pre miute

Topicstarter
Verwijderd schreef op woensdag 03 februari 2010 @ 20:06:
Je kunt toch met grp_id toch het zelfde grapje uithalen (let niet op de naamgeving)?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
class grp_id {
    protected $name = null;
    
    public function __get($key) {
        if ($this->{$key} == null) {
             $this->{$key} = 'Ik ben een random waarde uit een random bron';
        }

        return $this->{$key};
    }
    
}
Ja in principe doe ik dat idd. Echter ik vroeg me af of ik het voor elkaar kon krijgen om wanneer ik
$cus->grp_id doe ik een nummer terug kon krijgen en in geval van $cus->grp_id->name hj zou snappen dat hij met het id zichzelf kon lazyloaden en vullen.. vandaar
Maar ik denk dat dit te moeilijk gaat worden. :'(

Acties:
  • 0 Henk 'm!

  • Ssander
  • Registratie: December 2009
  • Laatst online: 12-06-2023
Wat je wilt doen is inderdaad niet mogelijk. Het makkelijkste is denk ik om er een functie tussen te gooien. Dus ipv $cus->grp_id->name doe je $cus->group(grp_id)->name. De group functie doet dan wat jij eigenlijk in de __get wilt doen.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Voor de trivia: Het kan wel, gewoon een kwestie van __toString() het id terug te laten geven. B) Maar ik denk dat je dat allemaal niet moet willen. :+

{signature}

Pagina: 1