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
kwiateusz
post 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 smile.gif
Go to the top of the page
+Quote Post
LoPMX
post 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%)
-----


Czegos takiego nie ma smile.gif

Zapraszam na http://www.ruby-lang.org winksmiley.jpg


--------------------
Go to the top of the page
+Quote Post
.radex
post 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."


--------------------
blog | Tadam — minutnik do Pomodoro na Maka :)
Go to the top of the page
+Quote Post
LoPMX
post 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

  1. <?php
  2. $class_name = 'Article'; $article = new $article;
  3. ?>


za metaprogramowanie?


--------------------
Go to the top of the page
+Quote Post
Cysiaczek
post 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 smile.gif

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.
Go to the top of the page
+Quote Post
LoPMX
post 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.


--------------------
Go to the top of the page
+Quote Post
mike
post 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
Go to the top of the page
+Quote Post
Sedziwoj
post 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%)
-----


Cytat(LoPMX @ 24.06.2008, 21:06:48 ) *
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.
Go to the top of the page
+Quote Post
splatch
post 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..
Go to the top of the page
+Quote Post
wrzasq
post 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 tongue.gif, 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:

  1. <?php
  2.  
  3. $id = uniqid();
  4.  
  5. $content = '<?php
  6.  
  7. /* tutaj kod wygenerowany na podstawie jakichs informacji */
  8.  
  9. ?>';
  10.  
  11. file_put_contents($id . '.php', $content);
  12.  
  13. include($id . '.php');
  14.  
  15. unlink($id . '.php');
  16.  
  17. ?>


(hah, chyba sam sobie zaprzeczylem ;P)

Ten post edytował wrzasq 3.07.2008, 11:42:05


--------------------
Go to the top of the page
+Quote Post
mike
post 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 tongue.gif winksmiley.jpg
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
Go to the top of the page
+Quote Post
Kocurro
post 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
Go to the top of the page
+Quote Post
starach
post 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
Go to the top of the page
+Quote Post
Tubis
post 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.
Go to the top of the page
+Quote Post
nasty
post 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 tongue.gif ). 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 smile.gif

Czekam i Pozdrawiam smile.gif

Ten post edytował nasty 9.08.2008, 23:05:51
Go to the top of the page
+Quote Post
szopen
post 29.08.2008, 17:47:44
Post #16





Grupa: Zarejestrowani
Postów: 60
Pomógł: 5
Dołączył: 28.08.2008

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


Cytat(nasty @ 9.08.2008, 23:48:45 ) *
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ą.
Cytat(nasty @ 9.08.2008, 23:48:45 ) *
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.
Cytat(nasty @ 9.08.2008, 23:48:45 ) *
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 smile.gif
Cytat(nasty @ 9.08.2008, 23:48:45 ) *
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ń.
Cytat(nasty @ 9.08.2008, 23:48:45 ) *
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) winksmiley.jpg

Apropos kodu wklejonego przez wrzasq... nie wiem jak wydajnościowo, ale może tak lepiej by było?
  1. <?php
  2.  $dynamicPHP = '';
  3.  for ($i = 0; $i<100; ++$i)
  4.  {
  5. $dynamicPHP .= "echo \"Właśnie wypisuję $i\n\";\n";
  6.  }
  7.  eval($dynamicPHP);
  8. ?>


Pozdrawiam smile.gif

Ten post edytował szopen 30.08.2008, 12:38:41
Go to the top of the page
+Quote Post
MajareQ
post 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 smile.gif

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
Go to the top of the page
+Quote Post
Sedziwoj
post 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.
Go to the top of the page
+Quote Post
MajareQ
post 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ż?
Go to the top of the page
+Quote Post
Kocurro
post 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
Go to the top of the page
+Quote Post

3 Stron V   1 2 3 >
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: 19.03.2024 - 03:17