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:
<?php
class function_verdubbel
{
public function __invoke($number)
{
return 2*$number;
}
}
$verdubbel = new function_verdubbel;
$aha = $verdubbel(123);
echo $aha;
?>
Voorbeeld 2
<?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;
?>
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:
<?php
new library_maths;

$aha = verdubbel(123);
echo $aha;
?>
In het bestand library.maths.php staat dan:
<?php
class library_maths{}

function verdubbel($number)
{
return 2*$number;
}
?>
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.
Beter toch?
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.

Verder zie ik niet het verschil met:
library::load('maths');
<?php
class library {
static function load($lib){
#load-lib.
}
}
?>
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
Waarom wil je autoloaded functies?
Als je gewoon OO bezig gaat hoef je toch geen losse functies te laden?
Je kan dit toch gewoon doen door dit te doen:

<?php

Math::verdubbel($getal);

?>

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:
<?php
// 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:
<?php
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 !

Reageren