Locale functie

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Paul Ulje

Paul Ulje

22/06/2017 10:41:13
Quote Anchor link
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:

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// 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
*/
Gewijzigd op 22/06/2017 11:21:19 door Paul Ulje
 
PHP hulp

PHP hulp

25/04/2024 12:13:48
 
Ward van der Put
Moderator

Ward van der Put

22/06/2017 12:31:39
Quote Anchor link
Korte verwijzing naar een lang antwoord:

https://stackoverflow.com/questions/415969/what-are-php-nested-functions-for

Nee, ik zou geen methoden binnen methoden definiëren, bij objectgeoriënteerd programmeren dus, omdat het indruist tegen separation of concerns (SoC) en het single responsibility principle (de S uit SOLID).
 
Paul Ulje

Paul Ulje

22/06/2017 13:25:40
Quote Anchor link
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... :-)
Gewijzigd op 22/06/2017 13:28:40 door Paul Ulje
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.