Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP] Array key meegeven aan function (overload)

Pagina: 1
Acties:

Onderwerpen


  • Bjk
  • Registratie: Augustus 2002
  • Laatst online: 07:29
Ik heb een class met daarin deze overload:

PHP:
1
2
3
4
public function __get($name)
    {
        echo $name;
    }


Ik roep het zo aan:

PHP:
1
2
$test = new sample();
$test->titel['testkey'];


--> Output: titel

Nu verwacht ik dat wel, maar ik wil graag zowel de output titel als de array key (testkey) ophalen. Ik heb dit met van alles geprobeerd (key, array_keys, foreach) maar krijg het niet voor elkaar.

Nu hoeft de $name niet te bestaan (dat wil ik gaan afvangen) maar toch zou ik de input van de __get functie volledig willen afvangen, dus variable maar ook eventueel aanwezige keys.

Kan dit, of kan iemand mij in de juiste richting wijzen?

  • Exception
  • Registratie: Augustus 2006
  • Laatst online: 08:27
Ik begrijp het niet helemaal, maar kun je hier wat mee?
http://php.net/manual/en/function.compact.php

  • Struikrover
  • Registratie: Juni 2005
  • Laatst online: 08:25
Beetje een vaag verhaal, wat wil je nu precies? Kun je het duidelijker opschrijven? :).
Als je van een associatieve array zowel de key als de value waarde terug wilt hebben in de __get functie kun je dat toch gewoon doen?

Ik snap je tweede stukje code ook niet zo goed. Je __get methode roep je normaliter zo aan:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Test
{
    private $data;
    public function __construct()
    {
        $this -> data = new array();
        //vul je data array o.i.d.
        $this -> data["testkey"] = "value";
    }
    public function __get($key)
    {
        if (isset($this -> data[$key]))
            return $this -> data[$key];
    }
}

$test = new Test();
echo $test -> testkey; //zal "value" als output geven


Dus nogmaals: wat wil je precies doen?

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 09:46
Ik vrees dat wat je wil niet kan. Als je de volgende code uitvoert:
PHP:
1
2
3
4
5
6
7
8
class test {
    public function __get($name) {
        return array('a' => 'foo'); 
    }   
}

$t = new Test();
echo $t->test['a'];

Is de uitvoer 'foo'. Daaruit leidt ik af dat de key niet doorgegeven wordt aan __get, maar dat de key wordt aangeroepen op het resultaat van de __get()-aanroep.

Wat je precies wil bereiken weet ik niet. Maar je kunt __call gebruiken als je parameters door wil kunnen geven.
PHP:
1
2
3
4
5
6
7
8
class test {
    public function __call($name, $args) {
        echo $name .':'.implode(',',$args); 
    }   
}

$t = new Test();
echo $t->test('a');

Levert uitvoer: "test:a"

Regeren is vooruitschuiven


  • C0rnelis
  • Registratie: Juni 2010
  • Laatst online: 01-11 21:54
T-MOB schreef op zondag 18 maart 2012 @ 11:51:
Wat je precies wil bereiken weet ik niet. Maar je kunt __call gebruiken als je parameters door wil kunnen geven.
PHP:
1
2
3
4
5
6
7
8
class test {
    public function __call($name, $args) {
        echo $name .':'.implode(',',$args); 
    }   
}

$t = new Test();
echo $t->test('a');

Levert uitvoer: "test:a"
Zoals ik het begrijp is dit precies wat hij wil, naast de functienaam (titel) ook de arguments afvangen (testkey) en daar kwam hij niet uit. Het verschil zit het dus in __get versus __call.

Wellicht is een andere mogelijkheid de combinatie van __get en __set te gebruiken zoals beschreven staat op http://nl3.php.net/manual...erloading.php#example-206 afhankelijk van je doel.

  • Struikrover
  • Registratie: Juni 2005
  • Laatst online: 08:25
EDIT: nvm, ik had je post niet goed begrepen :/.
Het is dus even afwachten op TS, om duidelijk te krijgen wat ie precies wil :P

[ Voor 86% gewijzigd door Struikrover op 18-03-2012 12:08 ]


  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 09:46
C0rnelis schreef op zondag 18 maart 2012 @ 12:01:
[...]


Zoals ik het begrijp is dit precies wat hij wil, naast de functienaam (titel) ook de arguments afvangen (testkey) en daar kwam hij niet uit. Het verschil zit het dus in __get versus __call.
In zo'n testje is het inderdaad aardig hetzelfde, je verandert alleen de getypte haakjes. Real-world zijn er natuurlijk grotere verschillen omdat een array anders gebruikt wordt dan een functie-aanroep. Dat is natuurlijk ook een reden voor de huidige implementatie van __get(). Als array keys meegegeven zouden worden aan __get() dan krijg je een compleet wazig array-concept. Wat zou bijvoorbeeld de uitvoer van count($test->foo) moeten zijn als foo zo'n dynamisch array is?

Regeren is vooruitschuiven

Pagina: 1