2016-01-09 20 views
6

Podczas gdy ogólne wskazówki są dobre, jest sytuacja, która wydaje mi się dość irytująca i zastanawiałam się, czy istnieje łatwy sposób obejścia tego problemu.

Rozważmy funkcję, która ma zmienną moc-only:

function dumb_foo($param1, $param2, &$out = null) { 
    $out = $param1.'||'.$param2; 
    return $param1*$param2; 
} 

Teraz nawiązaniem połączenia, takie jak:

dumb_foo(5, 6, $my_out); 

Skutkuje to wskazówka mimo że jest wypełniona przez funkcję. Tak, tak, możliwe jest zainicjowanie zmiennej najpierw: ale jest zbędna.

Czy jest jakikolwiek inny sposób na uniknięcie podpowiedzi w tej sytuacji bez całkowitego jej usunięcia lub dodania niepotrzebnej inicjalizacji?

+0

dlaczego ten & $ out = null –

+0

Nie rozumiem tego wskazówkę przy użyciu NetBeans 8.1 z php 5.6 projektu. – VolkerK

Odpowiedz

0

Myślę, że źle rozumiesz, jak działają wartości domyślne. Problem jest, że $my_out nie jest zdefiniowany w momencie tworzenia następujące wywołanie

dumb_foo(5, 6, $my_out); 

Więc jesteś faktycznie przekazując null (w przeciwieństwie do nie przekazując argument w ogóle), co oznacza, że ​​wartość domyślna nie jest użyte (przypadkowo twoja domyślna wartość również jest pusta). Aby zilustrować różnicę:

function dumb_foo(&$out = 'a') { 
    print $out . "\n"; 
} 

dumb_foo($i); // $i is not defined, so prints nothing 
dumb_foo(); // prints 'a', the default value 

W każdym razie, można wyłączyć „Unitialized zmienna” podpowiedź całkowicie:

Tools -> Options -> Editor -> Hints -> PHP -> Unitialized Variables 
+0

Dziękuję za komentarz, ale to nie jest odpowiedź na moje pytanie, ani nie było pomocne. Czy uważasz, że być może dodałem wartość domyślną, abym mógł w ogóle NIE przekazać parametru, jeśli nie potrzebuję go? – Collector

+0

Miałem na myśli "Wyniki w podpowiedzi, mimo że jest wypełniona przez funkcję." - to wskazywało na to, że źle zrozumiałeś przyczynę generowania podpowiedzi, ponieważ podpowiedź jest generowana tuż przed wywołaniem funkcji, więc w rzeczywistości nie ma ona nic wspólnego z funkcją. Jeśli się mylę, przepraszam. – FuzzyTree

+0

Mam na myśli, że funkcja o nazwie jest tą, która przypisuje wartość, więc nie potrzebuję (po mojej stronie), aby ją zainicjować. Więc, według twojej wiedzy, PHP (ani NetBeans) nie mają opcji, aby zdefiniować zmienną jako "out-only", aby upewnić się, że wywołujący nie umieszcza w niej zbędnej wartości zerowej? – Collector

1

do mojej najlepszej wiedzy, myślę, że najlepszym sposobem jest pierwszy zobacz, jak działa przekazywanie według referencji.

case 1: Referenced zmienna $in już zainicjowany ale parametr $outNIE zainicjowany

function increment(&$out) { 
    $out++; 
} 

$in = 4 ; //NOTE: already initialized 
increment($in); 
echo $in; //add up to 5 

Przypadek 2: Referenced zmienna $inNIE zainicjowany ale parametr $out zainicjowany

function increment(&$out = 4) { 
     $out++; 
    } 

    //No initialization of $in 
    increment($in); 
    echo $in; // add up to 1 
    //NOTE:No effect on referenced variable 

przypadek 3: Referenced zmienna $inNIE zainicjowany i parametr $outNIE zainicjowany

function increment(&$out) { 
     $out++; 
    } 

    //No initialization of $in 
    increment($in); 
    echo $in; //add up to 1 

W moim zdaniem, przypadek 3, będzie ważny rozwiązanie dla przykładu, który opisujesz. Dlatego usunięcie inicjalizacji obu $out i $my_out powinno działać dobrze.Coś takiego:

function dumb_foo($param1, $param2, &$out) { 
    $out = $param1.'||'.$param2; 
    return $param1*$param2; 
} 
dumb_foo(5, 6, $my_out); 

Mam nadzieję, że to pomoże!

+0

Dziękuję za odpowiedź, ale nie wydaje mi się, że to, co piszesz, odpowiada na moje pytanie. Będzie wskazówka w obu kierunkach. – Collector

0

Netbeans posiada opcję pod Tools -> Options -> Editor -> Hints -> PHP -> Uninitialized Variabled nazwie Check Variables Initialized by Reference

Podobno jest domyślnie wyłączona, ponieważ wpływa na wydajność IDE.

Więcej na ten temat: NetBeans bug thread

+0

Dzięki za odpowiedź. Zaznaczenie tej opcji i wyświetlenie kodu źródłowego nie spowodowało usunięcia wskazówki. Odznaczenie i próba ponownie nie zrobiły żadnej różnicy. Czy sam to przetestowałeś? – Collector

+0

Tak, próbowałem go z kodem, który opublikowałeś –

+0

OK, cóż, podpowiedzi są nadal tam, czy sprawdzam "Sprawdź zmienne zainicjalizowane przez odniesienie", czy nie, przynajmniej z NetBeans 8.02 i 8.1. Będę musiał głosować tę odpowiedź. – Collector

Powiązane problemy