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.

> Metaprogramowanie w PHP
kwiateusz
post
Post #1


Admin Techniczny


Grupa: Administratorzy
Postów: 2 072
Pomógł: 93
Dołączył: 5.07.2005
Skąd: Olsztyn




Na prośbę empathon'a zakładam niniejszy temat (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
nasty
post
Post #2





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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Czekam i Pozdrawiam (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował nasty 9.08.2008, 23:05:51
Go to the top of the page
+Quote Post

Posty w temacie
- kwiateusz   Metaprogramowanie w PHP   21.05.2008, 16:56:51
- - LoPMX   Czegos takiego nie ma Zapraszam na http://www.ru...   24.06.2008, 19:04:47
- - radex_p   http://pl.wikipedia.org/wiki/Metaprogramowanie ...   24.06.2008, 19:06:20
|- - orglee   No ja właśnie nie mam pojęcia co to...   25.07.2008, 21:10:00
- - LoPMX   Tzn. ze uwazasz [PHP] pobierz, plaintext <?ph...   24.06.2008, 19:37:20
- - Cysiaczek   @LoPMX - nie, to jest wykorzystanie możliwości skł...   24.06.2008, 19:42:21
- - LoPMX   @ Cysiaczek : Ale po co podsylasz oczywiste linki?...   24.06.2008, 20:06:48
|- - Sedziwoj   Cytat(LoPMX @ 24.06.2008, 21:06:48 ) ...   30.06.2008, 08:56:19
|- - michalkjp   Cytat(LoPMX @ 24.06.2008, 21:06:48 ) ...   17.10.2008, 11:14:00
|- - Sedziwoj   Cytat(michalkjp @ 17.10.2008, 12:14:0...   17.10.2008, 12:30:47
- - mike   W PHP można bardzo dobrze symulować meta...   24.06.2008, 20:08:33
- - splatch   Jakiś czas temu pisałem o adnotacjach w PHP. Jest ...   2.07.2008, 07:22:11
- - wrzasq   a ja sie zgadzam z LoPMX (nie tylko w tym, ze PHP ...   3.07.2008, 11:41:43
- - mike   ~wrzasq a może zamiast pisać posty w odp...   3.07.2008, 11:48:28
- - Kocurro   Pozwolicie drodzy koledzy, że włączę się w tą dysk...   25.07.2008, 10:37:59
- - Tubis   IMHO Metaprogramowanie jest to uzupełnianie aplika...   26.07.2008, 11:29:42
- - nasty   Z tego co zauważyłem, nie do końca wszyscy się zga...   9.08.2008, 22:48:45
|- - szopen   Cytat(nasty @ 9.08.2008, 23:48:45 ) Z...   29.08.2008, 17:47:44
- - MajareQ   Przepraszam, że nie przeczytałem wszystk...   14.10.2008, 21:07:50
- - Sedziwoj   @MajareQ Skoro wszytko jest tak proste dla Ciebie,...   15.10.2008, 00:05:17
- - MajareQ   Sedziwoj, nie zrozumiałeś chyba mojej prośby. Pro...   15.10.2008, 10:38:49
- - Kocurro   Z tego co rozumie to metaprogramowanie to pisanie ...   15.10.2008, 14:06:46
- - skowron-line   @MajareQ tu poczytaj. http://wazniak.mimuw.edu.pl/...   15.10.2008, 15:05:40
- - Cysiaczek   @ 2 powyższe posty - Proszę nie robić offtopów   17.10.2008, 13:30:03
- - michalkjp   @Cysiaczek Ok, już nie będę (n...   17.10.2008, 14:16:15
- - pawkow   PHP Jak najbardziej pozwala na metaprogramowanie, ...   20.10.2008, 23:05:13
- - Sh4dow   Nie wiem czy dobrze zrozumiałem dość obszerny post...   21.10.2008, 14:38:22
- - Spawnm   http://pl.wikipedia.org/wiki/Metaprogramowanie Met...   21.10.2008, 14:48:24
- - Sedziwoj   @Spawnm Nie do końca o ten sens chodzi w tym temac...   21.10.2008, 15:52:34
- - bigZbig   Jeśli pod pojęciem metaprogramowanie rozumiemy ...   21.10.2008, 17:43:02
- - bregovic   Jako ciekawostka, dzięki funkcjom lambda, od PHP5....   3.11.2008, 00:52:46
|- - tuner   Cytat(bregovic @ 2.11.2008, 23:52:46 ...   3.11.2008, 12:32:38
- - bigZbig   Wzbogacanie klas o dodatkowe metody jest od dawna ...   19.02.2009, 15:34:40
- - erix   CytatNie moge sie doczekac PHP 5.3 i pierwszego pr...   11.04.2009, 19:42:50
- - erix   Cytatpowiedz mi jak na hostingu umiescic cos poza ...   15.04.2009, 17:15:39
- - bigZbig   Prawdą jest, że porządny hosting udostępnia katalo...   15.04.2009, 20:40:31
- - Nattfarinn   Nie chcę specjalne marudzić, ale czy temat nie tyc...   11.05.2009, 16:16:09
- - metadetron   Nie wiem czy to już metaprogramowanie czy tylko ge...   10.05.2010, 10:47:25
- - dariuszp   Metaprogramowanie. Temat na tyle obszerny i dla mn...   9.09.2010, 23:07:35


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 Aktualny czas: 10.10.2025 - 09:09