Source code uitlezen van een functie
Nu loop ik tegen één klein probleem aan dat ik voor een functie de code bij me documentatie wil laten generen.
Is er een makkelijke manier om de source van een bepaalde functie op te halen.
of moet het gewoon maar met een aantal regexen ?
Ik snap niet precies wat je bedoelt, maar ik denk dat je een soort code block wil creëren? Of kun je het anders wat duidelijker uitleggen, eventueel met een voorbeeldje?
http://nl3.php.net/manual/en/function.explode.php
Daar heb je idd een code block met een example nu wil ik ongeveer ook zoon code block.
maar dan met de functie zelf kwa code.
dus ik maak function test() { echo "test"; }
en dan wil ik die code in dat code block zetten.
Daar heb je idd een code block met een example nu wil ik ongeveer ook zoon code block.
maar dan met de functie zelf kwa code.
dus ik maak function test() { echo "test"; }
en dan wil ik die code in dat code block zetten.
en dan kan je in je css pre enof code opmaken :)
met de volgende functie
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
private function getComments($filename)
{
$expr = "/((?:\/\*(?:[^*]|(?:\*+[^*\/]))*\*+\/)|(?:\/\/.*))/";
$file = fopen($filename, "r");
$length = filesize($filename);
$comments = fread($file, $length);
preg_match_all($expr, $comments, $matchs);
foreach($matchs[0] as $id => $variable){
$comments = str_replace($variable,'',$comments);
}
fclose($file);
}
?>
private function getComments($filename)
{
$expr = "/((?:\/\*(?:[^*]|(?:\*+[^*\/]))*\*+\/)|(?:\/\/.*))/";
$file = fopen($filename, "r");
$length = filesize($filename);
$comments = fread($file, $length);
preg_match_all($expr, $comments, $matchs);
foreach($matchs[0] as $id => $variable){
$comments = str_replace($variable,'',$comments);
}
fclose($file);
}
?>
Haal ik all mijn phpdoc style comments uit een class.
Vevolgens maak ik daar een mooi object van blablabla.
maar nu wil ik ook de functie him zelf in het object toevoegen zo dat ik ook een source code van de functie zelf kan weergeven op mijn pagina.
Hoop dat ik me nu beter duidelijk gemaakt heb.
Reshad F op 13/07/2012 10:42:45:
Gewijzigd op 13/07/2012 10:48:31 door Rowdy van der Meer
En anders zul je dit inderdaad met REGEXEN op moeten lossen.
En mischien omdat het niet alleen een PHPdoc wordt maar ook meteen anderen documentatie en dan vond ik het toch wel handig om alles in eigen beheer te hebben en niet afhankelijk ben van een derde partij.
Je bent sowieso afhankelijk van een derde partij. Of draait jouw pc op een fiets?
verwijder dit topic maar.
Wouter vraagt alleen waarom je het wiel opnieuw uit wil vinden. Er zijn mensen die het werk al voor jou gedaan hebben, en dan hoogstwaarschijnlijk nog veel beter ook.
Overigens verwijderen we niet zomaar topics hier, dus ga verder met je vraag. :-)
En volgens mij had ik het antwoord al gegeven, je hebt hier inderdaad regexen voor nodig. In PHP bestaat niet zoiets als in JS waarbij je elke functie naar een string kan omtoveren. Alleen ook dat wordt een heel karwei. Want je kan niet zomaar `function .*?\(.*?\) {(.*?)}` gebruiken, aangezien je dan totaan de eerste volgende } matched, wat ook een if statement kan zijn bijv. Maar als je die ? weghaalt match je het hele bestand vanaf de eerste functie totaan de laatste.
http://www.php.net/manual/en/class.reflectionfunction.php
Je kunt dan met ReflectionFunction::getFileName(), ReflectionFunction::getStartLine(), ReflectionFunction::getEndLine() en file() aan de gang om de code te krijgen.
Reflection is een beter manier dan regex: Je kunt dan met ReflectionFunction::getFileName(), ReflectionFunction::getStartLine(), ReflectionFunction::getEndLine() en file() aan de gang om de code te krijgen.
Mijn excuses daarvoor.
De reden dat ik me eigen PHPDoc parser maak is vrij simpel.
Ik wil binnen mijn framework de documenten kunnen laten generen.
Dit met cach bestanden voor het bestand ingeladen wordt gewoon simpel kijken of de source aangepast is na de laatste phpdoc generate is dat niet het geval laat het bestand van de cache is en anders genereer een nieuwe versie.
Heb geprobeerd dit met behulp van de phpdocs die momenteel te verkrijgen zijn maar daar kreeg ik het niet voor elkaar om het resultaat te behalen die ik eigenlijk wens.
Momenteel heb ik het volgende al werken.
- Browse door source om alle phpdoc format comments te verzamelen.
- Genereren van een sitemap.
- HTML template
- Cashe verhaal
- phpdoc comments parsen en deze mooi overzicht weergeven.
Het enigste wat ik nog wens is dan het verhaal van de source code van de functie.
Ik had zelf het idee om het via regel nummers te doen eerst kijken welk nummer de phpdoc commens einigen vervolgens zoek het begin van de volgende phpdoc comment.
Lees de lines tussen die 2 regels zo dat ik de source code van de functie heb./
Maar volgens mij moet dit makkelijke kunnen dan deze op lossing en minder bug gevoeliger. aangezien dit nog wel is goed fout geparst kan worden.
Zie mijn vorige post voor meer info over wat je er voor nodig hebt.
even mee wezen stoeien en het volgende resultaat behaald.
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
{
(string) $str = "";
(array) $arr = array();
$str = "1,2,3,4,5,6,7,8,9,10";
$arr = explode(',', $str);
return implode(';',$arr);
}
(string) $str = "";
(array) $arr = array();
$str = "1,2,3,4,5,6,7,8,9,10";
$arr = explode(',', $str);
return implode(';',$arr);
}
Mocht er iemand zijn die het zelfde wil bereiken hier is de code die ik gebruik voor het resultaat hier boven aangegeven
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
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
<?php
function testfunction()
{
(string) $str = "";
(array) $arr = array();
$str = "1,2,3,4,5,6,7,8,9,10";
$arr = explode(',', $str);
return implode(';',$arr);
}
$func = new ReflectionFunction('testfunction');
$filename = $func->getFileName();
$start_line = $func->getStartLine();
$end_line = $func->getEndLine();
$length = $end_line - $start_line;
$source = file($filename);
$body = implode("", array_slice($source, $start_line, $length));
echo "<pre>";
print_r($body);
?>
function testfunction()
{
(string) $str = "";
(array) $arr = array();
$str = "1,2,3,4,5,6,7,8,9,10";
$arr = explode(',', $str);
return implode(';',$arr);
}
$func = new ReflectionFunction('testfunction');
$filename = $func->getFileName();
$start_line = $func->getStartLine();
$end_line = $func->getEndLine();
$length = $end_line - $start_line;
$source = file($filename);
$body = implode("", array_slice($source, $start_line, $length));
echo "<pre>";
print_r($body);
?>
ps De functie is gewoon een testfunctie even snel wat ingezet slaat eigenlijk nergens op de functie maar toch :p
Gewijzigd op 17/07/2012 10:14:41 door Rowdy van der Meer
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$reflectionFunc = new \ReflectionFunction('testfunction');
echo $reflectionFunc->getDocComment();
?>
$reflectionFunc = new \ReflectionFunction('testfunction');
echo $reflectionFunc->getDocComment();
?>
En je kan ook een hele klasse met properties en functies reflecteren doormiddel van ReflectionClass en ReflectionProperty en ReflectionMethod en zelfs ReflectionParameter. Ik had er nog nooit van gehoord, maar ziet er erg goed uit!
ziet er inderdaad goed uit.
misschien dat het meteen me traagheid in me script oplost.
Het opnieuw generen van een documentatie pagina duurt nu bijna 1.5 seconde vind ik vrij lang ?
Quote:
vind ik vrij lang ?
Voor veel bestanden niet, PHPdoc is ook niet heel erg snel bij grote bestanden.
En even een stukje code gemaakt zo dat ik mooi een de source code krijg van de functie die ik ophaal.
mocht iemand interesse hebben in de code wil ik deze wel delen stuur een pm of plaats een reactie.
Het is beter om de code hier op het forum te zetten of op een website als pastbin.com of snippler.com, zo hebben mensen er straks ook nog wat aan.
Ik ben daar dan wel benieuwd naar. Niet dat ik het direct kan/ga gebruiken, maar leren kan nooit kwaad.