Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> empty() vs __get
nospor
post 22.05.2013, 19:35:12
Post #1





Grupa: Moderatorzy
Postów: 36 468
Pomógł: 6300
Dołączył: 27.12.2004




Hejka,
mam sobie klasę z metodą magiczną __get, która to metoda zwraca mi właściwość klasy gdy ta istnieje lub zwraca błąd, gdy nie istnieje
  1. public function __get($name) {
  2. if (isset($this->variables[$name])) {
  3. return $this->variables[$name];
  4. }
  5. // a tutaj walę błędem gdy nie istnieje
  6.  
  7. }

No i wszystko byłoby fajnie ale....

Taki o to kod
  1. $ob = new MojaKlasa();
  2.  
  3. if (!empty($ob->wlasciwosc_ktora_nie_istnieje)) {}

rzuca mi błędem, bo przecież właściwośc nie istnieje - no niby wszystko ok. Ale z drugiej strony empty() nie powinno rzucać błędów. Tak wiem, że to nie idzie błąd przez empty tylko przez __get. No ale tu właśnie szlag trafił całą moją dotychczasową logikę....

Przychodzą mi do głowy tylko dwa rozwiązania, oba średnio ładne.
  1. $ob = new MojaKlasa();
  2. if (isset($ob->wlasciwosc_ktora_nie_istnieje) && !empty($ob->wlasciwosc_ktora_nie_istnieje)) {}

lub dopisać do klasy własną metodę empty
  1. $ob = new MojaKlasa();
  2. if (!$ob->empty($ob->wlasciwosc_ktora_nie_istnieje)) {}

ktora to będzie reagowała już właściwie.

Jakieś inne propozycje?


edit: nie, dopisanie własnej metody Empty nic nie da.... pozostaje jedynie isset. Jakieś inne propozycje?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Spawnm
post 22.05.2013, 19:35:16
Post #2





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




  1. if(!$ob->has('dupa'))
Go to the top of the page
+Quote Post
pyro
post 22.05.2013, 19:36:05
Post #3





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


  1. public function __get($name) {
  2. if (isset($this->variables[$name])) {
  3. return $this->variables[$name];
  4. }
  5. return NULL;
  6.  
  7. }


// EDIT

Lub to co @Spawnm

Ten post edytował pyro 22.05.2013, 19:36:45


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
nospor
post 22.05.2013, 19:38:53
Post #4





Grupa: Moderatorzy
Postów: 36 468
Pomógł: 6300
Dołączył: 27.12.2004




@pyro nie rozumiem co niby twoj kod miał robić prócz faktu, że wywaliłeś moj lecący error. Error ma lecieć, ale akurat nie w sytuacji co opisałem.

@spawnm też o tym myślałem, ale sprawa się komplikuje gdy to nie jest
$ob->wlasciwosc_ktora_nie_istnieje
a jest np
$ob->wlasciwosc_ktora_nie_istnieje['jakiś index']


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Spawnm
post 22.05.2013, 19:52:16
Post #5





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




To bardziej rozbudować trzeba has aby się dało $ob->has(array('foo', 'bar')); smile.gif
Ew jako kolejna metoda hasIndex czy coś.
Go to the top of the page
+Quote Post
nospor
post 22.05.2013, 19:59:11
Post #6





Grupa: Moderatorzy
Postów: 36 468
Pomógł: 6300
Dołączył: 27.12.2004




I chyba się nie obejdzie bez tego bo w php mają bobol chyba.

Zgodnie z manualem:
__isset() is triggered by calling isset() or empty() on inaccessible properties.

I faktycznie, gdy robię
empty($v->zm3);
to przechodzi to przez __isset i nie ma problemu.

Ale gdy robię
empty($v->zm3['jakisindex']);
to niestety przechodzi to już przez __get i pojawia się problem :/


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Crozin
post 22.05.2013, 20:02:30
Post #7





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Po co w ogóle korzystasz z __get()? Dlaczego po prostu nie utworzysz normalnych metod get() oraz has()? Problemy same się rozwiążą. A jeżeli potrzebujesz połączenia sprawdzenia istnienia danego klucza i jego "niepustości" utwórz sobie metodę hasNoEmpty($key). Kod będzie nieporównywalnie bardziej czytelny.

P.S. Poza nielicznymi sytuacjami powinieneś korzystać z array_key_exisists do sprawdzania czy dany klucz istnieje w tablicy. isset zwróci Ci fałszywy wynik w przypadku, gdy wartość znajdująca się pod danym kluczem jest nullem.

Ten post edytował Crozin 22.05.2013, 20:03:56
Go to the top of the page
+Quote Post
Spawnm
post 22.05.2013, 20:05:12
Post #8





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Działa ok, empty sprawdza index tablicy a nie samą tablicę. Musiał byś dać empty($v->zm3) && empty($v->zm3['jakisindex'])
Go to the top of the page
+Quote Post
nospor
post 22.05.2013, 20:06:24
Post #9





Grupa: Moderatorzy
Postów: 36 468
Pomógł: 6300
Dołączył: 27.12.2004




Ponieważ chcę korzystać z kodu w taki sposób:
echo $ob->zm
a nie
echo $ob->get('zm')
lub nie
echo $ob->get(array('zm','index'))

Chyba że coś przeoczyłem w Twojej wypowiedzi.

