Stel, ik heb een bepaalde simpele functionaliteit nodig.
En omdat ik die vaak aanroep stop ik die het liefst in een function.
Maar BINNEN die function is er een subfunctie die meermaals BINNEN die functie wordt gebruikt.
(of zoals in het voorbeeld gewoon voor de leut)

Nu kan ik me niet meer herinneren of ik ooit een hogere programmeertaal ben tegengekomen die niet met locale functies overweg kon. Dus functies gedeclareerd binnen een functie die daarbuiten niet zichtbaar zijn.

Maar in PHP ben ik dat nog nergens in het gebruik, de leerboeken, de voorbeelden, de documentatie tegengekomen. Toch werkt het. Zelfs soepel, ik bedoel, zelfs gedeclareerd ná code.

HERSTEL DE BEWERING!
Bij hernieuwde aanroep faalt de code.
PHP 'onthoudt' de locale functie en stopt met een 'previous declared' foutmelding.
PHP kan niet overweg met locale functies.
(Weer wat geleerd)


De vraag: Wordt dat door julie professionals gebruikt? Of is dat (en waarom dan) onbehoorlijk PHP?
Voorbeeld van een locale functie:


// unix timestamp van nl-mysql-vs-datum OF nl-tijd 
function timeStamp($dt = null) {
    if ($dt == null) {
        $dt = time();
        return $dt;
    }

    function eeuwJaar($j) {
        if (strlen($j) == 2) {
            if ($j > 40)
                $j = 1900 + $j;
            else
                $j = 2000 + $j;
        }
        return $j;
    }

// tijd
    if (strpos($dt, ':') > 0) {
        $a = explode(':', $dt);
        $H = $a[0];
        $i = $a[1];
        $s = 0;
        return mktime($H, $i, $s, date('m'), date('d'), date('Y'));
    }
// nl of mysql datum
    if (strpos($dt, '-') > 0) {
        $a = explode('-', $dt);
        if (strlen($a[0]) == 4) {
            $j = $a[0];
            $m = $a[1];
            $d = $a[2];
        } else {
            $d = $a[0];
            $m = $a[1];
            $j = $a[2];
        }
    }
// vs datum
    if (strpos($dt, '/') > 0) {
        $a = explode('/', $dt);
        $d = $a[1];
        $m = $a[0];
        $j = $a[2];
    }
// jaartal correctie
    $j = eeuwJaar($j);
    return mktime(date('H'), date('i'), date('s'), $m, $d, $j);
}


$invoer = '8/9/78';
print date('d-m-Y', timeStamp($invoer));
print '<br/>';
print date('Y-m-d', timeStamp());

/*
09-08-1978
2017-06-22
*/

Dank je Ward.
Nested functions, aan die zoekterm had ik niet gedacht :-)

Zoals ik het heb beleefd is OO langzaam uit de procedurele aanpak ontstaan uit de behoefte afhankelijke code bijeen te houden en overzicht te houden.
Eerst hadden we mogelijkheid binnen één functie ondergeschikte functies te declareren. Alles bijeen.
Vervolgens werden dat 'units' met locale declaratie en initiëring.
Dat werden als vanzelf de 'classes' van het objectmodel.

Je weet, het is moeilijk oude gewoontes af te leren.
Dus heb ik nog steeds de neiging eenvoudige zaken procedureel af te wikkelen.

Naar ik heb begrepen is, om overzicht te houden op de vele classes, in php 7 het begrip
'namespace' ingevoerd. Maar daar ben ik nog niet aan toe... :-)

Reageren