Czy w PHP jest sposób na umieszczenie stałej w ciągu znaków bez konkatenacji?
define('MY_CONSTANT', 42);
echo "This is my constant: MY_CONSTANT";
php
string
constants
concatenation
Brian
źródło
źródło
Odpowiedzi:
Nie.
W przypadku ciągów PHP nie ma sposobu, aby odróżnić dane łańcuchowe od stałych identyfikatorów. Dotyczy to wszystkich formatów ciągów w PHP, w tym heredoc.
constant()
jest alternatywnym sposobem na uzyskanie stałej, ale wywołanie funkcji nie może zostać umieszczone w łańcuchu bez konkatenacji.Podręcznik o stałych w PHP
źródło
define('ANIMAL','turtles'); $constant='constant'; echo "I like {$constant('ANIMAL')}";
Tak to jest (w pewnym sensie;)):
Prawdopodobnie nie do tego dążyłeś, ale myślę, że technicznie nie jest to konkatenacja, ale podstawienie iz tego założenia zawiera stałą w łańcuchu bez konkatenacji .
źródło
Aby użyć stałych wewnątrz łańcuchów, możesz użyć następującej metody:
Jak to działa?
Możesz użyć dowolnej nazwy funkcji łańcuchowej i dowolnych parametrów
Można umieścić dowolną nazwę funkcji w zmiennej i wywołać ją z parametrami wewnątrz łańcucha w cudzysłowie. Działa również z wieloma parametrami.
Produkuje
Funkcje anonimowe też
Możesz także korzystać z funkcji anonimowych pod warunkiem, że używasz PHP 5.3+.
Zgodnie z oczekiwaniami tworzy prawidłowo zmieniony kod HTML.
Tablice wywołań zwrotnych są niedozwolone!
Jeśli do tej pory masz wrażenie, że nazwa funkcji może być dowolna, tak nie jest, ponieważ tablica zwracająca wartość true po przekazaniu do
is_callable
spowodowałaby błąd krytyczny, gdy zostanie użyta w ciągu:Pamiętać
Ta praktyka jest nierozsądna, ale czasami skutkuje znacznie bardziej czytelnym kodem, więc to zależy od Ciebie - taka możliwość istnieje.
źródło
$_ = create_function('$a','return $a;'); $s = "I like {$_(ANIMAL)}"
. Wersja Thetaiko eliminuje potrzebę cytatów, a podkreślenie jest urocze.źródło
źródło
Jeśli naprawdę chcesz uzyskać echo stałej bez konkatenacji, oto rozwiązanie:
uwaga : w tym przykładzie echo przyjmuje szereg parametrów ( spójrz na przecinki ), więc nie jest to rzeczywiste połączenie
Echo zachowuje się jak funkcja, pobiera więcej parametrów, jest bardziej wydajne niż konkatenacja, ponieważ nie musi konkatenować, a potem odbijać, po prostu odbija wszystko bez konieczności tworzenia nowego obiektu łączonego String :))
EDYTOWAĆ
Również jeśli weźmiesz pod uwagę łączenie łańcuchów, przekazywanie łańcuchów jako parametry lub pisanie całych ciągów z " ," , (wersja z przecinkiem) jest zawsze najszybsza, następny idzie . (Konkatenacja z ' pojedynczymi cudzysłowami) a najwolniejsza metoda budowania ciągów używa podwójnych cudzysłowów " , ponieważ wyrażenia napisane w ten sposób muszą być oceniane w odniesieniu do zadeklarowanych zmiennych i funkcji.
źródło
Mógłbyś:
źródło
Najłatwiej jest
Inny sposób użycia
(s)printf
źródło
Jak zauważyli inni, nie możesz tego zrobić. PHP ma funkcję,
constant()
której nie można wywołać bezpośrednio w ciągu znaków, ale możemy łatwo obejść ten problem.i podstawowy przykład użycia:
źródło
$constant = 'constant';
zamiast definiować inną funkcję i będzie działać identycznie, ponieważ ta funkcja już istnieje.Oto kilka alternatyw dla innych odpowiedzi, które wydają się być skoncentrowane głównie na sztuczce „{$}”. Chociaż nie ma gwarancji co do ich szybkości; to wszystko jest czysty cukier syntaktyczny. W tych przykładach przyjmiemy, że zdefiniowano poniższy zestaw stałych.
Używanie ekstraktu ()
To jest fajne, ponieważ wynik jest identyczny ze zmiennymi. Najpierw utwórz funkcję wielokrotnego użytku:
Następnie wywołaj to z dowolnego zakresu:
Tutaj zmniejsza stałe, aby być łatwiejszym dla palców, ale możesz usunąć array_change_key_case (), aby zachować je bez zmian. Jeśli masz już sprzeczne nazwy zmiennych lokalnych, stałe ich nie zastąpią.
Używanie zamiany ciągów znaków
Ta metoda jest podobna do sprintf (), ale używa pojedynczego tokenu zastępczego i przyjmuje nieograniczoną liczbę argumentów. Jestem pewien, że istnieją lepsze sposoby, aby to zrobić, ale wybacz moją niezdarność i spróbuj skupić się na idei, która za tym stoi.
Tak jak poprzednio, tworzysz funkcję wielokrotnego użytku:
Następnie wywołaj to z dowolnego zakresu:
Możesz użyć dowolnego tokena zastępczego, takiego jak% lub #. Użyłem tutaj ukośnika, ponieważ wpisywanie jest nieco łatwiejsze.
źródło
To zabawne, że możesz użyć słowa kluczowego „const” jako nazwy swojej funkcji, aby zapobiec zaśmiecaniu przestrzeni nazw:
Możesz także użyć $ GLOBALS do propagowania funkcji 'const' w całym kodzie:
Nie jestem pewien, czy można go bezpiecznie używać w przyszłości. A co gorsza - nadal wygląda brzydko.
źródło
Myślę, że to odpowiada na pierwotne pytanie PO. Jedyną rzeczą jest to, że klucz indeksu globals wydaje się działać tylko z małymi literami.
Wynik:
źródło
an associative array containing references to all variables
.$db_user = 'root';