Door
Sander Z
op 26-02-2015 18:25
gewijzigd op 26-02-2015 18:56
1.823 views
Ik ben even de weg kwijt. Ik heb een class waarmee ik settings ophaal uit een database.
Het probleem is alleen dat ik de waardes kan overschrijven, dus ze zijn niet private. Maar ik snap even niet waar ik mis ga.
Dit is een uitgekleed voorbeeld van het script:
<?php
class LoadSettings {
public function __construct () {
$this->fillData();
}
private function fillData() {
$data = $this->getData();
foreach ($data as $key => $value) {
$this->$key = $value;
}
}
private function getData() {
# Ophalen waardes etc...
return $values; # Array met alle waardes
}
public function __get($key) {
return $this->$key;
}
}
?>
In de dump werd ie ook als private aangegeven.
De __set methode bood ook geen oplossing.
Maar ik heb het wel opgelost. Ik weet van te voren welke waardes uitgelezen worden uit de database.
Dus (simpel) ik declareer eerst alle waardes die aangemaakt gaan worden als private. Verder hoef ik dan niets aan te passen aan mijn script en ze zijn niet meer aan te passen.
Enige nadeel van deze methode is wel dat als er in de toekomst een waarde/variabele in de database bijkomt ik deze niet moet vergeten te declareren in de class.
Ben er dus niet helemaal blij mee.
Wat nu als ik deze class helemaal opnieuw zou maken. Hoe zouden jullie het dan doen?
Even vanuit een andere invalshoek de zaak bekijken: je bent er zo op gebrand dat die configuratie-variabelen niet veranderd mogen worden, maar het is (voor jou) al duidelijk dat deze alleen gelezen moeten worden (jij weet hoe je hier om zou moeten gaan).
Als je deze dan toch wijzigt, dan is dat iets dat jij zo programmeert (en waarschijnlijk maak je dan een programmeerfout). Als je geen rechtstreekse toegang hebt tot de programmacode kun je (kan iemand anders) dit ook niet aanpassen.
En als iemand anders toegang heeft tot jouw programmacode, dan is het aanpassen van de waarde van een configuratie-variabele een van je minste zorgen lijkt mij.
Je kunt de class al zo maken dat als je de waarde van een niet-bestaande instelling probeert op te vragen dat het systeem bezwaar maakt (die / exception / whatever). Wat zou er nog meer moeten gebeuren, en vooral waarom? Ik begrijp het niet.
Zoals Wouter al aangaf, PHP staat dit soort dingen nu eenmaal toe. Iets anders wensen is zoiets als "Ik wou dat de aarde niet om de zon draaide". Het ligt buiten jouw macht om daar iets aan te wijzigen.
Wat nu als ik deze class helemaal opnieuw zou maken. Hoe zouden jullie het dan doen?
Het is niet zozeer hoe je het opzet, maar hoe je er vervolgens mee omspringt. Een onjuist gebruik van wat dan ook levert zelden het gewenste resultaat op.