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.

3 Stron V  < 1 2 3  
Reply to this topicStart new topic
> Metaprogramowanie w PHP
metadetron
post 10.05.2010, 10:47:25
Post #41





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 10.05.2010

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


Nie wiem czy to już metaprogramowanie czy tylko generowanie kodu, ale ja używam do tego Apache Velocity, które mi generuje klasy PHP. Skrypt wygląda w uproszczeniu tak:
  1. class virgo${tr.FV($entity.name)} extends JTable {
  2. var $${entity.prefix}_id = null;
  3. #foreach( $property in $entity.properties )
  4. var $${entity.prefix}_${tr.f_v($property.name)} = null;
  5. #end
  6. ...

Wszak każdy projekt jest bardzo podobny - są tabele i kolumny. Żeby nie klepać ciągle tego samego mam program, który mi to pisze za mnie.
Go to the top of the page
+Quote Post
dariuszp
post 9.09.2010, 23:07:35
Post #42





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 9.09.2010

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


Metaprogramowanie. Temat na tyle obszerny i dla mnie mało znany że sam nie wiem czy dobrze go rozumie ale chciał bym o coś zapytać.

Otóż swego czasu poszedłem sobie na spore ułatwienie. Otóż pisałem mappery do dość obszernej bazy danych i miało to troszkę potrwać. Dopóki nie wpadłem na mały pomysł. Otóż dopisałem po prostu kod PHP który zwyczajnie w wypadku braku obiektu danych dla mappera bazy danych łączy się z bazą, pobiera informacje o tabeli do której odnosi się mapper (lub tabel, kwestia co mapper dokładnie robi ale takich co odnoszą się do +1 tabeli mam mało) i... tworzy klasę obiektu danych dla tej tabeli i zapisuje do pliku. Taki plik jest później po prostu includowany przez system.
Podobnie jest z mapperami ale tu zaoszczędza mi to tylko połowę pracy. Bo czasami mapper potrzebuje specyficzną metodę tylko dla siebie. Jednak i tak mam oszczędzone żmudne klepanie.

W każdym razie PHP wychodzi na przeciw naszym potrzebą. Mój system nie tylko potrafi sobie wygenerować obiekt danych jeżeli nikt go nie zapewni na podstawie bazy danych ale tez i na podstawie mappera (który ma bazę translacji gdzie wewnętrzna zmienna bądź tablica ma info co powinno się przyporządkować jakiemu atrybutowi obiektu danych). Osiągnąłem to w dość prosty sposób (choć jak pierwotnie o tym pomyślałem to wydawało mi się to niemożliwe).

Użyłem token_get_all();. Funkcja ta jest w stanie wczytać z pliku kod PHP, rozbić go na czynniki pierwsze i zaserwować nam tablicę. Używając token_name() identyfikuję cyferki na nazwy i łatwo wyłapuje elementy składni. Ich lista znajduje się tutaj: http://www.php.net/manual/en/tokens.php

W skrócie. PHP jest w stanie W PEŁNI zanalizować kod PHP a co dalej zrobicie to Wasza sprawa. Pamiętajcie tylko by zachować to na specjalne przypadki bo nie są to operacje lekkie. Sam umieściłem takie rozwiązanie tylko w paru drobnych miejscach jak właśnie przy mapperach. W razie gdy nie chce mi się tworzyć obiektów danych bądź też po prostu zapomniałem o tym, system sam zaopiekuje się tym problemem jeżeli odnajdzie mappera bądź tabelę w bazie danych.

I taka ciekawostka dla Was. Swego czasu napisałem małe narzędzie które odchudziło mi kod PHP. Powyższym sposobem wyciąłem WSZYSTKIE białe znaki (co najlepsze nie potrzeba wyrażeń regularnych, ciągi znaków w "" i '' są oznaczone w tablicy jako string, reszta jako elementy składni więc nie można wyciąć białych znaków np z komunikatów przypadkiem), komentarze itp. Po instrukcjach wstawiłem spację (żeby nie dostać classDatabase tylko class Database) no i upewniłem się że po -> nie ma spacji ( $obiekt->include() to nie to samo co $obiekt -> include() ) a całą resztę zostawiłem w spokoju. Pozbyłem się też komentarzy.

Wyszło na to że 31% mojego kodu w systemie to spacje, tabulatory i komentarze. Ponieważ rozmiar plików zmniejszył się do 69%. W każdym razie PHP potrafi o siebie zadbać :-)


W każdym razie to pytanie:
Czy gdy system sam się potrafi odchudzić (wywołując sobie odchudzanie na nowych plikach, dorabianie sobie obiektów danych w razie czego itp), uzupełnić itp wg wytycznych (listę tego co usunąć np umieszczam w phpdoc nad metodą która to robi. PHP jest w stanie również dobrać się od tych komentarzy. A ktoś czytając kod klasy jest w stanie powiedzieć co ona wywali. Mało tego, modyfikując komentarz modyfikuje zachowanie klasy.) itp to możemy tutaj mówić o metaprogramowaniu ?

Ten post edytował dariuszp 9.09.2010, 23:11:03
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 19.03.2024 - 09:59