login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[PHP]Veel gebruikt stukje OOP

Offline Esli - 29/07/2010 16:32 (laatste wijziging 29/07/2010 16:32)
Avatar van EsliPHP interesse Hallo,

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:

  1. public function __set($var, $value)
  2. {
  3. throw new Error('Kan property '.$var.' niet aanmaken (onbekend).'.CLASS_ERROR);
  4. }
  5. public function __get($var)
  6. {
  7. throw new Error('Kan property '.$var.' niet aanroepen (onbekend).'.CLASS_ERROR);
  8. }


(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:

  1. /* config bestand aanroepen */
  2. /* een class */
  3. /* vars */
  4. /* constructor ... */
  5. public function __get()
  6. {
  7. NAAM_VAN_DIE_ENE_CLASS::get();
  8. }
  9. public function __set()
  10. {
  11. NAAM_VAN_DIE_ENE_CLASS::set();
  12. }
  13. /* 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 .

Alvast bedankt!



11 antwoorden

Gesponsorde links
Offline gnotrgnotr - 29/07/2010 20:37
Avatar van gnotrgnotr Nieuw lid zou ik de hele code mogen?
Offline Esli - 29/07/2010 21:30
Avatar van Esli PHP interesse 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.
Offline ArieMedia - 29/07/2010 21:33
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
Ik vind hier niks mis mee eigenlijk, misschien dat je met property_exists kan werken..
Offline Esli - 29/07/2010 22:26
Avatar van Esli PHP interesse 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.
Offline ArieMedia - 29/07/2010 23:12 (laatste wijziging 29/07/2010 23:15)
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
Edit: Lol, het is al laat.. zat verkeerd te denken 
Offline Esli - 29/07/2010 23:30 (laatste wijziging 30/07/2010 00:58)
Avatar van Esli PHP interesse 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 :-)

  1. <?php
  2. class test {
  3. private $_testvar;
  4.  
  5. public function __construct()
  6. {
  7. //code
  8. }
  9.  
  10. public function __set($var, $value)
  11. {
  12. echo 'Enkel ingestelde properties ;-)';
  13. }
  14. public function testvar($input)
  15. {
  16. $this->_testvar = $input;
  17. echo $this->_testvar;
  18. }
  19. }
  20.  
  21. $testje = new test;
  22. $testje->bestaatniet = 'Try it!';
  23. $testje->testvar('<br/>dit mag wel');
  24. //Output:
  25. //Enkel ingestelde properties ;-)
  26. //dit mag wel
  27. ?>


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.
Offline ArieMedia - 30/07/2010 01:37
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
Esli schreef:
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).
Offline Stijn - 30/07/2010 01:57
Avatar van Stijn PHP expert
Citaat:
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.
Bedankt door: xSc
Offline Ontani - 30/07/2010 08:50
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
normaal hoor je zo'n dingen ook via Abstraction te doen en niet via CLASSNAME::get();
Bedankt door: xSc
Offline Esli - 30/07/2010 11:59
Avatar van Esli PHP interesse 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.
Offline xSc - 30/07/2010 12:34
Avatar van xSc Onbekend @Esli, ik begrijp je probleem inderdaad.

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 

Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.213s