exceptions... daar gaan we weer
Offtopic:
Wat is dit eigenlijk? Wat doe je hier?
Code (php)
Snelle en hele lelijke methode om de 2 exception klassen aan te maken:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
explode(' ', 'Foo Bar'); // is eigenlijk gewoon array('Foo', 'Bar');
array_map(function ($i) { ... }, $array); // is eigenlijk gewoon foreach ($array as $i) { ... }
eval("class {$i}Exception extends Exception {}");
// eval voert de string als PHP uit (hartstikke gevaarlijk)
// en $i is Foo en Bar, om zo FooException en BarException te maken die \Exception extenden
?>
explode(' ', 'Foo Bar'); // is eigenlijk gewoon array('Foo', 'Bar');
array_map(function ($i) { ... }, $array); // is eigenlijk gewoon foreach ($array as $i) { ... }
eval("class {$i}Exception extends Exception {}");
// eval voert de string als PHP uit (hartstikke gevaarlijk)
// en $i is Foo en Bar, om zo FooException en BarException te maken die \Exception extenden
?>
Is dat niet lastig om zo even uit je mouw te schudden? :-s
En eigenlijk denk ik, nu ik er wat langer over nadenk, dat dit zelfs mooier en sneller was geweest:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
spl_autoload_register(function ($c) {
eval("class {$c} extends Exception { }");
});
?>
spl_autoload_register(function ($c) {
eval("class {$c} extends Exception { }");
});
?>
Hehe... grappig :) Je blijft me verbazen, hahaha...
eval vaak wordt uitgeschakeld in de PHP.ini omdat het wordt beschouwd als een onveilige functie.
Buiten dat, waarom een spl_autoload_register die een Exception extend en niet eerst zoeken of de class in een ander bestand staat? Lijkt mij dat dáár de autoload juist voor is toch?
Houd er overigens rekening mee dat Buiten dat, waarom een spl_autoload_register die een Exception extend en niet eerst zoeken of de class in een ander bestand staat? Lijkt mij dat dáár de autoload juist voor is toch?
Chris - op 12/12/2013 09:24:54:
Houd er overigens rekening mee dat eval vaak wordt uitgeschakeld in de PHP.ini omdat het wordt beschouwd als een onveilige functie.
Buiten dat, waarom een spl_autoload_register die een Exception extend en niet eerst zoeken of de class in een ander bestand staat? Lijkt mij dat dáár de autoload juist voor is toch?
Buiten dat, waarom een spl_autoload_register die een Exception extend en niet eerst zoeken of de class in een ander bestand staat? Lijkt mij dat dáár de autoload juist voor is toch?
Het is puur opzichzelf staand voorbeeld code om een punt te maken. Het is een truckje dat je eigenlijk alleen tijdens testen of voorbeeldjes wilt gebruiken.
Is alleen niet direct duidelijk voor beginners, vandaar mijn note :)
Chris - op 12/12/2013 09:24:54:
Buiten dat, waarom een spl_autoload_register die een Exception extend en niet eerst zoeken of de class in een ander bestand staat? Lijkt mij dat dáár de autoload juist voor is toch?
En daarbij: als je toch via spl_autoload_register() aan de slag gaat met SPL, waarom dan niet ook de SPL exceptions gebruiken?
Gewijzigd op 12/12/2013 11:33:40 door Ward van der Put
Euh guys, het was gewoon een code-trucje van Wouter gebaseerd op het voorbeeldje dat ik eerder had gegeven. Niks aan de hand dus.
Ja, dat wisten we al, "eval is evil", alleen vroeg ik me af: wáárom zou je \Exception extenden als dat al is gedaan in de SPL Exceptions?
Zoals ik zei... Wouters voorbeeld was een afgeleide van mijn voorbeeld waarbij ik een FooException en een BarException had gebruikt.
De code die Ozzie had gegeven is dit:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
try {
throw new FooException('foo');
} catch (FooException $e) {
throw new BarException('bar');
} catch (BarException $e) {
echo 'hallo!';
}
?>
try {
throw new FooException('foo');
} catch (FooException $e) {
throw new BarException('bar');
} catch (BarException $e) {
echo 'hallo!';
}
?>
Als je dat draait bestaan er 2 classes niet en krijg je een error. Dat wilde wouter niet. Dus maakte hij (op een minder saaie manier) de classes aan. Hij wilde het werkend krijgen, dus Exception extenden is het makkelijkst. Het is ook nog eens pseudo code, dus waarom zou je SPL Exceptions er bij gaan betrekken?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
// begin code die nodig is om het voorbeeld te laten werken en er voor de rest totaal niet toe doet
class FooException extends Exception {}
class BarException extends Exception {}
// eind code die nodig is om het voorbeeld te laten werken en er voor de rest totaal niet toe doet
// begin code waar het om ging
try {
throw new FooException('foo');
} catch (FooException $e) {
throw new BarException('bar');
} catch (BarException $e) {
echo 'hallo!';
}
// eind code waar het om ging
?>
// begin code die nodig is om het voorbeeld te laten werken en er voor de rest totaal niet toe doet
class FooException extends Exception {}
class BarException extends Exception {}
// eind code die nodig is om het voorbeeld te laten werken en er voor de rest totaal niet toe doet
// begin code waar het om ging
try {
throw new FooException('foo');
} catch (FooException $e) {
throw new BarException('bar');
} catch (BarException $e) {
echo 'hallo!';
}
// eind code waar het om ging
?>
Vind je het nu nog nodig om SPL Exceptions te gebruiken bij een boorbeeld? Zolang jij niet aangeeft in welke context je de vraag stelt neem ik aan dan het in de huidige context gevraagt wordt: een voorbeeld dat de een klein geïsoleerd gedrag duidelijk maakt. Niet een voorbeeld dat best practices demonstreert wat beginners zouden moeten volgen.
Is dat een goede reden waarom \Exception extenden in die context net zo goed is als SPL Exceptions classes extenden?
Ik zal voortaan wel weer gewoon basic PHP gaan gebruiken :P
Hehe, lol :)