classes automatisch laden wanneer nodig dus geen AutoLoader of toch wel?
ik heb een vraag naast het feit dat ik met frameworks bezig ben om OOP te leren ben ik ook bezig met eigen classes te maken om het OOP denken onder de knie te krijgen en nu kwam ik ergens niet uit
stel ik wil classes gebruiken maar hoe zorg ik ervoor dat deze geladen worden als ik ze nodig heb?
moet ik hier een autoloader voor gebruiken of automatisch laden met zoietss
en moet hier ook een class voor gemaakt worden dan?
Je kunt beide gebruiken, kijk anders even naar de Zend Autoloader, weet je ook meteen hoe dat eruit ziet.
want ik wil bijv een class niet altijd gebruiken ( bijv mail class ofzo ) dan wil ik hem alleen laden wanneer ik dat wil dan gebruik ik dus bovenstaande code maar moet hier ook een class voor gemaakt worden of is dit een ingebakken php code?
Je moet onderscheid maken tussen wat je altijd wilt gebruiken en wat je soms wilt gebruiken.
Altijd gaat in de autoloader, de rest haal je op als je het nodig bent :)
of dat deze een php functie is die je zomaar kan aanroepen.
Toevoeging op 28/06/2012 11:30:22:
edit: ik heb even als autoloader dit gemaakt.. maar ik krijg een error waar ik niet echt uitkom
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
function __autoload($className) {
$base = dirname(__FILE__);
$path = explode('_', $className);
$class = strtolower(implode('/',$path));
$file = $base . "/" . $class;
if (file_exists($file)) {
require $file;
}
else {
error_log('Class "' . $className . '" could not be autoloaded');
throw new Exception('Class "' . $className . '" could not be autoloaded from: '.$file);
}
}
?>
function __autoload($className) {
$base = dirname(__FILE__);
$path = explode('_', $className);
$class = strtolower(implode('/',$path));
$file = $base . "/" . $class;
if (file_exists($file)) {
require $file;
}
else {
error_log('Class "' . $className . '" could not be autoloaded');
throw new Exception('Class "' . $className . '" could not be autoloaded from: '.$file);
}
}
?>
deze error is als volgt:
Fatal error: Uncaught exception 'Exception' with message 'Class "loginform" could not be autoloaded from: /Applications/MAMP/htdocs/library/loginform' in ...
dus hij kan hem niet laden. de manier waarop ik het op probeer te halen is.
$login = new loginform();
include je de pagina ook?
/Applications/MAMP/htdocs/library/loginform
loginform.php?
maar dan krijg ik Fatal error: Class 'lib_loginform' not found in /Applications/MAMP/htdocs/library/index.php on line 24
Is die class wel in index.php?
Wat is je root?
Wat is het volledige pad naar de classes die je probeert te laden?
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
+------------+
| index.php |
+------------| |
| | lib |
| library | |
+------------+------------+
| |
| classes |
| |
+------------+
| index.php |
+------------| |
| | lib |
| library | |
+------------+------------+
| |
| classes |
| |
+------------+
waarbij de classes in lib zitten.
Gewijzigd op 28/06/2012 12:49:13 door Reshad F
Dan moet je dus blijkbaar nog die lib opnemen in je pad, want dat zie ik nergens terugkomen.
/Applications/MAMP/htdocs/library/lib/loginform/lib/.php
de echte pad moet zo zijn
/Applications/MAMP/htdocs/library/lib/loginform.php
en deze krijg ik ook want als ik lib er apart inzet krijg ik een foutmelding. en anders niet.
even voor de duidelijkheid: root:index.php en lib(folder)
lib(folder): class.php, class2.php etc etc
het probleem is dus dat hij van dit
de class moet pakken maar hij denkt dat de class lib_loginform heet wat dus niet zo is
Gewijzigd op 28/06/2012 13:23:59 door Reshad F
$car = new loginform();
Fatal error: Class 'loginform' not found in /Applications/MAMP/htdocs/library/index.php on line 24
hieronder mijn volledige code.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL|E_STRICT);
function __autoload($className) {
$base = dirname(__FILE__);
$path = explode('_', $className);
$class = strtolower(implode('/',$path));
$file = $base . "/" . "/lib/" . $class . '.php';
if (file_exists($file)) {
require $file;
}
else {
error_log('Class "' . $className . '" could not be autoloaded');
throw new Exception('Class "' . $className . '" could not be autoloaded from: '.$file);
}
}
$car = new loginform();
?>
ini_set('display_errors', 1);
error_reporting(E_ALL|E_STRICT);
function __autoload($className) {
$base = dirname(__FILE__);
$path = explode('_', $className);
$class = strtolower(implode('/',$path));
$file = $base . "/" . "/lib/" . $class . '.php';
if (file_exists($file)) {
require $file;
}
else {
error_log('Class "' . $className . '" could not be autoloaded');
throw new Exception('Class "' . $className . '" could not be autoloaded from: '.$file);
}
}
$car = new loginform();
?>
Erwin H op 28/06/2012 12:11:44:
Waar staat je index.php?
Wat is je root?
Wat is het volledige pad naar de classes die je probeert te laden?
Wat is je root?
Wat is het volledige pad naar de classes die je probeert te laden?
Schrijf het gewoon eens helemaal, duidelijk en onder elkaar uit. Ga dan kijken wel relatieve pad je dus nog moet maken en hoe je dat kan construeren. Hetzij vanuit de class name, hetzij met voorgedefinieerde waardes.
hieronder een printscreen. (let even niet op de loginform.php die in de library folder staat dat was als testje
http://cl.ly/371m2B2g2g192k473Q0T
include 'lib/loginform.php';
Werkt het dan wel?
wat ik opmerk is: $car = new form(); pakt dan de class form in het bestandje loginform.php
maar wanneer ik de loader gebruik dan pakt hij class form in form.php ipv uit inlogform.php
dus hij verwacht dat het bestandje ook zo heet.
Gewijzigd op 28/06/2012 16:08:07 door Reshad F
Maar goed, als een directe include wel werkt, dan wordt het tijd om gewoon eens te controleren wat je autoloader nu wel en niet laadt. Echo het eens voor de include zou ik zeggen, zie je meteen waar het mis gaat.