Czy jest jakiś sposób, aby łatwo rozwiązać ten problem, czy naprawdę muszę przepisać cały starszy kod?
Błąd krytyczny PHP: Usunięto przekazanie odwołania według czasu połączenia w ... w linii 30
Dzieje się tak wszędzie, ponieważ zmienne są przekazywane do funkcji jako odwołania w całym kodzie.
Odpowiedzi:
Powinieneś oznaczać wywołanie przez odwołanie w definicji funkcji, a nie rzeczywiste wywołanie. Ponieważ PHP zaczęło wyświetlać błędy przestarzałości w wersji 5.3, powiedziałbym, że dobrym pomysłem byłoby przepisanie kodu.
Z dokumentacji :
Na przykład zamiast używać:
Posługiwać się:
źródło
E_COMPILE_WARNING
błąd poziomu, dla odniesienia: php.net/manual/en/…Dla każdego, kto, podobnie jak ja, czyta to, ponieważ musi zaktualizować gigantyczny starszy projekt do wersji 5.6: jak wskazują tutaj odpowiedzi, nie ma szybkiej poprawki: naprawdę musisz znaleźć każde wystąpienie problemu ręcznie i naprawić .
Najwygodniejszy sposób, w jaki znalazłem znalezienie wszystkich problematycznych linii w projekcie (bez użycia pełnoprawnego analizatora kodu statycznego, co jest bardzo dokładne, ale nie znam takich, które od razu zabiorą cię do właściwej pozycji w edytorze) używałem Visual Studio Code, który ma wbudowany ładny linter PHP, a także jego funkcję wyszukiwania, która pozwala na wyszukiwanie według Regex. (Oczywiście można do tego użyć dowolnego edytora IDE / Code, który przeszukuje PHP i wyszukuje Regex.)
Za pomocą tego wyrażenia regularnego:
możliwe jest przeszukiwanie całego projektu pod kątem występowania
&$
tylko w wierszach, które nie są definicją funkcji.Nadal pojawia się wiele fałszywych trafień, ale ułatwia to pracę.
Przeglądarka wyników wyszukiwania VSCode sprawia, że przechodzenie i znajdowanie obraźliwych linii jest bardzo łatwe: wystarczy kliknąć każdy wynik i zwrócić uwagę na te, które linijka podkreśla na czerwono. Te, które musisz naprawić.
źródło
(?<!function)[:> ][a-zA-Z0-9_]+(?<!foreach|array)\s?\([^()]*&\$
PHP i referencje są nieco nieintuicyjne. Odpowiednio użyte odnośniki w odpowiednich miejscach mogą zapewnić dużą poprawę wydajności lub uniknąć bardzo brzydkich obejść i nietypowego kodu.
Następujące spowoduje błąd:
Żadne z nich nie musi zawieść, ponieważ mogą one przestrzegać poniższych zasad, ale bez wątpienia zostały usunięte lub wyłączone, aby zapobiec wielu nieporozumieniom.
Jeśli zadziałały, oba obejmują redundantną konwersję do referencji, a druga obejmuje również redundantną konwersję z powrotem do zmiennej o ograniczonym zasięgu.
Drugi umożliwiał przekazanie referencji do kodu, który nie był przeznaczony do pracy z referencjami. Jest to wyjątkowo brzydkie ze względu na łatwość konserwacji.
To nic nie da:
Mówiąc dokładniej, zamienia referencję z powrotem w normalną zmienną, ponieważ nie poprosiłeś o referencję.
To zadziała:
Widzisz, że przekazujesz nie-referencję, ale chcesz referencji, więc zamienia ją w referencję.
Oznacza to, że nie można przekazać referencji do funkcji, w której referencja nie jest wyraźnie proszona o uczynienie z niej jednego z niewielu obszarów, w których PHP ściśle przekazuje typy lub w tym przypadku bardziej typu meta.
Jeśli potrzebujesz bardziej dynamicznego zachowania, zadziała to:
Tutaj widzisz, że chcesz referencję i już ją masz, więc zostaw ją w spokoju. Może również łańcuch odniesienia, ale wątpię w to.
źródło