Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zasady pisania na forum Pro

Tematy na forum Pro mogą zakładać jedynie moderatorzy. W otwartych tematach może pisać każdy, kto ma coś fachowego do powiedzenia. Wszystkie posty nie wnoszące nic do tematu będą natychmiast usuwane, a ich autorzy dostaną ostrzeżenie.
Jeśli uważasz, że jakiś temat jest warty dyskusji na tym forum, zgłoś go w temacie Propozycje.

> PHP preprocessor
hawk
post 20.04.2004, 16:13:11
Post #1





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

Ostrzeżenie: (0%)
-----


Chodzi mi po głowie taki "preprocesor" albo "kompilator" do php. Hmm, wyobraźcie sobie że macie jakiś obiektowy systemik - powiedzmy kilkanaście klas, w tym interfejsy (PHP5). I chciałoby się wypuszczając oficjalną wersję tego systemiku wrzucić to wszystko do jednego pliku, bo i tak te klasy się nazwajem potrzebują. A interfejsy w ogóle nie są potrzebne - tylko ułatwiają pisanie - i można je całkowicie usunąć.

I uruchamiałoby się taki preprocesor, który mergowałby pliki, usuwał (niepotrzebne już) instrukcje require_once(...) itd. Sprawa nie jest prosta, bo preprocesorowi trzeba jakoś powiedzieć, co ma do czego przerzucić, a co zostawić w spokoju. No i nie może on absolutnie pogubić się i wprowadzać do kodu nowe błędy.

Czy takie coś może istnieje? Czy to jest w ogóle dobry pomysł?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
bela
post 10.04.2005, 01:01:57
Post #2


Administrator PHPedia.pl


Grupa: Developerzy
Postów: 1 102
Pomógł: 2
Dołączył: 14.09.2003

Ostrzeżenie: (0%)
-----


Cytat(hawk @ 2005-03-29 15:20:10)
Fajny przykład, i dobrze pasuje do dyskutowanego ostatnio autoloadera winksmiley.jpg. Ja bym z tego oczywiście zrobił klasę. I zrobiłbym system pluginów do tej klasy, pobierających tekst pliku i zwracających przetworzony tekst pliku. Np. plugin usuwający komentarze, wycinający whitespace, itd. I takie pluginy można łączyć w łańcuszek - co po kolei ma być zrobione.

No ba, już jest gotowe winksmiley.jpg
  1. <?php
  2. class PreProcessor {
  3. private $plugins;
  4. private $config;
  5. private $fileContent;
  6. private $files;
  7. public function __construct() {
  8. }
  9.  
  10. public function start () {
  11. $this->files = $this->getF($this->config);
  12. $this->loadFiles();
  13. $this->processPlugins();
  14. }
  15.  
  16. private function getFiles($dir) {
  17. $aFiles = array();
  18. foreach($dir as $d) {
  19. $rd = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $d ), true );
  20. foreach ($rd as $file) {
  21. if(!$file->isDir() && end(explode('.', $file)) == &#092;"php\") {
  22. $aFiles[] = $file->getPathname();
  23. }
  24. }
  25. }
  26. return $aFiles;
  27. }
  28.  
  29. public function setConfig($aConfig) {
  30. $this->config = $aConfig;
  31. }
  32.  
  33. public function getConfig () {
  34. return $this->config;
  35. }
  36.  
  37. public function setPlugins($aPlugins) {
  38. $this->plugins = $aPlugins;
  39. }
  40.  
  41. public function getPlugins () {
  42. return $this->plugins;
  43. }
  44.  
  45. private function getF($aF) {
  46. $rf = array_diff($this->getFiles($this->config['dirs']), $this->getFiles($this->config['disabled_dirs']));
  47. $rf = array_merge($rf, $this->config['files']);
  48. $rf = array_merge(array_diff($rf, $this->config['disabled_files']));
  49. return $rf;
  50. }
  51.  
  52. private function processPlugins() {
  53. foreach($this->plugins as $k => $v) {
  54. $plugin = new $v;
  55. $this->fileContent = $plugin->process($this->fileContent);
  56. }
  57. }
  58.  
  59. private function loadFiles() {
  60. foreach($this->files as $k => $v) {
  61. $this->fileContent[$v] = file_get_contents($v);
  62. }
  63. }
  64.  
  65. private function getFileContent() {
  66. return $this->fileContent;
  67. }
  68.  
  69. public function setFileContent($content) {
  70. $this->fileContent = $content;
  71. }
  72.  
  73. public function save($dir = null) {
  74. foreach($this->fileContent as $k => $v) {
  75. file_put_contents($dir . $k, $v);
  76. }
  77. }
  78. }
  79.  
  80. class comments {
  81. function __construct() {
  82. }
  83.  
  84. function process($files) {
  85. foreach($files as $k => $v) {
  86. $files[$k] = php_strip_whitespace($k);
  87. }
  88. return $files;
  89. }
  90. }
  91.  
  92. function dump($dump) {
  93. print('<pre>');
  94. var_dump($dump);
  95. print('</pre>');
  96. }
  97.  
  98. $files = array(
  99.  'dirs' => array(''),
  100.  'disabled_dirs' => array(''),
  101.  'files' => array(''),
  102.  'disabled_files' => array(''),
  103. );
  104.  
  105. $pre = new PreProcessor();
  106. $pre->setConfig($files);
  107. $pre->setPlugins(array('comments'));
  108. $pre->start();
  109. $pre->save('new/');
  110. print 'Hehe, udalo sie preprocesorawac kod;)';
  111. ?>


