Locale functie
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)
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
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
*/
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
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).
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