Crew algemeen |
|
Hoi Sima's!
Voor mijn eigen frameworkje ben ik een Core class aan het maken die classen kan laden. Heel simpel ziet dat er zo uit:
<?php
class Core {
function loadClass($name) {
if ($name::$makeInstance === true) {
return new $name;
} else {
return true;
}
}
}?>
<?php class Core { function loadClass($name) { if ($name::$makeInstance === true) { return new $name; } else { return true; } } }?>
Het is de bedoeling dat er een object van de te laden class wordt aangemaakt. Maar bij abstracte classen kan dat niet, daar moet je een object van een van de childklassen maken. Dat is op zich geen probleem, maar wel als ik moet checken of de class die ik ga laden abstract of een interface is. Volgens mij bestaat er geen manier om het type van de class op te vragen. Nu dacht ik het op te lossen door in classen waar geen object van mag worden gemaakt een variabele te setten die door de core class wordt gedetecteerd:
<?php
abstract class Database {
static $makeInstance = false;
}?>
<?php abstract class Database { }?>
Maar ik heb problemen om die variabele op te vragen... Database::$makeInstance werkt, maar dat heeft geen nut omdat die class loader dynamisch moet zijn. $name::$makeInstance geeft een error ("Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM") dus dat werkt niet. property_exists($name, 'makeInstance') geeft wel of makeInstance bestaat, maar dan weet ik nog steeds niet of het op true of false staat. Ik kan ook alle variabelen van de class opvragen met get_class_vars($name), maar dat is natuurlijk niet echt efficiënt.
Als laatste dacht ik nog aan eval('return ' . $name . '::$makeInstance;'), dat werkt wel, maar dat lijkt me ook een beetje omslachtig... Weet iemand hier een betere oplossing? Hoe zouden jullie dit doen?
|