Ad ps: tak wiem.

Cytat
Musiał byś dać empty($v->zm3) && empty($v->zm3['kisindex'])
No tak, to się sprowadza do mojego pierwszego zaproponowanego rozwiązania.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Crozin
post 22.05.2013, 20:06:57
Post #10





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Co jest nie tak z $ob->get('zm')->get('index')?

Mógłbyś napisać co finalnie chciałbyś osiągnąć? Jaki jest cel tego kodu? Mam wrażenie, że mamy tutaj do czynienia z problemem XY.

Ten post edytował Crozin 22.05.2013, 20:08:15
Go to the top of the page
+Quote Post
Spawnm
post 22.05.2013, 20:07:42
Post #11





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Cytat
No tak, to się sprowadza do mojego pierwszego zaproponowanego rozwiązania.

Które warto ubrać w has i hasNoEmpty wink.gif
Go to the top of the page
+Quote Post
nospor
post 22.05.2013, 20:11:50
Post #12





Grupa: Moderatorzy
Postów: 36 468
Pomógł: 6300
Dołączył: 27.12.2004




No wlasnie nie, bo przy tablicach i indeksach to się robi burdel tylko. Wolę już dopisać tego isset do warunku.

Cytat
Co jest nie tak z $ob->get('zm')->get('index')?
A to ciekawe. Jak niby taką metodą pobierzesz index X tablicy Y? Zakładam że napisałeś to na szybkiego wink.gif

Cytat
Mógłbyś napisać co finalnie chciałbyś osiągnąć? Jaki jest cel tego kodu? Mam wrażenie, że mamy tutaj do czynienia z problemem XY.

Przepisuję kod ze smartiego na własny system widoku. Nie chcę za dużo zmieniać w kodzie bo kodów mam sporo.
I jeśli w smarty było
{if !empty($zm.index)}
to ja chciałem poprostu zamienić to na:
if (!empty($this->zm['index']))


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Spawnm
post 22.05.2013, 20:22:53
Post #13





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




A smarty się przypadkiem nie kompiluje do kodu php?
Go to the top of the page
+Quote Post
nospor
post 22.05.2013, 20:23:29
Post #14





Grupa: Moderatorzy
Postów: 36 468
Pomógł: 6300
Dołączył: 27.12.2004




Kompiluje. I jaki z tego wniosek?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Spawnm
post 22.05.2013, 20:25:57
Post #15





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Że dostajesz gotowca? Co się kryje pod 'własny system widoku'?
Go to the top of the page
+Quote Post
Crozin
post 22.05.2013, 20:28:06
Post #16





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Cytat
A to ciekawe. Jak niby taką metodą pobierzesz index X tablicy Y? Zakładam że napisałeś to na szybkiego wink.gif
Tutaj po prostu założyłem, że nie będziesz korzystać bezpośrednio z PHP-owskich tablic tylko z obiektów-kolekcji.
Cytat
Przepisuję kod ze smartiego na własny system widoku. Nie chcę za dużo zmieniać w kodzie bo kodów mam sporo.
I jeśli w smarty było
{if !empty($zm.index)}
to ja chciałem poprostu zamienić to na:
if (!empty($this->zm['index']))
No to teraz przynajmniej znamy problem. wink.gif

Bezpośrednie przepisanie tego, może być nieco kłopotliwe i nie pozostaje Ci chyba nic innego jak:
1. Ręczne sprawdzanie każdego elementu w łańcuchu przy pomocy empty()/isset().
2. Utworzenie jakiejś funkcji pomocniczej, która jako pierwszy argument przyjmowałaby zmienną, jako drugi coś na kształt PropertyPath i wykonywała całą robotę za Ciebie.
Go to the top of the page
+Quote Post
nospor
post 22.05.2013, 20:30:45
Post #17





Grupa: Moderatorzy
Postów: 36 468
Pomógł: 6300
Dołączył: 27.12.2004




Cytat
Że dostajesz gotowca? Co się kryje pod 'własny system widoku'?

Znaczy że mam taki fajny system jak SMARTY i nie potrzebnie chce pisać coś własnego? Nie no, proszę, to nie jest temat na to czy SMARTY jest fajny czy nie. Przedstawiłem problem i chciałbym się na nim skupić a nie na tym dlaczego nie chcę już jechać na SMARTYM.

@Crozin no i właśnie chyba nie pozostaje mi nic innego.
Powód edycji: [nospor]:


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Spawnm
post 22.05.2013, 20:32:42
Post #18





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Miałem na myśli że możesz skorzystać z skompilowanego kodu i olać przepisywanie. Osobiście nie trawię smarto podobnych wynalazków wink.gif
Go to the top of the page
+Quote Post
nospor
post 22.05.2013, 20:34:58
Post #19





Grupa: Moderatorzy
Postów: 36 468
Pomógł: 6300
Dołączył: 27.12.2004




Cytat
Miałem na myśli że możesz skorzystać z skompilowanego kodu i olać przepisywanie
A nie, nie ma takiej opcji smile.gif CHyba nie widziałeś tych potwórków do jakich on to kompiluje, w których jest cała masa jego funkcji i odwołań do jego zmiennych smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Spawnm
post 22.05.2013, 20:38:43
Post #20





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Przyznam że nie widziałem, i chyba nie chcę widzieć ;]
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 26.05.2024 - 06:49