login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Classes automatisch laden

Offline Riny - 30/06/2006 15:00 (laatste wijziging 30/06/2006 15:00)
Avatar van RinyNieuw lid Beste,

Ik had vanmorgen even niets te doen (genoeg te doen maar even geen zin;-))..

Dus ik dacht: Laat ik eens proberen om m'n classes automatisch in te laden en ze aan de core mee te geven..

Toen kwam ik op deze source:
Klikje!

Ik heb in de includes/classes/ map een sql class staan, de file heet sql.class.php en de class zelf heet clsSql..

Nou roep ik dus de core class aan..

En kijk ik even met get_declared_classes of de clsSql is aangeroepen..

Deze is niet aangeroepen .. clsCore wel maaar clsSql niet..

Weet iemand wat ik fout doe?

Alvast bedankt,
Riny 

9 antwoorden

Gesponsorde links
Offline Stijn - 30/06/2006 15:12 (laatste wijziging 30/06/2006 15:13)
Avatar van Stijn PHP expert je gebruikt dus php5. In php5 is hiervoor een functie gemaakt, namelijk __autoload();

probeer dit eens in je pagina.php:
  1. <?php
  2. function __autoload( $class )
  3. {
  4.  
  5. include('./includes/classes/' . $class . '.class.php');
  6.  
  7. }
  8.  
  9. $obj = new sql(); //nu wordt /includes/classes/sql.class.php ingeladen dbv __autoload
  10.  
  11. $obj->query(..); //blabla
  12. ?>


stijn

[edit]
wil je dit topic eens onder de categorie: object georienteerd zetten want dit is PHP en OOP
Offline Riny - 30/06/2006 15:14 (laatste wijziging 30/06/2006 15:14)
Avatar van Riny Nieuw lid Dankje stijn voor je reactie ..

Maar ik snap het nog niet helemaal jammer genoeg,
Moet ik deze functie gebruiken in mijn class, zoja kan ik het dan combineren?

Zou je misschien een voorbeeldje willen geven in combinatie met mijn class?

Alvast bedankt 

Edit: Sorry voor de verkeerde categorie.
Offline Stijn - 30/06/2006 15:26 (laatste wijziging 30/06/2006 15:29)
Avatar van Stijn PHP expert ik zal ff een voorbeeld geven. aangezien ik je class code niet heb van je sql class zal ik maar een voorbeeld geven.

[includes/classes/sql.class.php]
  1. <?php
  2. class sql
  3. {
  4. public function __construct( $user , $pass , $db , $host )
  5. {
  6. mysql_connect( $host , $user , $pass );
  7. }
  8.  
  9.  
  10. public function query( $query )
  11. {
  12. return mysql_query( $query );
  13. }
  14.  
  15. }
  16. ?>


nu gaan we dit gebruiken voor onze site of andere php applicatie.

[index.php]
  1. <?php
  2. function __autoload( $class )
  3. {
  4.  
  5. include('./includes/classes/' . $class . '.class.php');
  6.  
  7. }
  8.  
  9. $obj = new sql("username" , "password" , "database" , "localhost"); //nu wordt /includes/classes/sql.class.php ingeladen dbv __autoload( )
  10.  
  11. $obj->query("SELECT * FROM test"); //blabla
  12. ?>


snap je het nu wat beter? Hij included de class automatisch waneer deze wordt aangeroepen.
meer info: http://www.php....toload.php

stijn

[edit]

ik raad je aan om je class namen en je file namen hetzelfde te noemen.
[goed] -> class sql :: sql.class.php
[fout] -> class sql :: sqlLite.class.php
Offline Riny - 30/06/2006 15:28
Avatar van Riny Nieuw lid Ah zo! 

Nu snap ik het beter Stijn.
Ik heb ook net te horen gekregen dat mijn manier wat ranzig was, dus ik ga even een nieuwe structuur bedenken. Daar kan die __autoload goed van pas komen.

Bedankt 
Offline Gerard - 30/06/2006 15:43
Avatar van Gerard Ouwe rakker Je manier hoeft niet ranzig te zijn als je eens gaat werken met een singleton core class. Op die manier krijg je het resultaat wat je zelf wilt, blijft het overzichtelijk (kijk naar Zend FrameWork) en ben je goed bezig. 

Autoload is leuk als je niet met een core class wilt werken.
Offline nemesiskoen - 30/06/2006 16:11
Avatar van nemesiskoen Gouden medaille

PHP expert
Autoload is opzichzelf iets leuk maar ik toch heb ik liever zelf meer controle over wat er gebeurd.
Als je nu bv. twee mappen hebt waar je klassen in staan zal je al een prefix moeten meegeven in welke map de klasse zich bevindt.
Als je gewoon alle klassen inlaadt dan heb je dat probleem niet. Je zou zelfs (zoals het bij ZEND is als ik me niet vergis) op volgende manier tewerk kunnen gaan:

  1. // ik zeg niet dat hetgeen hieronder per definitie werkt bij ZEND maar het idee is ongeveer hetzelfde
  2. $db = Core::load("DataBase", $params); // of "Database", $param1, $param2, ...


Dan kan je dus zien, bestaat de klasse?
==> instantciëren
Anders: opsoren. Het idee is hetzelfde en toch heb je iets meer controle. Je kan bv. dan een nieuwe parameter introduceren die dan het path voorstelt waar de klasse zich bevindt, of zoals ik bij NF heb gedaan:

  1. $core = Core::getInstance();
  2. $core->setDirectory("Nemesis");
  3. $core->loadClass("ExceptionHandler");
  4. $core->loadClass("OutputHandler");
  5. // etc...
  6. /* <-- horen niet bij Framework, horen bij applicatie */
  7. $core->setDirectory("classes");
  8. $core->loadClass("Gebruiker");
  9. $core->loadClass("ClientInfo");
  10. /* horen niet bij Framework, horen bij applicatie --> */


Zo heb ik zelf het gevoel dat ik meer controle erover heb. En het is per klasse toch maar één lijntje toevoegen. Als je dan al een standaard load file hebt is dit geen probleem. Als je al zo verdwaald bent met het inladen van klassen dat je zoveel klassen hebt dan ben je IMO verkeerd bezig. Je moet ten allentijde overzicht hebben IMO.
Offline Riny - 30/06/2006 16:21
Avatar van Riny Nieuw lid Dankje nemesiskoen!

Daar heb ik veel aan, zal me er even in gaan verdiepen!

Wel een mooi voorbeeld wat je daar gaf 
Offline Gerard - 30/06/2006 17:08
Avatar van Gerard Ouwe rakker Het voorbeeld is van het nemesis framework wat hij zelf heeft gemaakt. Het is te downloaden bij scripts > php > grote systemen
Offline nemesiskoen - 30/06/2006 21:12
Avatar van nemesiskoen Gouden medaille

PHP expert
Waarvan ik vandaag weer een update heb geupload:)

Ontopic: als er mensen zijn die er anders over denken dan ik, gelieve dan te reageren (met wel een beetje deftige argumenten) want een mening kan altijd veranderen:)
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.313s