Versio

autoloading functies

Overzicht Reageren

Marc Cools

Marc Cools

05/10/2009 23:59:00
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
class function_verdubbel
{
    public function __invoke($number)
    {

        return 2*$number;
    }
}

$verdubbel = new function_verdubbel;
$aha = $verdubbel(123);
echo $aha;
?>

Voorbeeld 2
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
?>

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
 
PHP hulp

PHP hulp

23/05/2012 22:06:26
Gesponsorde koppelingen:
 
Marc Cools

Marc Cools

06/10/2009 12:39:00
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
new library_maths;

$aha = verdubbel(123);
echo $aha;
?>

In het bestand library.maths.php staat dan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?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.
Gewijzigd op 01/01/1970 01:00:00 door Marc Cools
 
Jan Willem van der Veer

Jan Willem van der Veer

06/10/2009 15:04:00
Quote Anchor link
Quote:
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');
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?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.
 
Marc Cools

Marc Cools

07/10/2009 17:43:00
Quote Anchor link
Jan Willem,

kan je wat meer vertellen van die packages? of een link? Niets op php.net gevonden.

Marc
 
TJVB tvb

TJVB tvb

07/10/2009 17:50:00
Quote Anchor link
Waarom wil je autoloaded functies?
Als je gewoon OO bezig gaat hoef je toch geen losse functies te laden?
 
Hipska BE

Hipska BE

07/10/2009 18:00:00
Quote Anchor link
Je kan dit toch gewoon doen door dit te doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?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
 
Marc Cools

Marc Cools

08/10/2009 20:20:00
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?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 !
Gewijzigd op 01/01/1970 01:00:00 door Marc Cools
 



Overzicht Reageren

Get Adobe Flash player