Binnen een php applicatie begint elk bestand met een phpDoc style comment block. Daaronder begint de code. Het kan best zijn dat er verderop in het bestand ook phpDoc commentblocks staan, zoals hier bij de functie bar()
Ik tracht een functie te schrijven die $data inleest en:
Nu ben ik - onder andere door te Googlen en het bekijken van een aantal topics op GoT die hierover gaan - al een heel eind op weg:
Probleem: mijn code neemt alle phpcode (de functies foo() en bar()) mee alszijnde value van de laatste @token in het commentblock (hier: @todo).
Oplossing:Ik kan dit tegengaan door de "*/" in regel 9 te gebruiken als "stopteken" voor mijn functie.
Vraag: (1) Hoe kan ik die oplossing implementeren? (2) En hoe veilig is dat? De gegevens uit de $info array worden uiteindelijk aan de gebruiker getoond. De applicatie zelf is echter closed source en ik moet dus voorkomen dat code meegenomen wordt in die array (en dus getoond wordt aan klanten). Ik twijfel dan ook hoe bullet-proof deze oplossing is, dus ook daarover graag jullie mening
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| $data = " /** * @file Hier een hoop informatie over deze file * Kan doorgaan op de volgende regel * @author me@example.com * @version 2010-05-01 * @todo - iets leuks toevoegen * - minder leuke dingen weghalen */ function foo($bar) { return 'baz!'; } /** * Comment bij functie bar() * @param Array met dingen */ function bar($baz) { echo $baz; } "; |
Ik tracht een functie te schrijven die $data inleest en:
- alle comment blocks behalve de eerste negeert
- het eerste commentblock ontdoet van alle asteriksen en whitespace
- en vervolgens splitst in een array met als key elke @token uit het block
code:
1
2
3
4
5
6
| Array ( [file] => Hier een hoop informatie over deze file. Kan doorgaan op de volgende regel [author] => me@example.com [version] => 2010-05-01 [todo] => - iets leuks toevoegen \r\n - minder leuke dingen weghalen ) |
Nu ben ik - onder andere door te Googlen en het bekijken van een aantal topics op GoT die hierover gaan - al een heel eind op weg:
PHP:
1
2
3
4
| $data = trim(preg_replace('/\r?\n *\* */', ' ', $data)); preg_match_all('/@([a-z]+)\s+(.*?)\s*(?=$|@[a-z]+\s)/s', $data, $matches); $info = array_combine($matches[1], $matches[2]); print_r($info); |
Probleem: mijn code neemt alle phpcode (de functies foo() en bar()) mee alszijnde value van de laatste @token in het commentblock (hier: @todo).
Oplossing:Ik kan dit tegengaan door de "*/" in regel 9 te gebruiken als "stopteken" voor mijn functie.
Vraag: (1) Hoe kan ik die oplossing implementeren? (2) En hoe veilig is dat? De gegevens uit de $info array worden uiteindelijk aan de gebruiker getoond. De applicatie zelf is echter closed source en ik moet dus voorkomen dat code meegenomen wordt in die array (en dus getoond wordt aan klanten). Ik twijfel dan ook hoe bullet-proof deze oplossing is, dus ook daarover graag jullie mening
"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."