"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
Ja, maar zoals gezegd in de startpost weet ik niet hoe ik hiermee om moet gaan / denk ik niet dat dit is wat ik zoek. Ik heb het scriptje uit de startpost wat aangepast:Marcj schreef op donderdag 22 maart 2007 @ 20:02:
Bedoel je de stack trace? debug_backtrace() geeft je een heleboel info
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| function foo() { $calling_function = debug_backtrace(); print_r($calling_function); return 'foo wordt nu aangeroepen vanuit ' . $calling_function; } function bar($param) { if ($param) { // do cool stuff } $var = foo(); // $var wordt "foo wordt nu aangeroepen vanuit bar" } function mil() { $var = foo(); echo $var; // geeft: "foo wordt nu aangeroepen vanuit mil" } mil(); |
De output hiervan is:
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
| Array ( [0] => Array ( [file] => C:\Program Files\Apache\Apache2\htdocs\test\backtrace.php [line] => 18 [function] => foo [args] => Array ( ) ) [1] => Array ( [file] => C:\Program Files\Apache\Apache2\htdocs\test\backtrace.php [line] => 23 [function] => mil [args] => Array ( ) ) ) foo wordt nu aangeroepen vanuit Array |
Ik weet niet hoe ik deze output moet interpreteren: het lijkt alsof debug_backtrace alle functies opsomt die op de pagina voorkomen. Dit is echter geen oplossing voor mijn probleem; ik wil alleen de naam hebben van de functie die foo() aanroept. In dit geval run ik alleen mil() dus wil ik alleen "mil" gereturned zien...
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
Overigens, als je dit voor andere dingen gaat gebruiken dan om debug/profile-redenen dan is je design ruk
[ Voor 18% gewijzigd door .oisyn op 22-03-2007 20:33 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Heb je dat stuk op de pagina wel goed gelezen? Het lijk me dan niet zo moeilijk... bijv:
1
2
3
4
5
6
7
| <?php function foo() { $calling_function = debug_backtrace(); $calling_function = $calling_function[1]['function']; return 'foo wordt nu aangeroepen vanuit ' . $calling_function; } ?> |
Nou zeg.oisyn schreef op donderdag 22 maart 2007 @ 20:31:
Overigens, als je dit voor andere dingen gaat gebruiken dan om debug/profile-redenen dan is je design ruk
Het is natuurlijk eenvoudig om een argument mee te geven aan foo:
1
2
3
4
5
6
7
8
9
10
11
| function foo($calling_function) { return 'foo wordt nu aangeroepen vanuit' . $calling_function; } function mil() { $var = foo('mil'); echo $var; // geeft: "foo wordt nu aangeroepen vanuit mil" } mil(); |
Maar ik vroeg me af of het ook niet anders kon, zoals mij dus net is uitgelegd
Waar wilde ik het voor gebruiken:
Ik maak in mijn cms gebruik van een eigen gemaakte gettext achtige functie. Maar ik wil graag bij elke string meegeven in welke functie deze staat. In veel functies heb ik tientallen strings. Het leek me wat overbodig om telkens de functienaam als argument mee te moeten geven:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| function t($key, $function) { $language = array(); // from database return $language[$function][$key]; } function mil() { if ($stuff) { return t('do cool stuff', 'mil'); } else { return ($uncool) ? t('do uncool stuff', 'mil') : t('do nothing', 'mil'); } return t('no stuff executed', 'mil'); } |
Ik werd een beetje moedeloos van het idee dat ik op honderden plaatsen in mijn code de functienaam moet tikken. Het leek mij makkelijker als t() zou kunnen uitlezen welke functie een string wil hebben:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| function t($key) { $calling_function = debug_backtrace(); $calling_function = $calling_function[1]['function']; $language = array(); // van database return $language[$calling_function][$key]; } function mil() { if ($stuff) { return t('do cool stuff'); } else { return ($uncool) ? t('do uncool stuff') : t('do nothing'); } return t('no stuff executed'); } |
Los van het feit dat zo'n design ruk is (
[ Voor 5% gewijzigd door Reveller op 22-03-2007 20:55 ]
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
Ik onderhoud het product zelf, en voor mij geeft de functienaam een context aan voor de string. Als je een string goed wil vertalen, is een context altijd goed, want anders ga je maar letterlijk vertalen en dat kan als een tang op een varken slaanMarcj schreef op donderdag 22 maart 2007 @ 20:57:
Ik ben alleen benieuwd waarom je de functienaam nodig bent bij het vertalen van stukken tekst?
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
Je gaat toch niet de vertaling van een stukje tekst rechstreeks aan je code knopen
Maak gewoon een unieke key aan die beschrijft wat voor textje er moet komen:
DO_COOL_STUFF
DO_SOME_OTHER_SHIT
SHIT_BE_DONE
weet ik veel, wat je zelf maar wil hebben.
Dan kan je t() functie nog altijd blijven, en een globale var uitlezen waarin je de translate language definieert, die de keyword opzoekt uit je translate array / tabel en klaar
1
2
3
4
5
6
7
8
9
| $t = array( 'USER_EMAIL_TAKEN' => 'The e-mail address %email is already taken.', 'USER_EMAIL_DENIED' => 'The e-mail address %email has been denied access.', 'USER_EMAIL_ENTER' => 'You must enter an e-mail address.', 'USER_EMAIL_INVALID' => 'The e-mail address %email is not valid.', 'USER_EMAIL_SENDER' => 'Email sender', 'USER_EMAIL_SUBJECT' => 'Email subject', // etc ); |
Maar het leek me handig om de vertaling van de tekst te koppelen aan de functie waarin de tekst voorkomt, om zo een stukje context mee te geven. Maar ik sta een beetje alleen in de overtuiging dat dit handig is, merk ik
Ik kreeg het idee overigens van MyReact, wat op eenzelfde manier lijkt te werken. Zie myreact\global\non-www\plugins\locale\en_US\LC_MESSAGES\admin.po.php:
1
2
3
4
5
6
7
| $messages = array( "admin::lookup_user::fuzzy_search" => "Fuzzy search", "admin::global_search::global_search" => "Global Search", "admin::lookup_user::special_users_header" => "Special users", "admin::lookup_users::special_users" => "Special users" // etc ); |
Ik lees de eerste regel als class: admin; method -> lookup_user; key -> fuzzy_search. Ik was wel enthousiast over deze werkwijze
[ Voor 28% gewijzigd door Reveller op 22-03-2007 23:14 ]
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
edit: wat janoz dus ook zegt...
[ Voor 6% gewijzigd door Marcj op 23-03-2007 09:53 ]