[PHP] Class properties vullen vanuit array

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Vinze
  • Registratie: Augustus 2006
  • Laatst online: 09-10 08:33
Ik heb een probleem waar ik op Google geen oplossing voor kan vinden, wellicht gebruik ik de verkeerde zoektermen want kan me niet voorstellen dat ik de eerste ben die hier tegenaan loopt. Ik heb het volgende stukje code:

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 TestAPI {

    protected $username;

    protected $password;

    public function __construct($settings = []) {
        $default = [
            'username' => 'root',
            'password' => 'test123'
        ];
        $settings = array_merge($default, $settings);

        foreach ($settings as $k => $v) {
            $this->${$k} = $v;
        }
    }

}

$api = new TestAPI(['username' => 'user']);


Wat ik hiermee wil doen is de class properties 'username' en 'password' vullen met de gegevens uit de $settings array. Echter krijg ik de volgende foutmeldingen:

code:
1
2
3
Notice: Undefined variable: username in .. on line 16

Fatal error: Cannot access empty property in .. on line 16


Ik heb geen flauw idee waarom deze fouten verschijnen, de variabele bestaat toch gewoon? Iemand enig idee wat er fout gaat en hoe ik dit kan oplossen?

Beste antwoord (via Vinze op 27-03-2017 14:41)


  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Moet het dynamisch aanspreken van een property niet als volgt?

$this->$k = $v;

M'n php kennis is nogal roestig en oud....

Systeem | Strava

Alle reacties


Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 05-10 19:42
En als je dit doet?

PHP:
1
$api = new TestAPI($settings = array ('username' => 'user'));


en dan de =[] weghaalt in de construct

Acties:
  • Beste antwoord
  • +3 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Moet het dynamisch aanspreken van een property niet als volgt?

$this->$k = $v;

M'n php kennis is nogal roestig en oud....

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • Vinze
  • Registratie: Augustus 2006
  • Laatst online: 09-10 08:33
RedHat schreef op maandag 27 maart 2017 @ 14:35:
En als je dit doet?

PHP:
1
$api = new TestAPI($settings = array ('username' => 'user'));


en dan de =[] weghaalt in de construct
Nope, dat maakt in principe niks uit, die [] is alleen de nieuwe array notatie.
Brakkie schreef op maandag 27 maart 2017 @ 14:39:
Moet het dynamisch aanspreken van een property niet als volgt?

$this->$k = $v;

M'n php kennis is nogal roestig en oud....
Ja dat was 'm inderdaad! Ik zat blijkbaar onnodig moeilijk te doen met variable variables 8)7

Bedankt!

Acties:
  • +1 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

@Vinze Aangezien je al uitgaat van een default username en password, waarom die dan setten vanuit de construct?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
class TestAPI {
    protected $username = 'root';
    protected $password = 'test123';

    public function __construct(array $settings) {
        if ($settings['username'] && $settings['password']) {
            $this->username = $settings['username'];
            $this->password = $settings['password'];
        }
    }
}

$api = new TestAPI(['username' => 'user', 'password' => '123test']);
Op deze wijze dwing je af dat $settings een array is en dan is de kans dus al zeer aannemelijk dat de keys 'user' en 'password' er in zitten. Door te checken op zowel $settings['username'] en $settings['password'] overschrijf je dan de default waardes :) Vind ik althans veel cleaner dan met foreach en een 'variabele variabele'.
Brakkie schreef op maandag 27 maart 2017 @ 14:39:
Moet het dynamisch aanspreken van een property niet als volgt?

$this->$k = $v;

M'n php kennis is nogal roestig en oud....
Probleem is alleen hiermee wel, dat je variabelen kan declareren als ze niet voor de construct al declared zijn. Is (imo) niet helemaal netjes OOP. ;)

[ Voor 68% gewijzigd door CH4OS op 27-03-2017 15:44 ]


Acties:
  • +1 Henk 'm!

  • Vinze
  • Registratie: Augustus 2006
  • Laatst online: 09-10 08:33
@CH40S Dat setten vanuit de construct was even om te testen en is inderdaad niet zo netjes, dit heb ik inmiddels gecorrigeerd. Wat betreft de foreach; er moeten in de volledige code een stuk meer properties overschreven kunnen worden, en deze allemaal uitschrijven vond ik nogal rommelig. In plaats daarvan check ik voor het setten of de property wel bestaat.

Je tip om de $settings variabele te type hinten naar een array is ook wel slim inderdaad, thanks!
Pagina: 1