Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]auto defined index
Forum PHP.pl > Forum > Przedszkole
Johnas
Witam. Mam kolejny problem : (
Chciał bym zdefiniować jedną zmienną która by zapobiegała tym błędom. Jest taka możliwość?

Chodzi mi o wszystkie tablice w $lang

coś na wzór $lang[%]; gdzie % zastępuje wszystkie znaki. Jest taka możliwość?
lobopol
O ile się nie mylę to nie masz takiej opcji, w ostateczności możesz sobie funkcje napisać np.
  1. function funkcja($index){
  2. global $tablica;//jak nie chcesz za każdym razem przekazywać tablicy do funkcji
  3. if(isset($tablica[$index])){
  4. return $tablica[$index];
  5. } else{
  6. return 'wartość domyślna';
  7. }
  8. }
Johnas
Bardziej mi chodzi o to że jeżeli definiuje zmienną w index.php która zostaje wykonana po jakiejś akcji czyli np $_POST
index.php:
  1. <?php
  2. if (isset($_POST)){
  3. $lang['nazwa'] = 'cos';
  4. }
  5. ?>


To aby w index.tpl nie wyskakiwało:
Kod
Notice: Undefined index: nazwa in C:\xampp\htdocs\templates\default\index.tpl on line 00


index.tpl wygląda mniej więcej tak:
  1. <?php
  2. echo <<< TPL
  3. <tag>{$lang['nazwa']}</tag>
  4. TPL;
  5. ?>


aby nie wyskakiwał błąd index.php musi wyglądać mniej więcej tak:
  1. <?php
  2. $lang['nazwa'] = '';
  3.  
  4. if (isset($_POST)){
  5. $lang['nazwa'] = 'cos';
  6. }
  7. ?>


Po pewnym czasie będzie zapełniony plik samym deklarowaniem pustych tablic. Mi chodzi czy da się zastąpić:
  1. $lang['nazwa'] = '';
  2. $lang['druganazwa'] = '';


w jednej tablicy.
maviozo
Możesz albo wyłączyć powiadomienie o nieistniejących zmiennych
http://www.php.net/manual/en/function.error-reporting.php czyli coś w stylu ~E_NOTICE

albo wykonywać instrukcje dopiero, kiedy wiesz, że dokładnie wszystkie potrzebne indeksy nie są puste.
by_ikar
Zamiast tworzyć ileś tych issetów, kłania się w sumie początek większości tutoriali i książek związanych z php - ponowne wykorzystanie kodu. Otóż, możesz sobie zrobić klasę lub funkcje, co uważasz za wygodniejsze i albo definiujesz w tej funkcji/klasie zmienną i na niej operujesz, albo konkretną zmienną przekazujesz jako parametr. Pokaże ci to na przykładzie funkcji:

Kod
function getParam($key, $default = null)
{
    return isset($_GET[$key]) ? $_GET[$key] : $default;
}


I późniejsze wykorzystanie:

Kod
<?php
echo <<< TPL
<tag>{getParam('nazwa')}</tag>
TPL;
?>


lub w przypadku kiedy chcemy żeby nasza domyślna wartość była określona:

Kod
$pagination = new Pagination();
$pagination->
    setPerPage(40)->
    setTotalCount(160)->
    setCurrentPage(getParam('page', 1));


Oczywiście to tylko przykład, bo możesz sobie to wykorzystać jak chcesz. Możesz stworzyć sobie funkcję która będzie pobierać parametr i funkcję która będzie wrzucać te parametry. Przydatne przy operowaniu na tablicach (POST, GET, jakaś konfiguracja, czy nawet locale).

Kod
function locale($key, $default = null)
{
    return isset($locale[$key]) ? $locale[$key] : $default;
}


Możliwości jest tyle ile tylko sobie jesteś w stanie wyobrazić wink.gif

PS nie baw się w coś takiego jak maskowanie błędów zaproponowane wyżej. Wszystkie małpy (@) do tłumienia błędów, czy ~E_NOTICE nie są tak na prawdę do niczego potrzebne wink.gif
Sephirus
Jest też dużo bardziej zaawansowana zabawa.

Możesz stworzyć klasę, odpowiednio zaimplementować w niej iterator i zamiast działać na tablicach - możesz działać na takim obiekcie (który zachowywałby się jak tablica).

co by Ci to dało? Otóż smile.gif taki obiekt byłbym niczym innym jak obiektem z tablicą jako własność, do której dostęp byłby regulowany przez magiczne metody czy metody interfejsu ITERATOR - wtedy mógłbyś w takiej klasie kazać sprawdzać czy dany index jest w tabeli i zwracać go lub zwracać '' gdy go nie ma wink.gif

TO wygodne rozwiązanie do użycia - ale musiałbyś poczytać jak to zrobić wink.gif

A tak w ogóle to ja jestem jednak za sprawdzaniem czy dana zmienna istnieje itd. Kod powinien być napisany tak by nie posiadał żadnych tajemnic smile.gif Możesz robiąc takie rzeczy pozostawiać masę błędów. Zmienne będą przekazywane dalej i dalej nawet jak nie będą ustawione poprawnie i to może powodować niezły chaos w szukaniu błędu ;P

EDIT - zapomniałem sam ITERATOR nie wystarczy to Ci tylko da możliwość użycia obiektu w FOREACH'u - przede wszystkim musisz zaimplementować też ArrayAccess wink.gif
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.