Ola,

Ik heb een vraagje... ik heb een class waarin ik de naam van een constante kan ophalen. Nu had ik in 1e instantie een method waarbij telkens 2 controles plaatsvinden, en daar heb ik nu een method van gemaakt met een extra overkoepelende controle. Dit laatste heb ik gedaan om, indien de method meer dan 1x wordt aangeroepen, geen dubbele controles te hoeven uitvoeren. Ik ben benieuwd welke versie jullie beter vinden en waarom. Hieronder even 2 voorbeeldjes van hoe het ongeveer werkt.

Voorbeeld 1:

<?php
class Language {

const DUTCH = 1;

static private $languages_values;

static public function getConstName($value) {
if (!isset(self::$languages_values)) { // controle 1
$ref_class = new \ReflectionClass(self::class);
self::$languages_values = array_flip($ref_class->getConstants());
}
if (!isset(self::$languages_values[$value])) { // controle 2
thow new \Exception('de value bestaat niet!');
}
return self::$languages_values[$value];
}

}
?>
In de opzet hierboven wordt telkens als je getConstName() aanroept eerst gecontroleerd of de property languages_values wel is geset, en daarna wordt gecontroleerd of de value in die array voorkomt.

Nu heb ik er dit van gemaakt:

Voorbeeld 2:

<?php
class Language {

const DUTCH = 1;

static private $languages_values;

static public function getConstName($value) {
if (!isset(self::$languages_values[$value])) { // extra controle
if (!isset(self::$languages_values)) {
$ref_class = new \ReflectionClass(self::class);
self::$languages_values = array_flip($ref_class->getConstants());
}
if (!isset(self::$languages_values[$value])) {
thow new \Exception('de value bestaat niet!');
}
}
return self::$languages_values[$value];
}

}
?>
Ik heb er dus een extra if-statement omheen gezet, die direct al kijkt of de value bestaat. Wat vinden jullie van deze aanpak?
>> Als je alleen magic numbers probeert weg te werken ben je goed bezig door constanten te gebruiken.

Dat is wat ik probeer. Ik wil dus voorkomen dat ik bijv. een woordenboek krijg met 1 = mannelijk. Liever wordt het dan male = mannelijk. Maar ik moet dan dus die "male" weer terugkrijgen aan de hand van de value 1.

>> Al voelt het gebruik van reflection om de tekstuele waarde te verkrijgen nog steeds een beetje als een hack.

Tja... weet je een betere oplossing? :-s

>> Je zou een speciale classloader kunnen maken die de init methode aanroept als de net geladen class een bepaalde (InitializeOnAutoload?) interface implementeert.

Oké... dan zou ik dat dus in mijn autoloader zetten, zoiets als?

<?php
if ($class instanceof InitializeOnAutoload) {
$class::init();
}
?>
Zou zoiets de boel niet erg vertragen, aangezien je dan per class een extra controle moet uitvoeren?
Een if statement per class per uitvoer van een script dat voor merkbare vertraging gaat zorgen? Wat ben jij van plan om voor/achter de instanceof check te zetten?
Ik stel voor dat je je tijd beter besteed door sql queries te optimaliseren of een OPCode cache voor php installeert en configureert.
Hé... tis maar een vraag hè :) Da's voor mij ook nieuw om zoiets te doen.

Ik vraag me alleen dus af hoe ik dat moet aanpakken. Ik heb dus een autoload function:

<?php

public function autload($class) {

}

?>
Nu krijg ik in die autload function dus de class-naam binnen, maar dat is nog geen object. En omdat het geen object is kan ik ook niet checken of het een instance is van InitializeOnAutoload. Hoe kan ik dat het beste aanpakken?
Volgens mij is daar de is_a() functie voor
Ik snap het niet Dos. Die is_a verwacht ook een object. En ik heb helemaal geen object, maar alleen een class-naam.
Dan blijft is_subclass_of() over
Haha... die werkt inderdaad :)
Lol!!!

Ik ga er morgen even mee spelen. Thanks ;)

Reageren