![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 260 Pomógł: 14 Dołączył: 8.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
Zalozmy ze mam jakis obiekt Obiekt i drugi obiekt ObiektSterujacy.
chce by ObiektSterujacy mogl wywolac metode obiektu Obiekt->zmienCostam() i cos w nim zmienic, ale zeby tylko obiektSterujacy mogl wywolac ta metode. Dla klasy KlasaPoboczna metoda zmienCostam powinna byc chroniona. Czy jest jakis inteligentny sposob na zrealizowanie tego ? w tym momencie jedyną rzeczą jaka mi przychodzi do glowy jest przesylac instancje obiektu ObiektSterujacy i w obiekcie Obiekt sprawdzac czy to instancja ObiektSterujacy. Jednak to nieeeleganckie niewygodne i niepotrzebny narzut. Ten post edytował Orzeszekk 19.11.2011, 14:32:30 -------------------- "The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time."
Tom Cargill, Bell Labs |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
W PHP nie da się w żaden sposób określić poziomu dostępności klasy. Niestety wszystkie są publiczne. Tak więc na poziomie języka nic nie zdziałasz, jedynie w dokumentacji możesz to zaznaczyć.
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 1 798 Pomógł: 307 Dołączył: 13.05.2009 Skąd: Gubin/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Ewentualnie możesz jeszcze się pobawić w instanceof, tyle że według mnie trochę to bez sensu i takie tworzenie obiektów idiotoodpornych, które mogą być użyte tylko w taki sposób jaki tego chcemy. IMO zbyteczna funkcjonalność
![]() |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 260 Pomógł: 14 Dołączył: 8.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
Widocznosc klasy mnie nie obchodzi, klasa moze byc widoczna i publiczna.
chce zebym mogl ukryc niektore metody klasy przed niektorymi klasami. chcialem zrobic ładne idiotoodporne klasy ![]() No bo tak to po co mi getter i setter jak oba maja byc publiczne -------------------- "The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time."
Tom Cargill, Bell Labs |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
PHP nie udostępnia też niczego co mogłoby działać jak metody zaprzyjaźnione czy dostępność po przestrzeni nazw. Jedyne kryterium widoczności metod to hierarchia klas.
Cytat No bo tak to po co mi getter i setter jak oba maja byc publiczne To jest raczej normalne że jeżeli istnieje setter, to jest on publiczny.
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 1 798 Pomógł: 307 Dołączył: 13.05.2009 Skąd: Gubin/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Widocznosc klasy mnie nie obchodzi, klasa moze byc widoczna i publiczna. chce zebym mogl ukryc niektore metody klasy przed niektorymi klasami. chcialem zrobic ładne idiotoodporne klasy ![]() No bo tak to po co mi getter i setter jak oba maja byc publiczne No to tak jak mówię, instanceof i jazda. Niech powiedzmy twój seter przyjmuje jako parametr jakiś inny obiekt, wówczas wywali błąd jeżeli przekażesz wartość z zupełnie innego obiektu.
lub wersja z instanceof:
Coś w tym stylu. Gdzieniegdzie taka funkcjonalność się przydaje, ale raczej nie do tego żeby zrobić klasę idioto odporną, tylko przykładowo do polimorfizmu. |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
@by_ikar: Tu nie chodzi o typ argumentu, a o samo wywołanie metody. W PHP nie osiągnie tego czego oczekuje.
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 1 798 Pomógł: 307 Dołączył: 13.05.2009 Skąd: Gubin/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Tak, tak, wiem to, napisałeś to, nie chciałem tego samego powtarzać już
![]() |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 260 Pomógł: 14 Dołączył: 8.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
No coz dobrze ze istnieje chociaz php doc w ktorym sobie mozna napisac gdzie czegos wolno uzywac a gdzie nie.
-------------------- "The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time."
Tom Cargill, Bell Labs |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
A może opisałbyś swoją sytuację bardziej precyzyjnie? Może da się to jakoś ładniej rozwiązać, na poziomie języka.
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 260 Pomógł: 14 Dołączył: 8.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
Chce zeby klasa Item_Object mogla miec zmienione parametry tylko podczas tworzenia oraz edycji parametrow w widoku edycji, a zeby przypadkowe uzycie settera np podczas obliczen gdzies tam w modelach bylo zabronione.
A jak juz jestesmy przy slabosciach jezyka, da sie jakos zmusic php by nie trzeba bylo pisac $this odwolujac sie do pól klasy? chcialbym zeby bylo tak jak w javie
ew jesli nie ma takie dyrektywy to moze chociaz jakas instrukcja grupujaca with (jak ta w pascalu)
jak sie robi obliczenia na duzej ilosci pól to potrafi ten $this dobic Ten post edytował Orzeszekk 20.11.2011, 14:08:41 -------------------- "The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time."
Tom Cargill, Bell Labs |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Chce zeby klasa Item_Object mogla miec zmienione parametry tylko podczas tworzenia oraz edycji parametrow w widoku edycji, a zeby przypadkowe uzycie settera np podczas obliczen gdzies tam w modelach bylo zabronione. Takie coś w pewnych językach (ot, chociażby wspomnianej Javie) na "dziko" dałoby się pewnie osiągnąć, ale raczej nie powinieneś czegoś takiego robić. Obiekt powinien mieć swój publiczny interfejs, który powinien być niezależny od miejsca użycia. Jeżeli ktoś chce użyć settera to i tak go użyje (patrz: Reflection), co więcej na pewno zrobi to świadomie.Cytat A jak juz jestesmy przy slabosciach jezyka, da sie jakos zmusic php by nie trzeba bylo pisac $this odwolujac sie do pól klasy? [...] Zawsze musisz poprzedzać do "$this->". Zresztą... to na prawdę nie jest jakiś problem czy udręka.
|
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 260 Pomógł: 14 Dołączył: 8.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
kwestia dyskusyjna z tym $this, ja tego nie lubie. Zresztą czesto o nim zapominam pisząc co powoduje czasem trudne do znalezienia błędy. nie chodzi o to by tak naprawde na chama zabezpieczyc, wiadomo ze ktos moze uzyc reflection, ale chodzi mi o to by omyłkowo nie uzyc settera tam gdzie sie tego robic nie powinno. a jak ktos bedzie chcial swiadomie to to zrobi, nawet kod sobie moze przerobic przeciez. Ten post edytował Orzeszekk 20.11.2011, 15:38:23 -------------------- "The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time."
Tom Cargill, Bell Labs |
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 1 798 Pomógł: 307 Dołączył: 13.05.2009 Skąd: Gubin/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
No wiesz co, to są aż 4 znaki, z czego do dolara trzeba użyć shifta dodatkowo. Nie wiem jak jest w innych językach, ale podejrzewam że jest podobnie, bo niby skąd interpreter/kompilator ma wiedzieć że metoda do której się odnosisz pochodzi właśnie do tego obiektu, a nie obiektu który dziedziczysz?
Cytat nie chodzi o to by tak naprawde na chama zabezpieczyc, wiadomo ze ktos moze uzyc reflection, ale chodzi mi o to by omyłkowo nie uzyc settera tam gdzie sie tego robic nie powinno. a jak ktos bedzie chcial swiadomie to to zrobi, nawet kod sobie moze przerobic przeciez. No właśnie, jak będzie chciał to i tak użyje, a po co tworzyć jakąś niepotrzebną funkcjonalność, która jest zbędnym narzutem wydajnościowym. Możesz bawić się w method chaining, i wtedy raz zapisać this: Kod $this->select()->from('table')->where('condition')->order('column asc')->limit(5); itd. Póki co nie przeszkadza mi wpisywanie this, wystarczy że wewnątrz obiektu wstawię dolara i już mam listę zmiennych dostępnych w klasie/metodzie i na pierwszym miejscu zawsze mam this, strzałka w dół i od razu dostaje $this->. Kwestia edytora, kwestia snippetów i kwestia przyzwyczajenia ![]() |
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat nie chodzi o to by tak naprawde na chama zabezpieczyc, wiadomo ze ktos moze uzyc reflection, ale chodzi mi o to by omyłkowo nie uzyc settera tam gdzie sie tego robic nie powinno. a jak ktos bedzie chcial swiadomie to to zrobi, nawet kod sobie moze przerobic przeciez. Nie da się w żaden sposób zabezpieczyć przed błędnym używaniem jakiegoś kodu. Nie na poziomie języka. Raczej powinieneś sobie to darować i co najwyżej w dokumentacji dobrze opisać jak powinno się korzystać, czemu tych przykładowych setterów nie powinno używać się tam i tam itd.Cytat Nie wiem jak jest w innych językach, ale podejrzewam że jest podobnie, bo niby skąd interpreter/kompilator ma wiedzieć że metoda do której się odnosisz pochodzi właśnie do tego obiektu, a nie obiektu który dziedziczysz? To akurat nie jest żadnym problemem. Problemem jest to, że PHP jako język wieloparadygmatowy ma coś takiego jak funkcje globalne. Wymuszenie stosowania każdorazowo $this było najlepszym rozwiązaniem by uniknąć "niestandardowej" (względem innych języków) składni oraz dwuznacznego kodu.
|
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 260 Pomógł: 14 Dołączył: 8.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
by_ikar:
w javie z tego co pamietam jest tak ze jak zrobisz zmienna lokalną mającą tą samą nazwę co pole to ta zmienna lokalna przysłania widocznością pole w klasie. Wtedy do pola możesz się odwołać za pomocą this.pole. Jak widać również jest operator this, lecz korzysta się z niego tylko gdy jest potrzebny. Zresztą w javie zazwyczaj zapisuje sie wtedy nazwe zmiennej lokalnej z podkreślnikiem z przodu lub z tyłu. W C# i Pascalu/Delphi jest tak samo i uwazam to za duzo bardziej naturalne podejscie do tematu. W C++ nie wiem jak jest, podejrzewam ze podobnie jak w PHP bo tworcy PHP sami by raczej na to nie wpadli. Sorry, pojechałem na wymiane w tym semestrze kiedy mialem C++ a na codzien to język kompletnie nieprzydatny mi jak na razie więc go nie znam. No i w pascalu na pewno są funkcje globalne i również nie jest to żadną przeszkodą, natomiast w Javie i C# jako językach obiektowych od początku już chyba tego nie ma. Crozin to nie cztery znaki a 7:
widzisz? 7. W tym operator -> będący najbardziej durnym operatorem jaki kiedykolwiek na oczy widziałem. Jak mozna operator uzywany miliony razy w kodzie zrobić z dwóch znaków, w tym jeden wymagający nacisniecia shift? Kropka jest do tego znacznie lepsza i gdyby była nakładka na php pozwalająca na uzywanie . zamiast ->, oraz + zamiast . (operatora konkatenacji stringow ktory jest niezbyt intuicyjny, plus jest lepszy) to bym chetnie z takiej nakładki korzystał ![]() Byc moze byloby za duzo błędów logicznych gdyby zrobili bez obowiązkowego $this, bo twórcy nie pomysleli o deklarowaniu zmiennych. głupie var $zmienna uratowałoby wiele programistów przed marnowaniem czassu na debugowanie literówek. W zasadzie samo this nie jest problemem, problemem jest zapisanie tego durnego dolara i -> bo to te znaki sprawiaja ze nieprzyjemnie sie to pisze. Problemem w cudzyslowie oczywiscie bo jestem zdrowy nie jestem uposledzony i jestem w stanie to napisac, jednak troche mi to przeszkadza bo jest to niewygodne. klasyczny przykład kiedy uproszczenie stało się utrapieniem ![]() Ja błagam stwórcę o to by zrobili świetne Mono na linuksa i wtedy wszystkie hostingi dodadzą opcje hostowania asp.net w cenie PHP i będzie wreszcie mozna tworzyc strony w normalnym języku. -------------------------------- zainspirowany postem by_ikar zmienilem w eclipse timeout podpowiadania skladni z 30 ms na 0 ms i faktycznie po wpisaniu $t wyskakuje samo $this->, i nie trzeba naciskac ctrl + spacji. troche to ulatwia method chaining - inspiracja z symfony? Wole nie wiedziec jak to wplywa na wydajnosc w takim jezyku jak PHP, bo wygladac to moze i wyglada fajnie.. Ten post edytował Orzeszekk 20.11.2011, 23:23:35 -------------------- "The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time."
Tom Cargill, Bell Labs |
|
|
![]()
Post
#17
|
|
![]() Grupa: Zarejestrowani Postów: 1 798 Pomógł: 307 Dołączył: 13.05.2009 Skąd: Gubin/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Cytat method chaining - inspiracja z symfony? Wole nie wiedziec jak to wplywa na wydajnosc w takim jezyku jak PHP, bo wygladac to moze i wyglada fajnie.. yy to nie jest inspiracja z symfony, akurat symfony i wiele innych FW, jak i klas to wykorzystuje. Jak wpływa na wydajność? Dokładnie ci nie powiem, ale wydaje mi się że to jest bez różnicy. Mam taki swój powiedzmy framework, w którym kilka obiektów korzysta z method chaining (sklejanie zapytań do bazy, paginator i coś by się jeszcze znalazło), a mimo to wyświetlenie podstrony (zalogowany użytkownik, jakieś 10 zapytań do bazy, szablon, jakieś dodatkowe pierdoły) a strona nie generuje się powyżej 400ms zużywając średnio 2-3mb. Cytat zainspirowany postem by_ikar zmienilem w eclipse timeout podpowiadania skladni z 30 ms na 0 ms i faktycznie po wpisaniu $t wyskakuje samo $this->, i nie trzeba naciskac ctrl + spacji. troche to ulatwia Nie wiem jak jest w eclipse, bo z niego nie korzystam, ale u siebie w phpdesigner wystarczy że wstawię dolara i już mam listę zmiennych które mogę użyć. |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 260 Pomógł: 14 Dołączył: 8.09.2011 Ostrzeżenie: (0%) ![]() ![]() |
yy to nie jest inspiracja z symfony, akurat symfony i wiele innych FW, jak i klas to wykorzystuje. Jak wpływa na wydajność? Dokładnie ci nie powiem, ale wydaje mi się że to jest bez różnicy. Mam taki swój powiedzmy framework, w którym kilka obiektów korzysta z method chaining (sklejanie zapytań do bazy, paginator i coś by się jeszcze znalazło), a mimo to wyświetlenie podstrony (zalogowany użytkownik, jakieś 10 zapytań do bazy, szablon, jakieś dodatkowe pierdoły) a strona nie generuje się powyżej 400ms zużywając średnio 2-3mb. Nie wiem jak jest w eclipse, bo z niego nie korzystam, ale u siebie w phpdesigner wystarczy że wstawię dolara i już mam listę zmiennych które mogę użyć. Jak pisałem klase do generowania kodu HTML na podstawie obiektów PHP (mialem taki kaprys zeby np nie pisać <div arg1="cc" arg2="ff....></div> i nie mylic sie przy tym literówkami, to napisałem klase ktora wstawiala diva za pomocą new Block($parent, $content)) to metoda rekurencyjna generująca ten kod (tj rysuje <div, wszystkie argumenty, > i tutaj wywoluje draw dla wszystkich dzieci </div>) dzialala 20 razy wolniej niz metoda nierekurencyjna uzywajaca zamiast wywolan metod skoków goto w obrębie jednej metody. W php sa wolne wywołania funkcji i nie szalałbym tutaj z nadmiernym robieniem funkcji wykonujących jedną linijkę kodu, sam pisząc nieraz mam opór by użyć getterów i setterów ale robie to dla dobra swojego i ogółu. W php wg mnie akurat metod chaining jest kompletnie niepotrzebny bo mamy parametry opcjonalne. konstrukcja zapytania do bazy rownie dobrze zamiast $database->select()->from("fff")->where('xxx")... moze wygladac $database->select($filterExpression=null, $sortingExpression=null,$limit=null,$offset=null); i kazdy wpisuje tyle parametrów ile mu potrzeba. mnie sie wydaje ze method chaining moglo by nie miec wielkiej roznicy w wydajnosci w języku kompilowanym, chociazby do kodu bajtowego. natomiast w php będzie miało i ja kiedys nieopatrznie go uzyjesz w metodzie ktora jest wywoływana w skrypcie 1000 razy to sam sie bedziesz dziwil skąd ci sie wział extremalny czas generowania strony. -------------------- "The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time."
Tom Cargill, Bell Labs |
|
|
![]()
Post
#19
|
|
![]() Grupa: Zarejestrowani Postów: 1 798 Pomógł: 307 Dołączył: 13.05.2009 Skąd: Gubin/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Cytat konstrukcja zapytania do bazy rownie dobrze zamiast $database->select()->from("fff")->where('xxx")... moze wygladac $database->select($filterExpression=null, $sortingExpression=null,$limit=null,$offset=null); i kazdy wpisuje tyle parametrów ile mu potrzeba. Subtelna różnica akurat w tym przypadku jest taka, że mogę niektóre "argumenty" mieć w różnych miejscach: Kod $pagination->setTotalCount(12)->setCurrentPage(2); a mogę to też w taki sposób zapisać: Kod $pagination->setCurrentPage(2)->setTotalCount(12); Nie wiem jaki jest narzut, może ktoś ma jakiś mały test przeprowadzony. Odnośnie generowania html poprzez php czy inne języki mam swoje zdanie, a jest ono takie że jest to zbędny narzut i jest mi to wcale do szczęścia nie potrzebne. |
|
|
![]()
Post
#20
|
|
![]() Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Z mojego doświadczenia method chaining nie wpływa na wydajność (mam na myśli serwery produkcyjne z cacheowaniem bytecode).
-------------------- |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 06:42 |