Ik ben momenteel een scriptje aan het schrijven. Ik wens in mijn scripts enkel properties te gebruiken die ikzelf heb gedefinieerd. Ik probeer dit dus op een mooie manier doen. Hieronder zie je hoe ik dit doe:
public function __set($var, $value)
{
throw new Error('Kan property '.$var.' niet aanmaken (onbekend).'.CLASS_ERROR);
}
public function __get($var)
{
throw new Error('Kan property '.$var.' niet aanroepen (onbekend).'.CLASS_ERROR);
}
publicfunction __set($var,$value)
{
throw new Error('Kan property '.$var.' niet aanmaken (onbekend).'.CLASS_ERROR);
}
publicfunction __get($var)
{
throw new Error('Kan property '.$var.' niet aanroepen (onbekend).'.CLASS_ERROR);
}
(Error is een uitbreiding die ik op de standaard exception class heb geschreven. CLASS_ERROR is ofwel gelijk aan niets ofwel gelijk aan de naam van de class.)
Ik gebruik dit stukje code echter in veel van mijn classes. Het lijkt me dus verstandiger dit ergens in een apart bestand te stoppen dat aan te roepen. Echter vraag ik me af hoe ik dit het verstandigste doe.
Zelf dacht ik aan een class waarin ik deze stukjes code zet. Die class zou ik dan aanroepen (het is te zeggen, autoload doet dat voor mij ) en als volgt gebruiken:
/* config bestand aanroepen */
/* een class */
/* vars */
/* constructor ... */
public function __get()
{
NAAM_VAN_DIE_ENE_CLASS::get();
}
public function __set()
{
NAAM_VAN_DIE_ENE_CLASS::set();
}
/* vervolg van de class */
/* config bestand aanroepen */
/* een class */
/* vars */
/* constructor ... */
publicfunction __get()
{
NAAM_VAN_DIE_ENE_CLASS::get();
}
publicfunction __set()
{
NAAM_VAN_DIE_ENE_CLASS::set();
}
/* vervolg van de class */
Echter lijkt me dat er een mooiere en/of gemakkelijkere manier is. Hopelijk zijn hier nog mensen die graag regels besparen en hier iets mooi voor weten .
Op zich wel, maar dat doet helemaal niet ter zake. Ik gebruik deze code in verschillende classes, die totaal andere functies hebben... Dus ik zie er niet direct het nu van in.
Dat komt op zich op hetzelfde neer. Al vind ik deze methode mooier. __set en __get worden automatisch gebruikt als een property niet bestaat, dus dan weet je ook zeker dat je een error kan returnen. Met property_existst moet ik nog zaken gaan bouwen die het controleren. Mijn bedoeling is gewoon dat ik dat niet telkens in elke class moet zetten.
Ik begrijp wat je bedoelt, maar dan gebruik je de class anders dan ik dat doe.
Ik denk dat jij het volgende voorstelt: Je gaat er vanuit dat ik via __set al mijn properties instel. Met __get haal ik deze dan op. Dit doe ik echter niet. Ik heb hiervoor mooie methods :-).
Als ik bv. select_config($path, $config) als method (functie) zou nemen, dan weet ik dat ik een config wil gaan selecteren. Ik ga dus met file_existst gaan kijken of die config wel bestaat. Als ik dit via mijn set zou moeten gaan doen, moet ik nog meer controles uitvoeren.
Ik denk dus als volgt: gebruik je niet de methods die ik heb gemaakt om de properties in te stellen, dan krijg je gewoon een error.
Ik begrijp wat je bedoelt, maar dan gebruik je de class anders dan ik dat doe.
Ik denk dat jij het volgende voorstelt: Je gaat er vanuit dat ik via __set al mijn properties instel. Met __get haal ik deze dan op. Dit doe ik echter niet. Ik heb hiervoor mooie methods :-).
Als ik bv. select_config($path, $config) als method (functie) zou nemen, dan weet ik dat ik een config wil gaan selecteren. Ik ga dus met file_existst gaan kijken of die config wel bestaat. Als ik dit via mijn set zou moeten gaan doen, moet ik nog meer controles uitvoeren.
Ik denk dus als volgt: gebruik je niet de methods die ik heb gemaakt om de properties in te stellen, dan krijg je gewoon een error.
Even stukje code wat het duidelijker maakt :-)
[..code..]
Edit
Dit stukje hierboven moet je niet op letten, was een reactie op de persoon "hierboven".
Ik zit echter te denken aan een abstracte class. Misschien is dat wel een mooi idee.
Ik denk dat als jij alleen wil dat gedefinieerde properties & methods gebruikt mogen worden, en geen set/get gebruikt mag worden, het voorbeeld in je topic goed is.. (misschien nog final toevoegen wil je het 100% __set en __get tegengaan).
Ik denk dat als jij alleen wil dat gedefinieerde properties & methods gebruikt mogen worden, en geen set/get gebruikt mag worden
Hoe ga jij een klasse verbieden om een methode niet te maken? Je kan een basis klasse maken met die methodes final maar moet je enkel van die klasse overerven. Als je nog een tweede klasse wilt overerven, dan zit je met de patatten en ga je moeten schakels in je klassendiagram tussenvoegen en dat is een puinhoop. Als je toch wilt dat programmeurs geen properties aanroepen die niet in je klasse staan, dan zou ik die functies eruit laten. Onbestaande properties benaderen levert een notice error op van PHP. Die dingen kan je loggen door een eigen error handler te schrijven.
Inderdaad, ik ga dit met een abstracte klasse doen. Dat was ook mijn vraag, ik had het gevoel dat er een mooiere manier was. Ik ben nu dus op het idee gekomen: abstracte classes.
@Stijn, ik ben het 100% eens met je. Maar ik vind de werking zoals die nu is prima. Het systeem dat ik aan maken ben, is niet zo zeer om verder op te breien door andere programmeurs maar vooral voor mezelf. Er zijn maar een paar zaken waar ik de andere mensen toegang tot zal geven, en dan zal voornamelijk gaan om template-functies.
En om op Ontani's opmerking aan te haken: http://framewor...model.html (bekijk de class Application_Model_Guestbook). Dit topic heeft me wel geholpen om het beter te begrijpen