Cytat
Albo inny pomysł - łańcuch przetwarzania powinien mieć postać: input -> processing -> output. Tzn. niech będzie interfejs odpowiedzialny za dostarczanie contentu - np. pobierając z pliku, pobierając z listy plików, itd. Drugi interfejs/klasa to główne przetwarzanie i obróbka zagregowanego contentu. A na koniec interfejs zapisujący wynik obróbki. Taki pipeline pozwala na elastyczne dopasowywanie do potrzeb i dopisywanie nowej funkcjonalności.

Najlepiej byłoby opracować coś takiego i wydać razem z autoloaderem...

edit: Coraz bardziej podoba mi się pipeline. Można nawet pójść trochę w stronę Cocoona: zrobić sobie drzewko przetwarzania, gdzie na wejściu (liść) jest input, na wyjściu (korzeń) output, a w środku cokolwiek - agregacja, filtrowanie, wycinanie komentarzy, itd.

Możesz bardziej łopatologicznie napisać ;]


--------------------
Go to the top of the page
+Quote Post

Posty w temacie
- hawk   PHP preprocessor   20.04.2004, 16:13:11
- - seaquest   IMHO pomysł ciekawy, ale nieopłacalny. Załóżmy, że...   20.04.2004, 17:09:16
- - Nalfein][WR   Właśnie dlatego ten prekompilator musiałby być kon...   20.04.2004, 18:37:26
- - hawk   Hmm, ja zakładam że: 1) preprocesor odpalam sobie ...   20.04.2004, 18:37:41
- - Nalfein][WR   No jakoś trzeba. Ja wykorzystuję swój generator ko...   20.04.2004, 20:12:31
- - Nalfein][WR   serafin - to zarzuć może nazwą... Argument co do ...   20.04.2004, 20:17:31
- - e-Gandalf   Hawk: jej! :DDDDD Wiem, ze to niewiarygodne, ale m...   20.04.2004, 21:31:22
- - hawk   Taki preprocesor może bardzo dużo zrobić minimalny...   20.04.2004, 21:56:53
- - wojtek   To ja jeszcze wtrace swoje dwa grosze - nie wiem c...   21.04.2004, 14:22:22
- - e-Gandalf   CytatByc moze nie zrozumialem troche idei... Jesli...   21.04.2004, 16:24:34
- - e-Gandalf   No, pisalem przeciez: "Oczywiscie pewnei trzeba ...   21.04.2004, 17:50:17
- - Nalfein][WR   hawk: nie, na odwrót. Zamiast usuwać require_once ...   21.04.2004, 19:22:01
- - hawk   CytatTo ja jeszcze wtrace swoje dwa grosze - nie w...   21.04.2004, 19:32:52
- - enceladus   Dyskusja przybrała taką formę, że mogę śmiało stwi...   21.04.2004, 19:57:09
- - hawk   @Nalfein: Aaaaaa, sprytne . Chociaż wtedy jest pe...   21.04.2004, 23:07:46
- - LoPMX   Wydaje mi sie, ze lepie byloy taki preprocesor wyk...   10.07.2004, 20:48:52
- - Jabol   a może coś jak w C? Można by było nawet # zostawić...   10.07.2004, 21:05:38
- - bela_666   Stary topic, ale co tam, nie będę nowego zakładać ...   28.03.2005, 02:45:39
- - hawk   Fajny przykład, i dobrze pasuje do dyskutowanego o...   29.03.2005, 15:20:10
- - bela_666   Cytat(hawk @ 2005-03-29 15:20:10)Fajny przykł...   10.04.2005, 01:01:57
- - bela_666   Cytując manual Cytatfile_get_contents() is the pre...   10.04.2005, 09:35:42
- - Nievinny   Ok, to jeszcze zakodować to przez Zend SafeGuard (...   10.04.2005, 11:51:56
- - bela_666   php_strip_whitespace" title="Zobacz w manualu PHP"...   10.04.2005, 12:07:06
- - Nievinny   Bela -> tylko komentarze bez spacji, czyli wcię...   10.04.2005, 13:54:46
- - bela_666   Pocięcie do tokenów raczej nie załatwi sprawy, bo ...   10.04.2005, 21:40:20
- - hawk   @bela_666: łopatologicznie, hmmm... sam mam mglist...   11.04.2005, 08:45:30
- - bela_666   Cytat(hawk @ 2005-04-11 08:45:30)@bela_666: ł...   11.04.2005, 19:02:57
- - hawk   OK, przykład takiego drzewa: Koda.xml -> a.php...   12.04.2005, 09:46:14
- - NuLL   Czy może mi się tylko wydaje czypoprsotu trzeba na...   12.04.2005, 10:47:55
- - Vengeance   A czy mi się tylko wydaje, czy to wszystko jest po...   12.04.2005, 18:59:57
- - NuLL   Mimo iż dopisałem swoją wizję tego czegoś - to jes...   12.04.2005, 19:38:06
- - hawk   No dobra, jakiś bardziej praktyczny przykład takie...   21.04.2005, 16:32:37
- - Sedziwoj   Ktoś pisze interpreter PHP więc wiele można A co...   9.04.2007, 18:12:33
- - Zeman   Ja się dołączę do rozmowy. Jak robiłem pluginy d...   9.04.2007, 23:04:46
- - Sedziwoj   Chyba raczej taki błąd się nie pojawi, ale na pewn...   9.04.2007, 23:38:13
- - cicik   Przyznam się, że mi taki pomysł te...   12.04.2007, 21:16:36
- - akubiczek   Skoro temat wyskoczył do góry, to dodam jeszcze od...   16.04.2007, 13:57:22
- - g00fy   widzialem i korzystalem z takiego programu , tylko...   21.07.2007, 23:51:55


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 10.05.2024 - 19:49