Php jednostruki i dvostruki navodnici. Razlika između dvostrukih i jednostrukih navodnika u PHP-u. Primjer #3 Heredoc primjer definicije stringa

Kao što ste vidjeli u prethodnom tutorijalu, naredba echo u php-u je sredstvo za izlaz teksta. Tokom vaše PHP karijere, koristićete komandu echo više nego bilo koju drugu. Pa hajde da ga dobro pogledamo!

Linijski izlaz

Za izlaz stringa, kao što smo radili u prethodnim lekcijama, koristi se echo. Uz njegovu pomoć možete prikazati tekst u navodnicima, varijabilnim vrijednostima itd. Pogledajmo primjer.

Volim da koristim PHP!"; ?>

Iznošenje fraze "Zdravo!" Već smo upoznati, tu nema ništa novo. Ali sljedeća naredba echo, kao što vidite, sadrži html tag. Nije zabranjeno koristiti html tagove, jer nam php daje dinamiku, a statika i dizajn stranice su i dalje na milosti običnog html-a.

Budite oprezni, dvostruki navodnici!

Vrlo je cool što možete ispisati HTML unutar PHP-a. Međutim, trebali biste biti oprezni kada koristite HTML kod ili bilo koji drugi niz koji sadrži navodnike! Echo koristi navodnike za definiranje početka i kraja niza, tako da morate koristiti jednu od sljedećih opcija ako želite koristiti navodnike unutar echa:

  • Nemojte koristiti navodnike unutar niza.
  • Izbjegnite unutrašnje navodnike kosom crtom. Da biste izbjegli obradu unutrašnjih navodnika, jednostavno stavite obrnutu kosu crtu neposredno ispred njih, tj. \".
  • Koristite jednostruke navodnike (apostrofe) unutar niza.

Pogledajte naš primjer u nastavku za ispravnu i netačnu upotrebu naredbe echo:

Volim da koristim PHP!"; // OK jer smo izbjegli navodnike! echo "

Volim da koristim PHP!
"; // OK jer smo koristili apostrof " echo "
Volim da koristim PHP!
"; ?>

Ako želite ispisati niz koji sadrži navodnike, ili koristite apostrof (‘) ili izbjegnite navodnike postavljanjem kose crte (\") ispred njih. Obrnuta kosa crta će reći PHP-u da želite da interpretator ne raščlani karakter nakon njega!

Varijabilni izlaz

Izvođenje varijabli je vrlo jednostavno. U stvari, ne morate da radite ništa posebno da biste prikazali varijable u PHP-u. On to može sam. Evo primjera koji će vam pomoći da sve shvatite:

rezultat:

Zdravo Bobe. Moje ime je: 4a

Simultani izlaz varijabli i tekstualnih nizova

Također možete ispisati varijable u dvostrukim navodnicima (na primjer, "text text $variable"). Stavljanjem varijable unutar znakova navodnika ("") kažete PHP-u da želite da preuzme svoju vrijednost, konvertuje je u tip stringa i ispiše je. Primjer ispod pokazuje kako pravilno izvesti ovaj trik :)

"; echo "Zdravo, ja sam Bob. Ko si ti? $my_string
"; echo "Zdravo, ja sam Bob. Ko si ti? $my_string Bobetta"; ?>

rezultat:

Zdravo Bobe. Moje ime je: Bobetta Zdravo, ja sam Bob. Ko si ti? Zdravo Bob. Moje ime je: Zdravo, ja sam Bob. ko si ti Zdravo Bobe. Moje ime je: Bobetta

Postavljanje varijabli unutar reda može uštedjeti vrijeme i učiniti vaš kod lakšim za čitanje, ali treba se naviknuti. Ne zaboravite da koristite navodnike, jednostruki navodnici neće dati vrijednosti varijabli. Jednostruki navodnici će jednostavno ispisati ime varijable u string, tj. $my_string, a ne "Zdravo Bobe. Moje ime je."

Eho nije karakteristika!

Eho nije funkcija, već jezička konstrukcija. Kada koristite funkcije u PHP-u, one imaju vrlo specifičnu formu, koju ćemo svakako pogledati malo kasnije. Za sada samo znajte da je eho poseban alat koji će vam se sigurno svidjeti! :D

PHP konkatenacija nizova

Možda je najčešća operacija sa stringovima njihova konkatenacija, ili spajanje jednog niza drugom. Za spajanje nizova uveden je poseban operator “.” (tačka).

primjer:


Na izlazu dobivamo cijelu liniju: "Moja rodna zemlja je široka!"

Vrijednosti tipa string su tekstualni nizovi (skraćeno nizovi). Niz je niz od nula ili više znakova. Znakovi uključuju slova, brojeve, interpunkciju, posebne znakove i razmake.

Niz se može definirati na četiri različita načina:

  • dvostruki navodnici
  • jednostruki navodnici
  • heredoc sintaksa
  • nowdoc sintaksa

Niz u dvostrukim navodnicima

Niz u dvostrukim navodnicima:

Možete koristiti izlazne sekvence u nizovima u dvostrukim navodnicima. Kontrolna sekvenca— ovo su posebni znakovi dizajnirani za formatiranje izlaznog teksta. Sljedeće escape sekvence su dostupne u PHP-u:

Glavno svojstvo stringova sa dvostrukim navodnicima je sposobnost rukovanja varijablama unutar stringova.


Znak dolara: \$";

Nizovi zatvoreni u dvostrukim navodnicima mogu sadržavati jednostruke navodnike:

Echo "Jednostruki navodnik: "";

Niz u jednostrukim navodnicima (apostrofi)

Niz u jednostrukim navodnicima:

$str = "String"; echo "Jedan veliki red se može razbiti na nekoliko malih redova kako bi se lakše čitao.";

Za razliku od nizova sa dvostrukim navodnicima i heredoc sintakse, varijable i kontrolne sekvence (sa jednim izuzetkom) zatvorene u jednostruke navodnike se ne obrađuju. To znači da će se oni tumačiti kao normalni znakovi niza:

$num = 10; echo "Broj: $num
Znak dolara: \$";

Da biste mogli koristiti pojedinačne navodnike u nizu koji je zatvoren u jednostrukim navodnicima, morate ih izbjeći pomoću obrnute kose crte (\"). Ako trebate napisati samu obrnutu kosu crtu, morate je duplicirati (\\):

Echo "Koristite \"jednostruke\" navodnike unutra"; echo "Backlash: \\";

Nizovi zatvoreni u jednostrukim navodnicima mogu sadržavati dvostruke navodnike:

Echo "Dvostruki navodnik: "";

Heredoc sintaksa

Heredoc sintaksa je alternativni način za pisanje stringova.

Niz definiran korištenjem Heredoc sintakse funkcionira isto kao string zatvoren u dvostrukim navodnicima. Razlika između Heredoc-a i stringa sa dvostrukim navodnicima je u tome što kod Heredoc-a nema potrebe za izbjegavanjem dvostrukih navodnika.

Heredoc sintaksa počinje sa tri znaka<<< , после которых должен быть указан произвольный идентификатор (назовём его открывающим). Идентификатор может быть указан как в двойных кавычках, так и без них. Odmah nakon identifikatora ne smije se nalaziti novi red, osim novog reda, inače će doći do greške. Zatim dolazi sam sadržaj niza. Nakon sadržaja niza, u posebnom redu, mora se navesti završni identifikator (isto kao poslije<<<). Перед ним и после него не должно быть никаких пробелов или других символов, за исключением точки с запятой. Если это правило нарушено, то считается, что закрывающий идентификатор отсутствует и будет вызвана ошибка:

<<

Nowdoc sintaksa

Nowdoc sintaksa, kao Heredoc, je alternativni način za pisanje stringova.

Niz definiran korištenjem Nowdoc sintakse funkcionira isto kao string unutar pojedinačnih navodnika. Razlika između Nowdoc-a i stringa sa jednim navodnicima je u tome što sa Nowdoc-om nema potrebe za izbjegavanjem pojedinačnih navodnika.

Sintaksa Nowdoc-a je slična Heredoc-u, s jedinom razlikom što početni identifikator mora biti zatvoren u jednostrukim navodnicima:

$num = 10; echo<<<"some_id" Число: $num some_id;

Rukovanje varijablama u nizovima

Postoje dvije vrste sintakse za rukovanje varijablama u nizovima: jednostavno I teško.

Jednostavna sintaksa- ovo je kada je ime varijable naznačeno u redu kao što jeste.

Kada tumač naiđe na znak dolara, počinje uzastopno provjeravati da li su svi sljedeći znakovi ispravni znakovi u imenu varijable. Dakle, da bi se formiralo valjano ime varijable, ona hvata što je moguće više znakova:

$str = "Svijet!"; echo "Zdravo $str";

Složena sintaksa- ovo je kada je ime varijable zatvoreno u vitičaste zagrade.

Budući da, da bi obradio varijablu u liniji, interpreter hvata što je moguće više znakova, postoje situacije kada interpretator nije u mogućnosti samostalno odrediti gdje se naziv varijable završava:

$sport1 = "hoće"; $sport2 = "noga"; echo "Volim $sport1ball i $sport2ball";

U ovom slučaju, željeni rezultat neće biti postignut jer će tumač smatrati da je $sport1 dio imena varijable $sport1bol, koja ne postoji.

Da biste eksplicitno rekli interpretatoru gdje završava ime varijable, morate staviti ime varijable u vitičaste zagrade:

$sport1 = "hoće"; $sport2 = "noga"; echo "Sviđa mi se ($sport1)bol i ($sport2)bol.";

Znak dolara može se postaviti prije ili iza vitičaste zagrade:

$sport1 = "hoće"; $sport2 = "noga"; echo "Sviđaju mi ​​se $(sport1)bol i ($sport2)bol.";

Konkatenacija

Konkatenacija je spajanje dva ili više nizova u jedan veći niz. Povezivanje se događa pomoću operatora konkatenacije - . (tačka). Prilikom spajanja, svaki sljedeći red se dodaje na kraj prethodnog:

Vrijednost bilo kojeg tipa koja je spojena sa nizom bit će implicitno konvertirana u niz, a zatim spojena:

"; echo "Broj: " . 1; ?>

Najjednostavniji način da se definira string je da se stavi u jednostruke navodnike (simbol " ).

Da biste koristili jedan navodnik unutar niza, izmaknite ga obrnutom kosom crtom ( \ ). \\ Ako trebate napisati samu obrnutu kosu crtu, duplirajte je ( ). Sve druge upotrebe obrnute kose crte će se tumačiti kao normalni znakovi: to znači da ako pokušate koristiti druge izlazne sekvence kao što je \r ili

\n , oni će biti ispisani takvi kakvi jesu umjesto bilo kakvog posebnog ponašanja.;

\n echo
"ovo je jednostavan niz"
„Možete i umetnuti u redove
;

karakter za novi red ovako,
\n ovo je u redu";

// Izlazi: Arnold je jednom rekao: "Vratit ću se" "Jednog dana Arnold je rekao: 'Vratiću se.';

Echo
"Jeste li izbrisali C:\\*.*?"

// Izlazi: Jeste li izbrisali C:\*.*?
\n "Ovo neće biti prošireno: \n novi red";

// Izlazi: $expand i $either varijable nisu proširene
\n "$expand i $either varijable nisu proširene";
?>

Dvostruki navodnici

Ako je niz stavljen u dvostruke navodnike ("), PHP prepoznaje više izlaznih sekvenci za specijalne znakove:

Escape Sequences
Subsequence Značenje
\r novi red (LF ili 0x0A (10) u ASCII)
). povratak na nosivu (CR ili 0x0D (13) u ASCII)
\t horizontalna kartica (HT ili 0x09 (9) u ASCII)
\v vertikalna kartica (VT ili 0x0B (11) u ASCII) (od PHP 5.2.5)
\e escape znak (ESC ili 0x1B (27) u ASCII) (od PHP 5.4.4)
\f feed stranice (FF ili 0x0C (12) u ASCII) (od PHP 5.2.5)
\\ obrnuta kosa crta
\$ znak dolara
\" dvostruki citat
\{1,3} niz znakova koji odgovara regularnom izrazu znaka u oktalnom brojevnom sistemu
\x(1,2) niz znakova koji odgovara regularnom izrazu znaka u heksadecimalnom zapisu

Kao i kod stringa zatvorenog u jednostruke navodnike, izbjegavanje bilo kojeg znaka će također dati samu obrnutu kosu crtu. Prije PHP 5.1.1, obrnuta kosa crta \($var) nije objavljena.

Heredoc

Treći način definiranja stringova je korištenje heredoc sintakse: <<< . Nakon ovog operatora, morate navesti identifikator, a zatim prijelaz na red. Nakon toga dolazi sama linija, a zatim isti identifikator, koji zatvara umetanje.

Linija trebalo bi početi sa završnim identifikatorom, tj. mora se pojaviti u prvoj koloni reda. Dodatno, identifikator mora slijediti ista pravila imenovanja kao i sve druge oznake u PHP-u: sadržavati samo alfanumeričke znakove i donju crtu i ne smije početi brojem (donje crte su dozvoljene).

Pažnja

Vrlo je važno napomenuti da završni red identifikatora ne smije sadržavati nikakve druge znakove osim točke i zareze ( ; ). To znači da je id ne treba biti uvučen i da ne može biti nikakvih razmaka ili tabulatora prije ili poslije tačke i zareza. Također je važno razumjeti da prvi znak prije završnog identifikatora mora biti znak novog reda definiran od strane vašeg operativnog sistema. Na primjer, na UNIX sistemima, uključujući Mac OS X, ovo \r. Nakon završnog identifikatora, novi red također mora početi odmah.

Ako je ovo pravilo prekršeno i identifikator zatvaranja nije "čist", smatra se da nedostaje i PHP će nastaviti da ga traži dalje. Ako se u ovom slučaju nikada ne pronađe ispravan identifikator zatvaranja, to će uzrokovati grešku raščlanjivanja s brojem reda na kraju skripte.

Heredoc se ne može koristiti za inicijalizaciju polja klase.

Počevši od PHP 5.3, ovo ograničenje se odnosi samo na heredocs koji sadrže varijable.

Primjer #1 Pogrešan primjer
klasa foo (<<javni $bar =
bar
}
?>

EOT;

Heredoc tekst se ponaša na isti način kao string u dvostrukim navodnicima, a da ih nema. To znači da ne morate izbjegavati navodnike u heredoc, ali i dalje možete koristiti gornje izlazne sekvence.

Varijable se obrađuju, ali morate biti oprezni kada koristite složene varijable unutar heredoc-a kao i kada radite sa stringovima.<<Primjer #2 Primjer definiranja heredoc stringa
$str =
Primjer linije,
pokriva nekoliko linija,

koristeći heredoc sintaksu.
{
EOD;
Class foo

var $foo ;
{
var $bar ;
Funkcija foo()
}
}

$this -> foo = "Foo" ;
$this ->

$foo = novi foo();<<$name = "MojeIme" ; .
echo
Moje ime je "$name". Ukucam $foo -> foo .
Sad zaključujem
( $foo -> bar [ 1 ])
?>

Ovo bi trebalo dati veliko slovo "A": \x41

EOT;

Moje ime je "MyName". Ukucam Foo. Sada, ispisujem Bar2. Ovo bi trebalo proizvesti veliko slovo "A": A

Također je moguće koristiti heredoc sintaksu za prosljeđivanje podataka kroz argumente funkcije:

Od verzije 5.3.0, postalo je moguće inicijalizirati statičke varijable i svojstva/konstante klase koristeći heredoc sintaksu:
Primjer #4 Korišćenje heredoc za inicijalizaciju statičkih varijabli
{
// Statičke varijable<<funkcija foo()
statički $bar =
}

Ovde nema ničega...
LABEL;
{
// Svojstva/konstante klase<<class foo
const BAR =

Primjer korištenja konstante<<FOOBAR;
const BAR =
}
?>

Javni $baz =

Primjer korištenja polja

Od PHP 5.3.0, Heredoc identifikator možete okružiti i dvostrukim navodnicima: Nowdoc Nowdoc je isti za stringove sa jednostrukim navodnicima kao heredoc za nizove sa dvostrukim navodnicima. Nowdoc je sličan heredocu, ali unutar njega

Nowdoc je označen istim nizom <<< , koji se koristi u heredoc, ali je sljedeći identifikator zatvoren u jednostrukim navodnicima, na primjer, <<<"EOT" .

Svi uslovi koji se primjenjuju na heredoc identifikatore također se primjenjuju na nowdoc, posebno oni koji se odnose na završni identifikator.

Varijable se obrađuju, ali morate biti oprezni kada koristite složene varijable unutar heredoc-a kao i kada radite sa stringovima.<<<"EOD"
Primjer #6 Primjer Nowdoc
Primjer teksta,
obuhvata nekoliko linija
pokriva nekoliko linija,

koristeći sintaksu nowdoc.
LABEL;
{
/* Složeniji primjer sa varijablama. */
public $foo ;

var $foo ;
{
var $bar ;
javni $bar ;
}
}

$this -> foo = "Foo" ;
$this ->

$foo = novi foo();<<<"EOT"
$this -> bar = array("Bar1" , "Bar2" , "Bar3" );
Moje ime je "$name". Štampam $foo->foo.
Sada štampam ($foo->bar).
( $foo -> bar [ 1 ])
?>

Ovo ne bi trebalo da daje veliko "A": \x41

Rezultat pokretanja ovog primjera:

Moje ime je "$name". Štampam $foo->foo. Sada štampam ($foo->bar). Ovo ne bi trebalo da daje veliko "A": \x41:

Komentar

Za razliku od heredoc-a, nowdoc se može koristiti u bilo kojem kontekstu sa statičkim podacima. Tipičan primjer inicijalizacije polja klase ili konstanti:

Primjer #1 Pogrešan primjer
klasa foo (<<<"EOT"
javni $bar =
( $foo -> bar [ 1 ])
}
?>

Moje ime je "$name". Štampam $foo->foo. Sada štampam ($foo->bar). Ovo ne bi trebalo da daje veliko "A": \x41:

Primjer #7 Primjer korištenja statičkih podataka

Nowdoc podrška je dodana u PHP 5.3.0.

Rukovanje varijablama

Ako je niz naveden u dvostrukim navodnicima ili koristeći heredoc, varijable unutar njega se obrađuju. Postoje dvije vrste sintakse: jednostavna i složena. Jednostavna sintaksa je lakša i praktičnija. Omogućava obradu varijable, vrijednosti niza ( niz) ili svojstva objekta (

objekt

) uz minimum napora.

Složena sintaksa se može prepoznati po vitičastim zagradama koje okružuju izraz. $ Jednostavna sintaksa

Ako prevodilac naiđe na znak dolara (

), hvata što je moguće više znakova kako bi formirao ispravno ime varijable. Ako želite da navedete kraj imena, stavite ime varijable u vitičaste zagrade.
$juice = "jabuka" ;
echo "Popio je sok od $juice." . PHP_EOL ;
// ne radi, "s" je važeći znak za ime varijable,
?>

Ovo ne bi trebalo da daje veliko "A": \x41

// ali naša varijabla se zove $juice.

echo "Popio je sok od $sokova." ; Postoje dvije vrste sintakse: jednostavna i složena. Popio je sok od jabuke. Popio je sok od . niz Element niza ( ] ) ili svojstvo objekta (

).

U indeksima niza postoji uglasta zagrada koja zatvara (

) označava kraj definicije indeksa.
Ista pravila se primjenjuju na svojstva objekta kao i na jednostavne varijable.
echo "Popio je malo $juices [ koolaid1 ] sok." . PHP_EOL ;

klasni ljudi (
public $john = "John Smith" ;
public $jane = "Jane Smith" ;
public $robert = "Robert Paulsen" ;

Public $smith = "Smith" ;
}

$ljudi = novi ljudi();

echo "$people -> John je popio malo $juices [ 0 ] soka." . PHP_EOL ;
echo " $people -> john zatim pozdravio $people -> jane ." . PHP_EOL ;
echo "$people -> John "s žena je pozdravila $people -> Robert." . PHP_EOL;
echo " $people -> Robert je pozdravio dva $people -> smiths ." ; // Neće raditi
?>

Ovo ne bi trebalo da daje veliko "A": \x41

Popio je sok od jabuke. Popio je sok od narandže. Popio je ljubičasti sok. John Smith je popio sok od jabuke. John Smith je zatim pozdravio Jane Smith. Roberta Paulsena pozdravila je supruga Johna Smitha.

Za sve složenije, koristite složenu sintaksu.

Složena (kovrdžava) sintaksa

Naziva se složenim ne zato što ga je teško razumjeti, već zato što dozvoljava upotrebu složenih izraza.

Bilo koja skalarna varijabla, element niza ili svojstvo objekta mapirano u string može biti predstavljeno u nizu koristeći ovu sintaksu. { I } Samo napišite izraz na isti način na koji biste to učinili izvan reda, a zatim ga umotajte { . $ Pošto { ne može se izbjeći, ova sintaksa će biti prepoznata samo kada {\$ sledi direktno {$ . Koristi

štampati
.

Nekoliko ilustrativnih primjera:

// Prikaži sve greške
error_reporting(E_ALL);

$great = "odlično" ;
// Ne radi, izlazi: Ovo je (odlično)
echo "Ovo je ($odlično)" ;

// Radi, izlazi: Ovo je sjajno
\n echo "Ovo je ($odlično)" ; echo "Ovo je $( odlično) " ;

// Works
„Ovaj trg je širok

// Radi, izlazi: Ovo je sjajno
( $square -> width ) 00 centimetara." ;

// Radi, citirane ključne riječi rade samo sa sintaksom vitičastih zagrada
echo "Ovo radi: ( $arr [ "ključ" ]) " ;
echo "Ovo radi: ( $arr [ 4 ][ 3 ]) " ;
// Ovo je nevažeće iz istog razloga kao i $foo izvana
\n // linije. Drugim riječima, i dalje će raditi,// ali pošto PHP prvo traži konstantu foo, to će uzrokovati

// greška nivoa E_NOTICE (nedefinisana konstanta).
"Ovo je pogrešno:
( $arr [ foo ][ 3 ]) " ;

// Works. Kada se interno koriste višedimenzionalni nizovi
// linije uvijek koriste vitičaste zagrade

\n echo "Ovo radi: ( $arr [ "foo" ][ 3 ]) " ;// Works.

\n echo "Ovo radi: " . $arr [ "foo" ][ 3 ];"I ovo radi:

\n ( $obj -> vrijednosti [ 3 ]-> ime ) " ;($( getName ())) " ;

\n "Ovo je vrijednost varijable po imenu koju \$object->getName() vraća:($( $object -> getName ())) " ;

// Ne radi, izlazi: Ovo je ono što getName() vraća: (getName())
\n "Ovo je ono što getName() vraća: (getName())";
?>

Također je moguće pristupiti svojstvima objekta unutar stringova koristeći ovu sintaksu.

Primjer #1 Pogrešan primjer
var $bar = "Ja sam bar." ;
}

$this -> foo = "Foo" ;
$bar = "bar" ;
$baz = array("foo" , "bar" , "baz" , "quux");
echo " ( $foo -> $bar ) \n" ;
echo " ( $foo -> $baz [ 1 ]) \n" ;
?>

Ovo ne bi trebalo da daje veliko "A": \x41

Ja sam bar. Ja sam bar.

Moje ime je "$name". Štampam $foo->foo. Sada štampam ($foo->bar). Ovo ne bi trebalo da daje veliko "A": \x41:

Funkcije, pozivi metoda, statičke varijable klase i konstante klase rade interno {$} , počevši od PHP 5. Međutim, dostavljena vrijednost će se tretirati kao ime varijable u istom kontekstu kao i red u kojem je definirana. {} Korištenje pojedinačnih vitičastih zagrada (

štampati
.

) neće raditi za pristup vrijednostima funkcija, metoda, konstanti klase ili statičkih varijabli klase.
klasa piva (
const softdrink = "rootbeer" ;
}

public static $ale = "ipa" ;
$rootbeer = "A & W" ;

$ipa = "Alexander Keith\"s" ;
// Ovo radi, izlazi: Želio bih A & W

echo "Želim ($( pivo :: bezalkoholno piće)) \n" ;
// I ovo radi, izlazi: Volio bih Alexander Keitha
?>

echo "Želio bih ($( pivo :: $ale )) \n" ;

Pristup i promjena karaktera u nizu Znakovi u nizovima se mogu koristiti i modificirati specificiranjem njihovog pomaka od početka stringa, počevši od nule, u uglastim zagradama nakon niza, na primjer, $str. I Zamislite string za ovu svrhu kao niz znakova..

Moje ime je "$name". Štampam $foo->foo. Sada štampam ($foo->bar). Ovo ne bi trebalo da daje veliko "A": \x41: Ako trebate dobiti ili zamijeniti više od 1 znaka, možete koristiti funkcije

Pažnja

substr() substr_replace() Znaku u nizu se također može pristupiti pomoću vitičastih zagrada, na primjer $str(42) . substr_replace() Pokušaj pisanja u pomak izvan granica linije će dopuniti niz razmacima do tog pomaka. Necjelobrojni tipovi će se pretvoriti u cjelobrojne tipove.

Pažnja

Pogrešan tip pomaka će uzrokovati grešku nivoa

E_NOTICE

.
Pisanje na negativan pomak će uzrokovati grešku nivoa
, a kada se pročita vratit će prazan string.

// Dobivamo treći znak niza
$third = $str [2];

// Dobivamo posljednji znak niza
$str = "Ovo je još uvijek test." ;
$last = $str [strlen ($str) - 1];

// Promjena posljednjeg znaka reda
$str = "Pogledajte more" ;
$str [ strlen ($str )- 1 ] = "e" ;

?>

Od PHP 5.4, pomak u nizu mora biti specificiran ili kao cijeli broj ili kao niz koji sadrži cifre, inače će biti izdato upozorenje. Prethodno pomak dat nizom poput "foo", bez upozorenja je pretvoren u 0 .

Primjer #10 Razlike između PHP-a 5.3 i PHP-a 5.4

$str = "abc" ;

Var_dump($str["1"]);
var_dump (isset($str [ "1" ]));

Var_dump($str["1.0"]);
var_dump (isset($str [ "1.0" ]));

Var_dump($str["x"]);
var_dump (isset($str [ "x" ]));

Var_dump($str["1x"]);
var_dump (isset($str [ "1x" ]));
?>

Rezultat pokretanja ovog primjera u PHP 5.3:

string(1) "b" bool(true) string(1) "b" bool(true) string(1) "a" bool(true) string(1) "b" bool(true)

Rezultat pokretanja ovog primjera u PHP 5.4:

string(1) "b" bool(true) Upozorenje: Ilegalni pomak niza "1.0" u /tmp/t.php na liniji 7 string(1) "b" bool(false) Upozorenje: Ilegalni pomak niza "x" u / tmp/t.php na liniji 9 string(1) "a" bool(false) string(1) "b" bool(false)

Moje ime je "$name". Štampam $foo->foo. Sada štampam ($foo->bar). Ovo ne bi trebalo da daje veliko "A": \x41:

Pokušaj pristupa varijablama drugih tipova (isključujući nizove ili objekte koji implementiraju određena sučelja) koristeći ili {} ćutke će se vratiti NULL.

Moje ime je "$name". Štampam $foo->foo. Sada štampam ($foo->bar). Ovo ne bi trebalo da daje veliko "A": \x41:

PHP 5.5 je dodao podršku za pristup znakovima u literalima niza koristeći sintaksu Sve druge upotrebe obrnute kose crte će se tumačiti kao normalni znakovi: to znači da ako pokušate koristiti druge izlazne sekvence kao što je {} .

Postoje mnoge korisne funkcije za modificiranje nizova.

Osnovne funkcije su opisane u odjeljku o funkcijama stringova, a za napredno pretraživanje i zamjenu, regularni izraz ili funkcije regularnog izraza kompatibilne s Perl-om.

Pretvori u niz

Vrijednost se može pretvoriti u string pomoću cast (niz), ili funkcije strval(). \n ili U izrazima u kojima je potreban niz, konverzija se događa automatski. Ovo se dešava kada koristite funkcije print.

, ili kada se vrijednost varijable uporedi sa nizom. Čitanje odjeljaka Tipovi i Tipovi u priručniku učinit će sljedeće jasnije. Vidi također settype() Nizovi se uvijek pretvaraju u string Postoje dvije vrste sintakse: jednostavna i složena."niz" \n Sve druge upotrebe obrnute kose crte će se tumačiti kao normalni znakovi: to znači da ako pokušate koristiti druge izlazne sekvence kao što je U izrazima u kojima je potreban niz, konverzija se događa automatski., tako da ne možete prikazati sadržaj niza ( ), koristeći da vidite šta sadrži. Da vidite jedan element, koristite nešto poput

echo $arr["foo"] . U nastavku pogledajte savjete o tome kako prikazati/pogledati sav sadržaj.. niz Ako želite prikazati vrijednosti polja objekta ( ) za potrebe otklanjanja grešaka, čitajte dalje. Ako želite da dobijete ime klase potrebnog objekta, koristite get_class()

NULL. Od PHP 5, metoda __toString je također postala dostupna.

se uvijek pretvara u prazan string. Kao što vidite gore, direktno pretvaranje nizova, objekata ili resursa u niz ne daje nikakve korisne informacije o samim vrijednostima osim njihovih tipova. I Bolji način za izlaz vrijednosti za otklanjanje grešaka je korištenje funkcija.

print_r() var_dump() Većina vrijednosti u PHP-u može se pretvoriti u string za trajno skladištenje. Ova metoda se naziva serijalizacija i može se izvršiti pomoću funkcije

serialize()

. Dodatno, ako vaša PHP instalacija ima podršku za WDDX, serijalizacija u XML strukturu je također moguća.

Pretvaranje nizova u brojeve Ako je niz prepoznat kao numerička vrijednost, rezultirajuća vrijednost i tip se određuju na sljedeći način. Ako niz ne sadrži nijedan od znakova ".", "e" ili "E", a vrijednost broja je unutar granica cijelih brojeva (definiranih PHP_INT_MAX), niz će biti prepoznat kao cijeli broj ( float).

cijeli broj

). U svim ostalim slučajevima smatra se brojem s pomičnim zarezom (
Vrijednost je određena početkom niza. Ako linija počinje važećom numeričkom vrijednošću, ta vrijednost će se koristiti. Inače će vrijednost biti 0 (nula). Važeća numerička vrijednost je jedna ili više cifara (koje mogu sadržavati decimalni zarez), opcionalno prethodi znak, nakon čega slijedi opcijski eksponent. Eksponent je "e" ili "E" iza kojeg slijedi jedna ili više cifara. $foo = 1 + "10.5" ;
// $foo je float (11.5)
$foo = 1 + "-1.3e3" ;
// $foo je float (-1299) $foo = 1 + "bob-1.3e3" ; // $foo je cijeli broj (1)
$foo = 1 + "bob3" ; // $foo je cijeli broj (1) $foo = 1 + "10 malih svinja" ;
// $foo je cijeli broj (11)
$foo = 4 + "10.2 Mala praseta" ;
?>

// $foo je float (14.2)

$foo = "10.0 svinja " + 1 ; // $foo je float (11)

$foo = "10.0 svinja " + 1.0 ; // $foo je float (11)
Za više informacija o ovoj konverziji, pogledajte odjeljak strtod(3) u Unix dokumentaciji.
?>

Ne očekujte da ćete dobiti kod znaka pretvarajući ga u cijeli broj (kao što se radi, na primjer, u C). Za pretvaranje znakova u njihove ASCII kodove i natrag, koristite funkcije ord() I chr().

Detalji implementacije tipa niza

Vrsta niza ( string) u PHP-u je implementiran kao niz bajtova i cijeli broj koji sadrži dužinu bafera. Ne sadrži nikakve informacije o tome kako pretvoriti ove bajtove u znakove, prepuštajući ovaj zadatak programeru. Nema ograničenja za sadržaj niza, kao što je bajt sa vrijednošću 0 ("NUL" bajt) može se nalaziti bilo gdje (međutim, imajte na umu da neke funkcije, kao što je navedeno u ovom priručniku, nisu "binarno sigurne", tj. mogu proslijediti nizove bibliotekama koje zanemaruju podatke nakon NUL -bajta).

Ova priroda tipa stringa objašnjava zašto PHP nema poseban tip „bajta“ – stringovi igraju tu ulogu. Funkcije koje vraćaju netekstualne podatke—na primjer, proizvoljni tok podataka pročitan iz mrežne utičnice—i dalje vraćaju nizove.

Uzimajući u obzir činjenicu da PHP ne diktira specifično kodiranje za stringove, moglo bi se zapitati kako se literali stringova zatim kodiraju. Na primjer, linija "á" ekvivalentno "\xE1"(ISO-8859-1), "\xC3\xA1"(UTF-8, normalizacijski oblik C), "\x61\xCC\x81"(UTF-8, normalizacijski oblik D) ili neka druga moguća reprezentacija? Odgovor je da će string biti kodiran onako kako je napisan u skript datoteci. Dakle, ako je skripta napisana u ISO-8859-1 kodiranju, onda će niz biti kodiran u ISO-8859-1, itd. Međutim, ovo pravilo se ne primjenjuje kada je Zend Multibyte način omogućen: u ovom slučaju, skripta se može napisati u bilo kojem kodiranju (bilo eksplicitno specificiranom ili automatski određeno), a zatim konvertirati u određeno interno kodiranje, koje će se naknadno koristiti za string literals.

Naravno, da bi bile korisne, string funkcije moraju napraviti neke pretpostavke o kodiranju stringa. Nažalost, među PHP funkcijama postoji prilično širok izbor pristupa ovom pitanju:

  • Neke funkcije pretpostavljaju da je string kodiran u nekom jednobajtnom kodiranju, ali ne moraju tumačiti bajtove kao specifične znakove da bi ispravno radile. Znakovi u nizovima se mogu koristiti i modificirati specificiranjem njihovog pomaka od početka stringa, počevši od nule, u uglastim zagradama nakon niza, na primjer, $str., Ova kategorija uključuje npr., strpos() strlen() I strcmp()
  • . Drugi način razmišljanja o ovim funkcijama je da one rade na memorijskim baferima, tj. oni rade direktno sa bajtovima i njihovim pomacima.
  • offsets. Druge funkcije očekuju da će kodiranje biti proslijeđeno kao parametar, možda pod pretpostavkom da neko zadano kodiranje ako parametar s kodiranjem nije naveden. Ova funkcija je Konačno, postoje funkcije koje pretpostavljaju da niz koristi specifično kodiranje, obično UTF-8. Većina funkcija iz ekstenzija intl i PCRE pada ovdje (u drugom slučaju, samo kada se specificira modifikator u). Iako je to učinjeno namjerno, funkcija utf8_decode() podrazumijeva UTF-8 kodiranje, i

utf8_encode()

- ISO-8859-1.

Na kraju krajeva, pisanje ispravnih programa koji rade sa Unicode-om znači pažljivo izbjegavanje funkcija koje ne rade s Unicode-om i koje mogu oštetiti podatke, te korištenje valjanih funkcija umjesto toga, obično iz ekstenzija intl i mbstring.

Međutim, korištenje funkcija koje podržavaju Unicode je dobar početak. Bez obzira na karakteristike koje jezik pruža, neophodno je poznavati specifikaciju samog Unicode-a. Na primjer, ako program pretpostavlja da u jeziku postoje samo mala i velika slova, onda pravi veliku grešku.

Razlog je jednostavan: PHP interpreter dodatno provjerava nizove u dvostrukim navodnicima na prisustvo varijabli, a ako se pronađu, onda se umjesto imena varijable u string ubacuje njena vrijednost. Ali red zatvoren u apostrofe interpretator percipira kao običan tekst i PHP ne vrši nikakve transformacije u ovim redovima. Mislim da je jasno da će obrada stringova u pojedinačnim navodnicima u svakom slučaju biti brža.

Prvo, hajde da opišemo kako da definišemo string, a zatim proverimo koliko će brže biti obrada nizova u pojedinačnim navodnicima.

Najjednostavniji način za definiranje niza je da ga stavite u jednostruke navodnike ("). Da biste koristili jednostruke navodnike unutar niza s jednim navodnicima, mora im prethoditi obrnuta kosa crta (\), odnosno pobjeći. Ako obrnuta kosa crta mora doći prije jednog navodnika ili na kraju reda, morate ga duplicirati.

Evo primjera korištenja jednostrukih navodnika:
// Izlaz: Jednostavan niz
echo "Jednostavan niz";
// Štampa: Ovdje sam
echo "Ja sam ovdje";
// Izlaz: Ovo neće umetnuti: \n novi red
echo "Ovo neće umetnuti:\nnovi red";
// Izlazi: Varijabla $example također neće biti zamijenjena
echo "Ni varijabla $example neće biti zamijenjena";

Ako je string stavljen u dvostruke navodnike ("), PHP prepoznaje više izlaznih sekvenci za specijalne znakove i također zamjenjuje ime varijable u string za njegovu vrijednost. Baš kao i kod jednostrukih navodnika, da bi koristio dvostruke navodnike unutar niza zatvorenog u dvostrukim navodnicima, njima mora prethoditi obrnuta kosa crta (\).
// Izlaz: Jednostavan niz
echo "Jednostavan niz";
Evo primjera korištenja dvostrukih navodnika:
// Izlazi: Kompanija "Snowdrop"
echo "Kompanija \"Snowdrop\"";
// Izlaz: Ovo će dovesti do nove linije
echo "Ovo će preći na novi red \n";
// Izlaz: Varijabla će biti zamijenjena
$example = "biće zamijenjen";

Hajde da saznamo koliko su jednostruki navodniki brži od dvostrukih. Za merenja ćemo napisati kratku testnu skriptu, a odmah ćemo primetiti da će rezultati, koji zavise od hardvera vašeg računara ili servera, biti drugačiji ako ga sami testirate.
// Vraća vremensku oznaku na početku petlje
$start = mikrovrijeme(true);
// Kreirajte petlju za 1 milion iteracija
za ($i = 0; $i< 1000000; $i++) {
$text = "Ovo je niz znakova";
}
// Izračunaj utrošeno vrijeme
$vrijeme = (mikrovrijeme(true) - $start);

Rezultat: 0,09 sekundi.
Ako jednostruke navodnike zamijenimo dvostrukim navodnicima:

$text = "Ovo je niz znakova";
Rezultat će biti 0,10 sekundi.
Kao što vidite, kada koristite tekstualne stringove, razlika u vremenu izvršenja je vrlo mala, moglo bi se reći da uopće ne postoji. Zabava počinje kada pokušamo spojiti niz i varijablu.

$text = "Ovo je niz znakova $i";

ili

$text = $i."Ovo je niz znakova";

Rezultat otprilike: 0,27 sekundi.

Razlika je prilično uočljiva. Konkatenacija i dvostruki navodniki jasno utiču na performanse kada se varijable dodaju u niz.

Stoga, ako trebamo prikazati tekst „kako jest“, koristimo jednostruke navodnike. Ako trebate zamijeniti njegovu vrijednost umjesto varijable, koristite dvostruke (ako postoji samo jedna varijabla, onda možete potpuno izostaviti navodnike). Često možete vidjeti ovakav kod:

Prikazuje se samo tekst. Ali u kodu je, iz nekog nepoznatog razloga, stavljen u dvostruke navodnike, što primorava tumača da ga raščlani radi prisutnosti varijabli. Ispravno je staviti tekst u jednostruke navodnike.

Razmotrimo trivijalni zadatak prikazivanja varijable kao dijela teksta, uključujući korištenje html koda.

$date"; ?>

Sve je dobro prikazano, tekst i datum su podebljani, što se zamjenjuje umjesto varijable. Ali morate zapamtiti dvije stvari. Prvo, ovo je karakteristika interpretatora: konkatenacija nizova je mnogo brža i zahtijeva manje resursa nego raščlanjivanje stringova. I drugo, ne zaboravite na paradigmu programiranja „zavadi pa vladaj“. Nema potrebe mešati sve u jedno, bilo bi mnogo ispravnije da se tekst podeli na dva dela - one koji zahtevaju i one koji ne zahtevaju raščlanjivanje od strane tumača. Dakle, gornji primjer bi trebao biti napisan ovako:

".$date.""; ?>

Naravno, morate slijediti ovo pravilo (sve što ne zahtijeva raščlanjivanje staviti u jednostruke navodnike) ne samo kada prikazujete tekst, već i kada dodjeljujete vrijednosti varijablama niza:

Ili, na primjer, kada koristite stringove prilikom prosljeđivanja argumenata funkcije:

I iako će na modernim računarima dobit u vremenu za tumačenje koda u zavisnosti od upotrebe jednostrukih ili dvostrukih navodnika biti gotovo neprimjetna, posebno u malim skriptama, ipak se vrijedi naviknuti da pišete kompetentan kod od početka, mnogo je lakše nego kasnije ga ponovo naučiti.