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 |
15.10.2008, 15:05:40
Post
#21
|
|
Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%) |
@MajareQ tu poczytaj.
http://wazniak.mimuw.edu.pl/index.php?titl...taprogramowanie prostym przykładem może być utworzenie pliku zapis do jakiegoś echo i później zaincludowanie tego pliku. ( kiedyś ktoś taki przykład na forum napisał ). -------------------- I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy. QueryBuilder, Mootools.net, bbcradio1::MistaJam http://www.phpbench.com/ |
|
|
17.10.2008, 11:14:00
Post
#22
|
|
Grupa: Zarejestrowani Postów: 182 Pomógł: 14 Dołączył: 20.09.2008 Ostrzeżenie: (0%) |
Prawda jest taka, Ktoś kiedyś powiedział, że prawda jest jak du%^ - każdy ma własną 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. Ktoś kiedyś powiedział, że złej baletnicy przeszkadza rąbek u spódnicy. Bardzo lubię te dyskusje o wyższości jednego języka nad drugim. Weźmy na przykład takie C – jest to całkiem archaiczny język średniego poziomu, który od dawna nie nadąża za trendami. I co z tego? Ludzie w nim piszą systemy operacyjne. Kiedyś Rafał Wysocki (linuksowy hacker) powiedział mi jak patrzy na te wszystkie języki (z pozycji cholernie dobrego programisty) "ważne jest to, żeby dało się zapisać algorytm". Reszta jest mało ważna Życzę miłego rozkminiania ezoterycznych problemów wyższości jednego języka nad drugim. |
|
|
17.10.2008, 12:30:47
Post
#23
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) |
Kiedyś Rafał Wysocki (linuksowy hacker) powiedział mi jak patrzy na te wszystkie języki (z pozycji cholernie dobrego programisty) "ważne jest to, żeby dało się zapisać algorytm". Reszta jest mało ważna A ja powiem cholernie ograniczony punkt widzenia, bo język jest dobry do tego do czego został stworzony, nikt normalny nie będzie pisał OS w Java, bo jest do czegoś innego, nit nie napisze całej aplikacji w C, bo to też nie o to chodzi (pomijam aplikacje specjalistyczne, gdzie wydajność to priorytet), Java i podejście obiektowe spełnia swoje zastosowanie jako możliwość szybszego tworzenia aplikacji, dla których wydajność nie jest priorytetem. Metaprogramowanie też sprawdzi się w pewnych miejscach, ale nie wszędzie. Języki się pojawiają, zmieniają po to aby sprawdzić różne możliwości zapisu programów i te lepiej spełniające swoje założenia przechodzą dalej. (np. pojawienie się Generics w Java, bo były bardzo użyteczne) -------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
17.10.2008, 13:30:03
Post
#24
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. |
@ 2 powyższe posty - Proszę nie robić offtopów
-------------------- 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. |
|
|
17.10.2008, 14:16:15
Post
#25
|
|
Grupa: Zarejestrowani Postów: 182 Pomógł: 14 Dołączył: 20.09.2008 Ostrzeżenie: (0%) |
@Cysiaczek
Ok, już nie będę (nie zwracaj uwagi na 3 poniższe zdania ) @Systemy operacyjne w Javie Takie systemy istnieją, działają i wcale nie piszą ich nienormalni ludzie. Oczywiście należy się zgodzić z tym, że jedne języki są lepsze do określonych zastosowań inne gorsze, ale nie należy wprowadzać żadnego językowego faszyzmu. Przetwarzanie formularza na stronie da się zrobić nawet z poziomu Pascala – wystarczy tylko umieć. // Widzę że nie bardzo do Ciebie dociera to co się piszę. Może ostrzeżenie Cię czegoś nauczy. // ~webdice |
|
|
20.10.2008, 23:05:13
Post
#26
|
|
Grupa: Zarejestrowani Postów: 76 Pomógł: 7 Dołączył: 30.09.2006 Ostrzeżenie: (0%) |
PHP Jak najbardziej pozwala na metaprogramowanie, podobnie jak każdy inny język który nie wymaga kompilacji plików źródłowych do poprawnego ich działania (tak sądzę, nie znam wszystkich tych języków).
Za "program" w PHP można uznać zbiór skryptów stanowiących jedną aplikację, która może (o czym wszyscy doskonale wiemy) zamieniać sama swoje pliki źródłowe. Często spotyka się aplikacje które przechowują dane (jak np. ustawienia) w swoich plikach źródłowych, będących podstawowymi plikami aplikacji. Aplikacje te umożliwiają zamianę tych danych w trakcie działania aplikacji (może się to odbywać bez ingerencji programisty). Późno już jest więc może nie do końca zrozumiałem definicję metaprogramowania, pisze co myślę. |
|
|
21.10.2008, 14:38:22
Post
#27
|
|
Grupa: Zarejestrowani Postów: 569 Pomógł: 0 Dołączył: 17.08.2003 Skąd: Dąbrowa Górnicza Ostrzeżenie: (0%) |
Nie wiem czy dobrze zrozumiałem dość obszerny post nasty to to co jest miedzy nawiasami [] jest tylko opisem komentarzem. Na podstawie którego jest powiedzmy (tak jak w przykladzie powiedział) generowany plik WSDL czyli to powinno być zaliczane do meta programowania jeśli ja na postawie kawałka kodu oraz jego komentarza wygeneruje plik wymagany do jakiegoś działania, w tym wypadku tekże niech to będzie WSDL
Na podstawie komentarza, a da sie go parsować i odczytać, mozna wygenerowac wsdl ktory bedzie opisywac metode pobierzLicznik i automatycznie opisywać ze zwraca liczbę całkowitą. Czy to nie bylo by już meta programowanie ? Jeśli dobrze zrozumiałem. Nierozumiem dlaczego by to nazywać trendem. Co, jest to modne ? Tak jak kiedyś posiadanie swojego frameworka czy CMS'a ? To poprostu moim zdaniem czasami jest dość wygodne przy odpowiednim nakładzie pracy ale zeby nazywać to trendem. Pozdrawiam. -------------------- Warsztat: Linux: PHP, MySQL, Apache, NetBeans, C++, Qt-Creator
Użytkownik, słowo którego specjaliści IT używają, gdy chcą powiedzieć idiota Zarządzaj swoim budżetem domowym |
|
|
21.10.2008, 14:48:24
Post
#28
|
|
Grupa: Moderatorzy Postów: 4 069 Pomógł: 497 Dołączył: 11.05.2007 Skąd: Warszawa |
http://pl.wikipedia.org/wiki/Metaprogramowanie
Metaprogramowanie - jest techniką która umożliwia programom tworzenie lub modyfikację kodu innych programów (lub ich samych). Tak więc oczywistym jest że PHP daj takie możliwości , np: tworzenie kodu JavaScript pobieramy nazwy grafik z folderu i dajemy je do pętli generującej zmienne js dla galerii js. |
|
|
21.10.2008, 15:52:34
Post
#29
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) |
@Spawnm
Nie do końca o ten sens chodzi w tym temacie, chodzi o generowanie kody PHP przez PHP na podstawie jakiś metadanych. (taki ja sens tego widzę) Czyli robienie wiele nie robiąc dużo. -------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
21.10.2008, 17:43:02
Post
#30
|
|
Grupa: Zarejestrowani Postów: 740 Pomógł: 15 Dołączył: 23.08.2004 Skąd: Poznań Ostrzeżenie: (0%) |
Jeśli pod pojęciem metaprogramowanie rozumiemy "uzupełnianie" lub "wzbogacanie" kodu aplikacji już podczas wykonywania tego kodu to w php jest to jaknajbardziej możliwe. Służą do tego takie funkcje jak np. [b]create_function[/b] czy eval, a także Reflection API. Z mojego punktu widzenia metody magiczne takie jak __get, __set czy __call to też metaprogramowanie gdyż umożliwiają obsłużenie przez programistę przypadków, których nie może on z góry przewidzeć (uzależnionych np. od struktury danych), lub ma zwyczajnie ochotę na implementację mechanizmów uniwersalnych.
Rezultaty tego metaprogramowania mogą zostać "utracone" w chwili wykonania kodu lub też zapisane do późniejszego wykożystania. Przy pomocy PHP możemy wygenerować nowe fragmenty kodu a nawet przedefiniować już zdefiniowane przez nas klasy czy funkcje. Dla mnie jest to już metaprogramowanie. Możemy dyskutować, który język jest bardziej predystynowany do tego aby nazywać go królem metaprogramowania, ale chyba nie o ranking w tym wątku chodzi. -------------------- bigZbig (Zbigniew Heintze) | blog.heintze.pl
|
|
|
3.11.2008, 00:52:46
Post
#31
|
|
Grupa: Zarejestrowani Postów: 562 Pomógł: 15 Dołączył: 8.08.2003 Skąd: Denmark/Odense Ostrzeżenie: (0%) |
Jako ciekawostka, dzięki funkcjom lambda, od PHP5.3 będzie możliwe rozszerzanie klas o nowe metody - na żywo.
Dzięki podobnemu rozwiązaniu zaimplementowałem lazy-loading danych z DB do moich modeli (a zwłaszcza kolekcji modeli). Oprócz tego, dzięki lambdom możliwe jest np napisanie metody 'each' dla kolekcji. Powyższą klasę można wykorzystać np tak:
-------------------- Prank - for the fun. Mac - for the simplicity. Deviantart - for the kick.
Life is ours, We live it our way -- Metallica |
|
|
3.11.2008, 12:32:38
Post
#32
|
|
Grupa: Zarejestrowani Postów: 55 Pomógł: 0 Dołączył: 10.12.2004 Ostrzeżenie: (0%) |
(...) Dzięki podobnemu rozwiązaniu zaimplementowałem lazy-loading danych z DB do moich modeli (a zwłaszcza kolekcji modeli). Oprócz tego, dzięki lambdom możliwe jest np napisanie metody 'each' dla kolekcji. (...) Mógłbyś się podzielić kawałkami kodu przykładów? Zainteresowała mnie ta część postu i chętnie przeczytam więcej.EDIT: Zainteresowanych odsyłam do klasy Collection autorstwa bregovica: Collection.php Ten post edytował tuner 3.11.2008, 12:39:10 |
|
|
19.02.2009, 15:34:40
Post
#33
|
|
Grupa: Zarejestrowani Postów: 740 Pomógł: 15 Dołączył: 23.08.2004 Skąd: Poznań Ostrzeżenie: (0%) |
Wzbogacanie klas o dodatkowe metody jest od dawna możliwe i bez funkcji lambda http://www.garfieldtech.com/blog/php-magic-call
-------------------- bigZbig (Zbigniew Heintze) | blog.heintze.pl
|
|
|
11.04.2009, 19:42:50
Post
#34
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów |
Cytat Nie moge sie doczekac PHP 5.3 i pierwszego projektu ktory skusi sie na uzycie namespace Nie skuszą się. Był na hostingach ongiś wielki ból, aby zainstalowano PHP5, niektóre są bardzo ospałe, jeśli chodzi i update bieżących wersji PHP, to myślisz, że ktoś sobie pozwoli na problemy wywołane nowymi funkcjami? Za rok od wprowadzenia przestrzeni nazw, to rozumiem, ale na pewno nie tak prędko. Cytat Co mi po tym ze stworze alias do danego namespace'a czy klasy? Wolalbym sobie zaimportowac namespace tak jak ma to miejsce w C++ (using namespace My\Full;) ... Z tego, co mi wiadomo, to i tak była gorąca dyskusja właśnie w ekipie tworzącej interpreter, jakiego operatora używać do deklarowania przestrzeni nazw. Już nie pamiętam, na czym stanęło. Cytat Swoja droga... ciekaw jestem czego jeszcze mozemy sie spodziewac... W sumie, to naprawdę wszystkiego - np. kiedyś był moduł MySQL zintegrowany, potem poleciał do rozszerzenia i znowu wraca do rdzenia... Cytat P.S. Jezeli uwazacie ten watek za ciekawy do dyskusji (zdaje sobie sprawe iz to nie jest raczej wlasciwe miejsce), to prosze o kontakt, zalozenie oddzielnego tematu, albo sam to zrobie i bedziemy mieli okazji do przedyskutowania tego. Chętnie, ale zobaczymy, czy więcej osób podejmie dyskusje; jestem jak najbardziej "za". -------------------- ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
14.04.2009, 21:45:10
Post
#35
|
|
Grupa: Zarejestrowani Postów: 24 Pomógł: 3 Dołączył: 25.08.2005 Ostrzeżenie: (0%) |
Pomijam fakt ze namespace musi byc zadeklarowany zaraz na poczatku pliku, gdzie wolalbym najpierw wpisac (...) Pliki, do których użytkownik ma nie mieć dostępu umieszcza się poza public_html.(...) za akzdym razem trzeba pisac \CORE\[Klasa] albo zaliasowac sobie... use \CORE\[Klasa] as Klasa... jak dla mnie nie porozumienie - jakby nie mozna bylo wpisac np import CORE. Mozna by powiedziec - zmiast deklarowac namespace CORE - kernela wstawic w global scope - nie pomogloby. use \Klasa as Klasa czyli dokladnie ten sam problem... Nawet mając do dyspozycji przestrzenie nazw, nie powinieneś nazywać klas tak samo. Dodawanie as Klasa do use \Klasa jest równoznaczne z samym use \Klasa. Zaliasowanie wszystkich używanych klas pozwala szybciej zorientować się, jakie definiowana klasa ma zależności. Nie trzeba latać po całym pliku.Z resztą jaki % czasu w porównaniu do napisania całej klasy zajmie Ci wpisanie usingów? Inny przyklad - kod zaczerpniety ze strony IBMa: (...) Albo piszesz obiektowo albo strukturalnie.
|
|
|
15.04.2009, 12:55:23
Post
#36
|
|
Grupa: Zarejestrowani Postów: 24 Pomógł: 3 Dołączył: 25.08.2005 Ostrzeżenie: (0%) |
Wytlumacz mi prosze co ma piernik do wiatraka?
Po to sie uzywa namespace aby moc miec kilka kals o tej samej nazwie - jaka mam pewnosc ze nikt nie bedzie chcial polaczyc mojego projektu z innym projektem i ze nie wystapi konflikt nazw? Po dodaniu przestrzeni nazw, pełna nazwa klasy to namespaceName\ClassName. Po to się dodaje nazwę projektu/firmy do ns, aby takie problemy nie wystąpiły. Jeżeli masz dwie klasy o takiej samej nazwię to znaczy, że robią to samo. Czy jedną z głównych cech OOP przestało być code reuse? I wytlumacz mi o jakie zaleznosci Ci chodzi bo nie bardzo rozumiem... Zależności pomiędzy klasami. Jeżeli Foo korzysta z Bar i Baz, to od nich zależy. Co do tego kodu. Nie wiem czy w alpha wyświetlał się ten błąd (może autor miał wyłączone wyświetlanie ostrzeżeń), ale PHP informuje, że trzeba dodać przestrzeń nazw przed wywołaniem funkcji Cytat(PHP) Warning: The use statement with non-compound name 'UtilsLeft' has no effect in /home/.../ns.php on line 8 Warning: The use statement with non-compound name 'UtilsRight' has no effect in /home/.../ns.php on line 11 I'm using my left hand!I'm using my right hand! Fatal error: Call to undefined function whichHand() in /home/morkai/workspace/tests/ns.php on line 9 Tak samo jest w Pythonie. Chociaż Python pozwala na importowanie funkcji trzeba każdą zimportować każdą z osobna (co ma sens). Tobie się nie podoba, że trzeba importować klasy. Co by było jakbyś musiał importować funkcje ^^ |
|
|
15.04.2009, 13:00:55
Post
#37
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) |
Po dodaniu przestrzeni nazw, pełna nazwa klasy to namespaceName\ClassName. Po to się dodaje nazwę projektu/firmy do ns, aby takie problemy nie wystąpiły. Jeżeli masz dwie klasy o takiej samej nazwię to znaczy, że robią to samo. Czy jedną z głównych cech OOP przestało być code reuse? Ale bzdury. Ale bzdury.Zasada Code Reuse nie ma tu najmniejszego znaczenia. Strzelasz bzdurnymi argumentami od czapy w stylu "Jeżeli masz dwie klasy o takiej samej nazwię to znaczy, że robią to samo." Po to powstały przestrzenie nazw, żeby do nich pakować całe biblioteki czy projekty i nie martwić się, że Ci się, na przykład klasa Parser powtórzy. Zajrzyj może do innych języków, na przykład do Javy. Dostrzeżesz śmieszność we własnych postach |
|
|
15.04.2009, 17:15:39
Post
#38
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów |
Cytat powiedz mi jak na hostingu umiescic cos poza public_html? Normalnie. Porządny hosting umożliwia Ci zapis plików poza public_html. Jeśli nie, to cóż... Trzeba kombinować z Rewrite. -------------------- ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
15.04.2009, 20:40:31
Post
#39
|
|
Grupa: Zarejestrowani Postów: 740 Pomógł: 15 Dołączył: 23.08.2004 Skąd: Poznań Ostrzeżenie: (0%) |
Prawdą jest, że porządny hosting udostępnia katalog co najmniej o poziom wyżej public_html, ale jeśli nawet tak nie jest to można sobie poradzić używając podkatalogu z odpowiednim .htaccess - em. Pisanie w każdym pliku czegoś na kształt:
jest amatorszczyzną bo. 1. Trzeba pamiętać aby ten wpis znalazł się w każdym pliku. 2. Nie zabezpiecza to bibliotek zewnętrznych gdyż trzeba by dodać podobny wpis do każdego pliku, każdej zewnętrznej biblioteki np. Smarty, htmlpurifier, Swiftt, Zend itd. 3. Użycie plików z takim wpisem w innych projektach wymusza zdefiniowanie odpowiedniej stałej Oczywiście tematem niniejszego wątku nie jest zabezpieczenie plików tak więc wracając do meritum sprostuję jeszcze, że w Pythonie nie trzeba wymieniać literalnie, każdej funkcji, którą chce się zaimportować, choć uważam to za w sumie dobrą praktykę. Zgadzam się z moimi przedmówcami, którzy stoją na stanowisku, że ideą przestrzeni nazw jest wyeliminowanie problemów ze zdublowanymi nazwami klas lub funkcji. Programując często zmuszony jesten do tworzenia rozbudowanych nazw klas. Niestety php jak dotąd wymusza nadawanie nazw klasom i funkcją w odniesieniu do całej aplikacji. Stąd przedrostki typu smarty_, Zend_, My_ itp. O ile prostsze byłoby użycie krótkiej nazwy, która w danym kontekście byłaby jednoznaczna. Rozwiązaniem mają być namespace-y. Czytałem dokumentację dotyczącą namespace-ów w php i powiem Wam, że jak na razie to co tam piszą jest mało intuicyjne i nie jestem pewien czy mi się to podoba. -------------------- bigZbig (Zbigniew Heintze) | blog.heintze.pl
|
|
|
11.05.2009, 16:16:09
Post
#40
|
|
Grupa: Zarejestrowani Postów: 136 Pomógł: 22 Dołączył: 19.09.2007 Skąd: Sosnowiec Ostrzeżenie: (0%) |
Nie chcę specjalne marudzić, ale czy temat nie tyczy się czasem Metaprogramowania a nie zastosowań przestrzeni nazw wraz z rozwiązaniami nowego PHP?
Metaprogramowanie, to... dziwna rzecz. Wydaje mi się, że mniej więcej łapię założenia jakie kierują metaprogramowaniem. Umyka mi za to trochę sens takich rozwiązań... Nie potrafię sobie wyobrazić sytuacji w której użycie metapr. byłoby conajmniej wskazane (i optymalne). Generowanie kodu który w niedalekiej przyszłości miałby zostać wykonany to (wybaczcie, widocznie nie mam aż tak wielkiej wyobraźni) przerost formy nad treścią. Chyba, że ten temat jest czysto teoretyczny i pomija pytanie "po co?" na rzecz "czy da się?" bo nie sądzę, żeby skrypt sam był w stanie uzupełnić sie o newralgiczne elementy. Hmm, ORM? I tak mnie właśnie coś ruszyło... Czy rozwiązanie Zend Framework odnośnie klas tablic objętych relacją i wywołań właściwie nieistniejących metod finderów podpada pod Metaprogramowanie? Chodzi mi o wywołanie metody:
-------------------- Code should run as fast as necessary, but no faster; something important is always traded away to increase speed.
-- R. Pattis |
|
|
Wersja Lo-Fi | Aktualny czas: 27.09.2024 - 03:31 |