Metaprogramowanie w PHP |
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.
Metaprogramowanie w PHP |
21.05.2008, 16:56:51
Post
#1
|
|
Admin Techniczny Grupa: Administratorzy Postów: 2 071 Pomógł: 93 Dołączył: 5.07.2005 Skąd: Olsztyn |
Na prośbę empathon'a zakładam niniejszy temat
|
|
|
24.06.2008, 19:04:47
Post
#2
|
|
Grupa: Zarejestrowani Postów: 15 Pomógł: 0 Dołączył: 25.11.2003 Skąd: Białe Błota Ostrzeżenie: (0%) |
-------------------- Piotr Usewicz
http://www.layer22.com |
|
|
24.06.2008, 19:06:20
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 657 Pomógł: 125 Dołączył: 29.04.2006 Ostrzeżenie: (0%) |
http://pl.wikipedia.org/wiki/Metaprogramowanie
"Metaprogramowanie może polegać nie tylko na generowaniu kodu, ale również na modyfikacjach w czasie wykonania programu. Takie możliwości dają języki LISP, Smalltalk, PHP, Python, Ruby oraz Perl." http://en.wikipedia.org/wiki/Metaprogramming "Not all metaprogramming involves generative programming. If programs are modifiable at runtime (such as in Lisp, Python, REBOL, Smalltalk, Ruby, PHP, Perl, Tcl, Lua, and JavaScript), then techniques can be used to perform metaprogramming without actually generating source code." -------------------- |
|
|
24.06.2008, 19:37:20
Post
#4
|
|
Grupa: Zarejestrowani Postów: 15 Pomógł: 0 Dołączył: 25.11.2003 Skąd: Białe Błota Ostrzeżenie: (0%) |
Tzn. ze uwazasz
za metaprogramowanie? -------------------- Piotr Usewicz
http://www.layer22.com |
|
|
24.06.2008, 19:42:21
Post
#5
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. |
@LoPMX - nie, to jest wykorzystanie możliwości składni języka w służbie polimorfizmu
metaprogramowanie natomiast... http://pl2.php.net/manual/pl/ref.classkit.php Pozdrawiam -------------------- To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness; chaotic, confused, vulnerability, to inform yourself. Think for yourself. Question authority. |
|
|
24.06.2008, 20:06:48
Post
#6
|
|
Grupa: Zarejestrowani Postów: 15 Pomógł: 0 Dołączył: 25.11.2003 Skąd: Białe Błota Ostrzeżenie: (0%) |
@ Cysiaczek : Ale po co podsylasz oczywiste linki?
Prawda jest taka, ze jest to czyste naciaganie, by nadarzac za trendem. PHP od srodka jest kiepskim jezykiem, balaganiarskim. Ale skoro uwazasz, ze chcesz uzywac tak ubogiego i malo elastycznego API to... powodzenia. -------------------- Piotr Usewicz
http://www.layer22.com |
|
|
24.06.2008, 20:08:33
Post
#7
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) |
W PHP można bardzo dobrze symulować metaprogramowanie.
Metadata/Attributes in PHP Nie sa to możliwości Javy ale też coś. Ten post edytował mike 24.06.2008, 20:10:46 |
|
|
30.06.2008, 08:56:19
Post
#8
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) |
PHP od srodka jest kiepskim jezykiem, balaganiarskim. Ale skoro uwazasz, ze chcesz uzywac tak ubogiego i malo elastycznego API to... powodzenia. To chyba niezbyt ma się z tematem, jak nie chcesz pisać w PHP, to nie pisz, ale nie zaśmiecaj tematów. @mike Ciekawy link. Nie wiem dlaczego ale jakoś mi ten sposób się nie podoba. Bo to jest pobieranie informacji poza interfejsem obiektowym, takie definiowanie właściwości poza kodem źródłowym. Jak zawsze trzeba uważać wszystkim co jest trendi, bo potem może wyjść, że nie jest tak fajne jak to malowali. Bo przecież w pisaniu kodu nie chodzi tylko aby jak najszybciej go napisać, jeszcze mamy aby był czytelny, łatwo modyfikowalny (jak również aby dało się go przetestować) Ten post edytował Sedziwoj 30.06.2008, 09:07:39 -------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
2.07.2008, 07:22:11
Post
#9
|
|
Grupa: Zarejestrowani Postów: 487 Pomógł: 7 Dołączył: 7.01.2004 Skąd: Warszawa Ostrzeżenie: (0%) |
Jakiś czas temu pisałem o adnotacjach w PHP. Jest to nieco wygodniejsze niż Metadata/Attributes in PHP. Można na podstawie tego narzędzia napisać kolejny generator ale nie będzie też problemu żeby wykorzystywać adnotacje w czasie działania (Reflection API).
LoPMX propagandy na rzecz Ruby nie potrzebujemy, jest dosyć tego śmiecia w Internecie. -------------------- Łukasz Dywicki
Independent Java and open source software consultant. Blog - Java, OSGi, integracja oprogramowania.. |
|
|
3.07.2008, 11:41:43
Post
#10
|
|
Grupa: Zarejestrowani Postów: 206 Pomógł: 18 Dołączył: 6.03.2006 Skąd: Szczecin Ostrzeżenie: (0%) |
a ja sie zgadzam z LoPMX (nie tylko w tym, ze PHP jest nieuporzadkowane - lekkie stwierdzenie - ale tez, ze w PHP metaprgramowania nie ma). i nie robie zadnej propagandy na rzecz innych jezykow, bo pisze glownie wlasnie w PHP , a juz na pewno nie na rzecz Ruby, bo nigdy go nie uzywalem (jeszcze).
przynajmniej w samym PHP. chyba, ze by podciagnac pod to eval(). oczywiscie jest rozszerzenie classkit (ale jest to stare rozwiazanie, znacznie bardziej rozwiniete jest runkit) wspomniane przez Cysiaczka, no ale rownie dobrze mozna powiedziec, ze PHP umozliwia przeciazanie operatorow, bo jest rozszerzenie Operator. natomiast co do adnotacji, czy ReflectionAPI to nie do konca jest to zgodne z definicja metaprogramowania. poniewaz to nie generuje zadnego kodu, pozwala jedynie odczytywac informacje o juz istniejacym. ReflectionAPI to nic wiecej jak reverse engineering. aczkolwiek zastanawiajaca mogla by byc taka technika:
(hah, chyba sam sobie zaprzeczylem ;P) Ten post edytował wrzasq 3.07.2008, 11:42:05 -------------------- Wrzasq.pl
Tworzenie stron i aplikacji internetowych. Chillout Development - tworzenie stron i aplikacji internetowych. |
|
|
3.07.2008, 11:48:28
Post
#11
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) |
~wrzasq a może zamiast pisać posty w odpowiedzi na coś co Ci się uroiło napisz odpowiedź na to co zostało powiedziane
Nikt nie twierdzi, że w PHP można meta programować, bo to oczywista nieprawda. Podane przykłady to przykłady gdzie takie lub podobne zachowanie jest zaledwie symulowane. Przecież w żadnym z powyższych postów nikt nie twierdzi (poza głupią wikipedią, ale ją olewamy), że to jest meta programowanie. Ten post edytował mike 3.07.2008, 11:55:33 |
|
|
25.07.2008, 10:37:59
Post
#12
|
|
Grupa: Zarejestrowani Postów: 461 Pomógł: 32 Dołączył: 17.09.2003 Skąd: Łódź Ostrzeżenie: (0%) |
Pozwolicie drodzy koledzy, że włączę się w tą dyskusję. Najpierw jednak chciałbym Was prosić o wyjaśnienie co rozumiecie pod pojęciem metaprogramowanie. Pytam ponieważ śmiem się nie zgadzać z opinią, że takie coś nie istnieje, ale być może cała rzecz rozchodziłaby się o rozumienie tego pojęcia.
Pozdrawiam, Łukasz |
|
|
25.07.2008, 21:10:00
Post
#13
|
|
Grupa: Zarejestrowani Postów: 999 Pomógł: 30 Dołączył: 14.01.2007 Skąd: wiesz ? Ostrzeżenie: (0%) |
No ja właśnie nie mam pojęcia co to jest, ale z definicji podanej przez radex'a
mam wrażenie że metaprogramowaniem jest na przykład cache pakietu smarty, który generuje wykonywalny kod PHP ze swoich tagów. edit> Chociaż z drugiej strony wydaje mi się to ostro naciągane po przeczytaniu wstępu z http://www.php.net/manual/pl/intro.runkit.php Ten post edytował orglee 25.07.2008, 21:11:44 |
|
|
26.07.2008, 11:29:42
Post
#14
|
|
Grupa: Zarejestrowani Postów: 44 Pomógł: 2 Dołączył: 27.03.2007 Skąd: Sufczyn Ostrzeżenie: (0%) |
IMHO Metaprogramowanie jest to uzupełnianie aplikacji "dodatkowymi funkcjonalnościami" już w czasie jej działania. Np. mechanizm active record pobiera z bazy danych informacje o polach w tabeli i na ich podstawie tworzy findery.
|
|
|
9.08.2008, 22:48:45
Post
#15
|
|
Grupa: Zarejestrowani Postów: 634 Pomógł: 14 Dołączył: 27.05.2006 Skąd: Berlin Ostrzeżenie: (0%) |
Z tego co zauważyłem, nie do końca wszyscy się zgadzają na temat tego co to jest meta-programowanie. Zacznę możne, wiec od przedstawienia mojego rozumowania tego terminu.
Otóż, metaprogramming bierze się z słowa metadata. Wg. wikipedia, metadata to jest "data about data" czyli dane opisujące czym są jakieś dane. Najprostszym przykładem (możne nie tak oczywistym) jest tabela danych w bazie danych. Faktyczne dane są zapisywane w tej tabeli w wierszach i kolumnach, ale dodatkowo dla kazdej tabeli jest opisywane kodowanie znaków, silnik obsługujący te dane, informacje te tak naprawdę w żaden logiczny sposób nie są powiązane z faktycznymi danymi, bo np. jaki się nazywa tabela, jakie jest kodowanie znaków tak naprawdę z logicznego punktu widzenia nie ma nic wspólnego z nazwa użytkownika, z nazwa/ilością produktów itd... ale informacje te są niezbędne do działania systemy gdyż, np. pozwalają dobrać odpowiedni algorytm sortowania, czy np. bez informacji o silniku obsługiwania tej tabeli nie jesteśmy w stanie obsłużyć tych danych. Metaprogramowanie imo, jest to dodawanie dodatkowych informacji o już istniejących strukturach danych, blokach kodu, klasach i/lub innych obiektach (nie chodzi mi o znaczenia tego słowa z perspektywy programowania obiektowego). Przekładając to na programowanie obiektowe (bo nie spotkałem się z pojęciem metaprogramowania w przypadku programowania strukturalnego), jest to dodawanie nowej funkcjonalności, badz tez "wstrzykiwania" jej do już istniejącego kodu bez ingerencji w sama jego strukturę czy tez ciało. ta nowa funkcjonalność to przede wszystkim informacje o przeznaczeniu oraz sposobie obsługi tej klasy/interfejsu itd... tak jak to się ma do tabeli w bazie danych; rodzaj kodowania czy silnik w żaden sposób nie ingerują w sama tabele (mam na myśli to ze nie zmieniają już istniejące dane) ale pomocne są w sytuacji gdy te dane muszą być obsłużone. Osobiście uważam ze metaprogramowanie (dodawanie metadanych do obiektów języka) nie jest osiągalna w 100% tak jak to ma miejsce w językach które maja ta charakterystykę wbudowana w siebie. Przykładem którym się posłużę tutaj jako język obsługujący metadane jest C#. Tam metadane są ucieleśniane poprzez Atrybuty. Atrybuty w języku C# są to klasy którymi można oznaczyć inne klasy i tak naprawdę one są czytane tylko w przypadku kiedy oznaczane klasy sa czytane przez inna część systemu. W większości przypadków jest tak ze te atrybuty oznaczają takie rzeczy jak czy dana klasa jest serializowalna itd... Dam może obszerniejszy przykład stosowania atrybutów w C# i na tym przykładzie pokaże czemu w PHP jest to nieosiągalne. Tworząc nowy web service w C# (WCF) robimy tak: Kod [ServiceContract( Name = "CalculatorService", Namespace = "http://microsoft.wcf.documentation", CallbackContract = typeof(IHelloCallbackContract), SessionMode = SessionMode.Required )] public interface ICalculator { [OperationContractAttribute(IsOneWay=true)] void Add(double n1, double n2); [OperationContract(ProtectionLevel=ProtectionLevel.EncryptAndSign)] double Subtract(double n1, double n2); [OperationContract] double Multiply(double n1, double n2); [OperationContract] double Divide(double n1, double n2); } public class CalculatorService : ICalculator { public void Add(double n1, double n2) { double result = n1 + n2; Console.WriteLine("Received Add({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); } public double Subtract(double n1, double n2) { double result = n1 - n2; Console.WriteLine("Received Subtract({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); return result; } public double Multiply(double n1, double n2) { double result = n1 * n2; Console.WriteLine("Received Multiply({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); return result; } public double Divide(double n1, double n2) { double result = n1 / n2; Console.WriteLine("Received Divide({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); return result; } } Jak widzimy w tym przykładzie, ta klasa działa w 100% bez załączonych atrybutów (to co jest miedzy [ ]) ale te dodatkowe dane pozwalają na wygenerowanie WSDL tej usługi oraz pozwala usługom hostingowym na doczytanie się dodatkowych informacji niezbędnych do eksponowania tej klasy jako usługę. (jakbym usuną jakiś atrybut OperationContract z powiedzmy metody "multiply" to hostowana usługa by była o ta jedna operacje mniejsza). To co w php nie jest osiągalne to jest parsowanie tych komentarzy i przekładanie ich na już utworzone obiekty/enumeracje (php nie zna enumeracji ). Aby moc takowa funkcjonalność zaimplementować w PHP trzeba by było zrobić coś co by parsowało te komentarze i moglo to przekładać na "żywe" obiekty z kodu takie jak klasy, enumeracje itd... mam na myśli obsługę coś w stylu: Kod CallbackContract = typeof(IHelloCallbackContract), SessionMode = SessionMode.Required bo to: Kod Name = "CalculatorService", Namespace = "http://microsoft.wcf.documentation" jest jak najbardziej osiagalne w PHP. Trochę się rozpisałem tak może i bez sensu bo to wszystko jest w necie, ale liczę na to ze ktoś skomentuje to co napisałem i wywiąże sie z tego ciekawa dyskusja Czekam i Pozdrawiam Ten post edytował nasty 9.08.2008, 23:05:51 |
|
|
29.08.2008, 17:47:44
Post
#16
|
|
Grupa: Zarejestrowani Postów: 60 Pomógł: 5 Dołączył: 28.08.2008 Ostrzeżenie: (0%) |
Z tego co zauważyłem, nie do końca wszyscy się zgadzają na temat tego co to jest meta-programowanie. Zacznę możne, wiec od przedstawienia mojego rozumowania tego terminu. (...) (bo nie spotkałem się z pojęciem metaprogramowania w przypadku programowania strukturalnego) http://wazniak.mimuw.edu.pl/index.php?titl...taprogramowanie -- C++ ale jak najbardziej strukturalnie. Nawet w takim języku (deklaratywnym) jak SQL można używac metaprogramowania, np. łącząc procedury składowane i Dynamic SQL (pierwszy z brzegu przykład: databasejournal/3657506). I nie jest to to samo, co dane (metadane) opisujące tą procedurę składowaną. jest to dodawanie nowej funkcjonalności, badz tez "wstrzykiwania" jej do już istniejącego kodu bez ingerencji w sama jego strukturę czy tez ciało. ta nowa funkcjonalność to przede wszystkim informacje o przeznaczeniu oraz sposobie obsługi tej klasy/interfejsu itd... tak jak to się ma do tabeli w bazie danych; rodzaj kodowania czy silnik w żaden sposób nie ingerują w sama tabele (mam na myśli to ze nie zmieniają już istniejące dane) ale pomocne są w sytuacji gdy te dane muszą być obsłużone. Nie do końca się zgodzę. Skoro metadane to sa "dane opisujące dane" to analogicznie metaprogramowanie powinno byćrozumiane jako "kod (a nie dane!) opisujący (tworzący) kod". Tak samo jak jest logika i metalogika. Osobiście uważam ze metaprogramowanie (dodawanie metadanych do obiektów języka) Właśnie -- czy dodawanie danych (metadanych?) do kodu można nazwać metaprogramowaniem? IMHO -- nie, metaprogramowanie to jest coś więcej nie jest osiągalna w 100% tak jak to ma miejsce w językach które maja ta charakterystykę wbudowana w siebie. Przykładem którym się posłużę tutaj jako język obsługujący metadane jest C#. Tam metadane są ucieleśniane poprzez Atrybuty. C++ nie ma wbudowanej obsługi metaprogramowania (w moim rozumieniu) a całkiem dobrze sobie z tym radzi. Jeśli zaś chodzi o atrybuty... zawsze można je emulować za pomocą jakiegoś preprocesora. Tak to jest robione w samym PHP, przy pisaniu rozszerzeń. Dam może obszerniejszy przykład stosowania atrybutów w C# i na tym przykładzie pokaże czemu w PHP jest to nieosiągalne. Tworząc nowy web service w C# (WCF) robimy tak: Przepraszam za mały offtop, ale zawsze mnieśmieszyły te trzyliterowe, dotnetowe akronimy. WPF, WCF, WGF... szkoda, że nie ma WTF (i wcale nie chodzi mi tu o Wielkie Twierdzenie Fermata) Apropos kodu wklejonego przez wrzasq... nie wiem jak wydajnościowo, ale może tak lepiej by było?
Pozdrawiam Ten post edytował szopen 30.08.2008, 12:38:41 |
|
|
14.10.2008, 21:07:50
Post
#17
|
|
Grupa: Zarejestrowani Postów: 382 Pomógł: 22 Dołączył: 21.05.2007 Skąd: Elbląg Ostrzeżenie: (0%) |
Przepraszam, że nie przeczytałem wszystkiego, ale ilość tekstu mnie po prostu odstraszyła
Proszę o skorygowanie mojego rozumowania... Jeśli dobrze zrozumiałem to metaprogramowanie zachodzi wtedy, kiedy generuję treść i edytuję inną w tym samym skrypcie? Coś zbyt banalne jak dla mnie. Ten post edytował MajareQ 14.10.2008, 21:08:37 |
|
|
15.10.2008, 00:05:17
Post
#18
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) |
@MajareQ
Skoro wszytko jest tak proste dla Ciebie, to przeczytaj temat, to aż jedna strona. -------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
15.10.2008, 10:38:49
Post
#19
|
|
Grupa: Zarejestrowani Postów: 382 Pomógł: 22 Dołączył: 21.05.2007 Skąd: Elbląg Ostrzeżenie: (0%) |
Sedziwoj, nie zrozumiałeś chyba mojej prośby.
Prosiłem tylko o odpowiedzenia na pytanie. Myślę, że to dla średnio wykształconego programisty nie jest trudne, nieprawdaż? |
|
|
15.10.2008, 14:06:46
Post
#20
|
|
Grupa: Zarejestrowani Postów: 461 Pomógł: 32 Dołączył: 17.09.2003 Skąd: Łódź Ostrzeżenie: (0%) |
Z tego co rozumie to metaprogramowanie to pisanie programów poprzez programy. Więc każdy język skryptowy jest metaprogramowalny, java jest metaprogramowalna a także C# jest metaprowalny ... i pewnie wiele innych.
Nie rozumiem natomiast czemu się tak upierać, że PHP nie jest metaprogramowalne. Zanim zaczniemy się kłócić proszę o podanie jakiś namiarów na prace, które traktują o tym temacie i na podstawie których twierdzicie, że jest tak a nie inaczej. Sam także postaram się coś znaleźć na ten temat. pozdrawiam, Łukasz |
|
|
Wersja Lo-Fi | Aktualny czas: 26.09.2024 - 12:47 |