autoloading functies
Classes kunnen we automatisch laden wanneer we deze voor de eerste maal aanroepen. Voor functies bestaat niet zo 'n mogelijkheid. Indien we dit zouden willen dan kunnen we in plaats van een functie een class schrijven en daarin de __invoke methode plaatsen. Deze methode wordt aangeroepen als we een class willen aanroepen als een methode. Dus als een functie.
Voorbeeld 1:
Voorbeeld 2
Het is natuurlijk een kunstgreep. Het voordeel is dat je niet een include moet gebruiken maar een new. Als je functie(class) verplaatst wordt dan moet alleen je autoloader aangepast worden en verder geen enkel ander bestand waar je deze functie gebruikt.
Echt leuk zou zijn als PHP ook een autoloader voorziet voor functies. Iets voor 5.4/6.0?
Graag jullie gedachten.
Marc
Voorbeeld 1:
Code (php)
Voorbeeld 2
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
class function_trippel
{
private $_number;
public function __construct($number)
{
$this->_number = $number;
}
public function __invoke($number=NULL)
{
if( NULL === $number ) $number=$this->_number;
return 3*$number;
}
public function __tostring()
{
$out = $this->__invoke($this->_number);
return "$out";
}
}
$oho = new function_trippel(321);
echo $oho;
?>
class function_trippel
{
private $_number;
public function __construct($number)
{
$this->_number = $number;
}
public function __invoke($number=NULL)
{
if( NULL === $number ) $number=$this->_number;
return 3*$number;
}
public function __tostring()
{
$out = $this->__invoke($this->_number);
return "$out";
}
}
$oho = new function_trippel(321);
echo $oho;
?>
Het is natuurlijk een kunstgreep. Het voordeel is dat je niet een include moet gebruiken maar een new. Als je functie(class) verplaatst wordt dan moet alleen je autoloader aangepast worden en verder geen enkel ander bestand waar je deze functie gebruikt.
Echt leuk zou zijn als PHP ook een autoloader voorziet voor functies. Iets voor 5.4/6.0?
Graag jullie gedachten.
Marc
Ik bedacht ook nog deze methode.
In het bestand waar je een aantal functies wilt gebruiken zonder een include van deze functies te moeten doen met een hardcoded path zou je dit kunnen zetten:
In het bestand library.maths.php staat dan:
Je __autoload moet dan verwijzen naar het bestand library.maths.php.
door het new commando laad php automatisch (via de __autoload) de functies.
Beter toch?
Marc.
In het bestand waar je een aantal functies wilt gebruiken zonder een include van deze functies te moeten doen met een hardcoded path zou je dit kunnen zetten:
In het bestand library.maths.php staat dan:
Je __autoload moet dan verwijzen naar het bestand library.maths.php.
door het new commando laad php automatisch (via de __autoload) de functies.
Beter toch?
Marc.
Gewijzigd op 01/01/1970 01:00:00 door Marc Cools
Quote:
Nee, daar kun je beter nog even voor wachten tot de volgende versie van PHP, wanneer we met packages kunnen werken. Daarnaast is het doel van __autoload ook heel anders.Beter toch?
Verder zie ik niet het verschil met:
library::load('maths');
Het voordeel daarvan is dat je niet weer extra code in al je libs moet zetten om het werkbaar te krijgen.
Jan Willem,
kan je wat meer vertellen van die packages? of een link? Niets op php.net gevonden.
Marc
kan je wat meer vertellen van die packages? of een link? Niets op php.net gevonden.
Marc
Waarom wil je autoloaded functies?
Als je gewoon OO bezig gaat hoef je toch geen losse functies te laden?
Als je gewoon OO bezig gaat hoef je toch geen losse functies te laden?
Je kan dit toch gewoon doen door dit te doen:
En je hebt niet genoeg gezocht op php.net dan.. http://be2.php.net/manual/en/language.namespaces.php
Dit is trouwens al mogelijk vanaf 5.3 en niet in een volgende versie zoals men hier vermeldde
En je hebt niet genoeg gezocht op php.net dan.. http://be2.php.net/manual/en/language.namespaces.php
Dit is trouwens al mogelijk vanaf 5.3 en niet in een volgende versie zoals men hier vermeldde
Het is eigenlijk waar. Ik kan beter alle functies per soort in een class smijten. De tijd van losse functies is voorbij ...
De namespace toestanden vindt ik toch maar niks. Behalve voor constanten dan maar - raar maar waar - het trekt nergens op. Visueel lelijk! Zeg nu zelf:
Voor een class zou ik geen namespaces gebruiken. Het kan verwarren, zeker met includes. Vergelijk:
Dat laatste is minder verwarrend en ... mooier.
Marc
P.S.: welke namespace gaat PHP nu gebruiken voor ERRORPAGE?
{global}\defaults ? of {global}\THF\Core\View\defaults ? of {global}\THF\Core\defaults ? of ...
Lap: de backslash smijten ze er hier al uit. Namespaces rock! ... NOT !
De namespace toestanden vindt ik toch maar niks. Behalve voor constanten dan maar - raar maar waar - het trekt nergens op. Visueel lelijk! Zeg nu zelf:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
// lelijk: (Is het een path? Nee, het is een namespace!)
$a = defaults\ERRORPAGE;
// mooi:
$a = defaults::ERRORPAGE;
?>
// lelijk: (Is het een path? Nee, het is een namespace!)
$a = defaults\ERRORPAGE;
// mooi:
$a = defaults::ERRORPAGE;
?>
Voor een class zou ik geen namespaces gebruiken. Het kan verwarren, zeker met includes. Vergelijk:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
namespace THF\Core\View
$page = new page(defaults\ERRORPAGE);
// toch liever:
$page = THF_Core_View_Page(defaults::ERRORPAGE);
?>
namespace THF\Core\View
$page = new page(defaults\ERRORPAGE);
// toch liever:
$page = THF_Core_View_Page(defaults::ERRORPAGE);
?>
Dat laatste is minder verwarrend en ... mooier.
Marc
P.S.: welke namespace gaat PHP nu gebruiken voor ERRORPAGE?
{global}\defaults ? of {global}\THF\Core\View\defaults ? of {global}\THF\Core\defaults ? of ...
Lap: de backslash smijten ze er hier al uit. Namespaces rock! ... NOT !
Gewijzigd op 01/01/1970 01:00:00 door Marc Cools




