Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: empty() vs __get
Forum PHP.pl > Forum > PHP
nospor
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?
Spawnm
  1. if(!$ob->has('dupa'))
pyro
  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
nospor
@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']
Spawnm
To bardziej rozbudować trzeba has aby się dało $ob->has(array('foo', 'bar')); smile.gif
Ew jako kolejna metoda hasIndex czy coś.
nospor
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 :/
Crozin
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.
Spawnm
Działa ok, empty sprawdza index tablicy a nie samą tablicę. Musiał byś dać empty($v->zm3) && empty($v->zm3['jakisindex'])
nospor
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.
Crozin
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.
Spawnm
Cytat
No tak, to się sprowadza do mojego pierwszego zaproponowanego rozwiązania.

Które warto ubrać w has i hasNoEmpty wink.gif
nospor
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']))
Spawnm
A smarty się przypadkiem nie kompiluje do kodu php?
nospor
Kompiluje. I jaki z tego wniosek?
Spawnm
Że dostajesz gotowca? Co się kryje pod 'własny system widoku'?
Crozin
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.
nospor
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.
Spawnm
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
nospor
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
Spawnm
Przyznam że nie widziałem, i chyba nie chcę widzieć ;]
nospor
No nic, chyba zostanę przy takiej funkcji:
  1. public function IsEmpty(){
  2. $numargs = func_num_args();
  3. $t = &$this->variables;
  4. for ($i=0; $i< $numargs; $i++){
  5. $ind = func_get_arg($i);
  6. if (empty($t[$ind]))
  7. return true;
  8. $t = &$t[$ind];
  9. }
  10. return false;
  11. }

I wywołanie:
  1. $v = new VV();
  2. $v->zm2 = array('aa'=>array());
  3. echo $v->IsEmpty('zm2', 'aa','b');

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.