Kakšna je razlika med enojnimi in dvojnimi narekovaji v php. Kakšna je razlika med enojnimi in dvojnimi narekovaji v PHP? Podrobnosti implementacije tipa niza

Ni skrivnost, da so narekovaji v PHP lahko enojni ali dvojni. Ugotovimo, kdaj je določena uporaba narekovajev primernejša.

Enojni narekovaji

Najenostavnejši način za definiranje niza je, da besedilo stavite v enojne narekovaje.

Če moramo v besedilu uporabiti en sam narekovaj, ga moramo ubežati s poševnico (\).

Ubežna zaporedja znotraj enojnih narekovajev ne delujejo.

Primeri uporabe enojnih narekovajev:

Dvojni narekovaji

Če označite besedilo z dvojnimi narekovaji, bo niz definiran na enak način kot z enojnimi narekovaji. So pa seveda razlike med citati.

Situacija z ubežnimi narekovaji je enaka kot z enojnimi narekovaji.

Niz, ki je v dvojnih narekovajih, prepozna večino ubežnih zaporedij za posebne znake.

Najpomembnejša razlika je dejstvo, da dvojni narekovaji obravnavajo spremenljivke.

Primeri uporabe dvojnih narekovajev:

Osredotočimo se na dejstvo, da nizi z dvojnimi narekovaji obravnavajo spremenljivke.

Kaj se zgodi, ko je niz obdelan? Tolmač preverite vsak niz z dvojnimi narekovaji za spremenljivke, tj. pride do prisilnega razčlenjevanja, kar zahteva dodaten čas. Da, pogosto je to delček sekunde, vendar je treba razumeti samo dejstvo. Se pravi, če primerjate obdelavo enega niza z različnimi narekovaji (seveda brez spremenljivk), potem bo niz z enojnimi narekovaji zagotovo obdelan hitreje.

Izračuni

Na spletni strani ProfiPHP sem našel zanimive izračune za Ta naslov. Avtor je napisal preprosto skripto, s katero je izračunal čas obdelave nizov.

Ta kratek članek prikazuje, kako in kje uporabiti citati v PHP.

Enojni narekovaji (apostrofi) v PHP

PHP na noben način ne obdeluje nizov v enojnih narekovajih. To pomeni, da enojni narekovaji predstavljajo besedilo med njimi, kakršno je.

// Pravilen odmev "Kako je življenje?"; echo "Kako je življenje? $name"; echo "Kako je življenje?".$name; // Nepravilen odmev "Kako si? $name";

Posebni znaki v enojnih in dvojnih narekovajih

Da bi zagotovili, da se na primer tabulator (\t) razlaga kot tabulator in ne kot poševnica in črka t, morate vrstico besedila, ki vsebuje tabulator, dati v dvojne narekovaje. \' in \\ lahko uporabite samo v enojnih narekovajih. Vsa druga ubežna zaporedja (\n, \r, \$ itd.) niso dovoljena v enojnih narekovajih.

// Nepravilen odmev "Kako si?\n"; // Popravi odmev "Kako si?\n";

Če se želite izogniti dvojnim narekovajem v nizu, postavite narekovaje pred poševnico nazaj \" .

// Napačen odmev "

Kaj se dogaja?

"; // Popravi odmev "

Kaj se dogaja?

"; odmev "

Kaj se dogaja?

";

Dvojni narekovaji v PHP

Besedilo v dvojnih narekovajih se obravnava zelo različno. Na primer, spremenljivke v dvojnih narekovajih se nadomestijo z njihovimi vrednostmi. To omogoča priročno prevajanje SQL poizvedbe z uporabo dvojnih narekovajev.

$query = "VSTANI V tabelo (objava, avtor, besedilo, datum) VREDNOSTI ("$id","$author","$text","$date"");

Nisem strokovnjak za programiranje PHP, vendar sem nekoliko zmeden, zakaj vidim kodo v PHP z nizom v enojnih in včasih dvojnih narekovajih.

Vem le, da v jeziku .NET ali C, če je v enojnih narekovajih, to pomeni, da je znak in ne niz.

rešitev

Kaj morate vedeti

$a = "ime"; $b = "moj $a"; == "moje ime" $c = "moj $a"; != "moje ime"

V PHP ljudje uporabljajo enojne narekovaje za definiranje konstantnega niza, kot je "a", "moje ime", "abc xyz", medtem ko uporabljajo dvojne narekovaje za definiranje niza, ki vsebuje identifikator, kot je "a $b $c $d".

In še ena stvar je

Echo "moje ime";

hitrejši kot

Echo "moje ime";

Odmev "moj" . $a;

počasneje kot

Echo "my $a";

To velja za druge uporabljene nize.

V PHP se besedilo v enojnih narekovajih obravnava kot vrednost niza, medtem ko bo besedilo v dvojnih narekovajih razčlenilo spremenljivke z zamenjavo in obdelavo njihove vrednosti.

$test = "spremenljivka"; echo "Pozdravljeni gospod $test"; // rezultat bi bil: Pozdravljeni gospod spremenljivka echo "Pozdravljeni gospod $test"; // rezultat bi bil: Pozdravljeni, gospod $test

Tu dvojni narekovaj razčleni vrednost, enojni narekovaj pa se obravnava kot vrednost niza (brez razčlenjevanja spremenljivke $test.)

Obe vrsti ugnezdenih znakov sta niza. Primerno je uporabiti eno vrsto ponudbe za zaključek druge vrste ponudbe. """ in """. Največja razlika med vrstami narekovajev je, da se sklice na ugnezdene identifikatorje zamenjajo znotraj dvojnih narekovajev namesto znotraj enojnih.

Najenostavnejši način za definiranje niza je, da ga stavite v enojne narekovaje (znak " ).

Če želite znotraj niza uporabiti en narekovaj, ga umaknite s poševnico nazaj ( \ ). Če morate napisati samo poševnico nazaj, jo podvojite ( \\ ). Vse druge uporabe poševnic nazaj bodo interpretirane kot običajni znaki: to pomeni, da če poskusite uporabiti druga ubežna zaporedja, kot je \r oz \n, bodo namesto kakršnega koli posebnega vedenja izpisani takšni, kot so.

odmev "to je preprost niz";

odmev "Lahko tudi vstavite v vrstice
znak nove vrstice, kot je ta,
To je v redu"
;

// Rezultati: Arnold je nekoč rekel: "Vrnil se bom"
odmev "Nekega dne je Arnold rekel:" Vrnil se bom.;

Echo "Ste izbrisali C:\\*.*?";

// Izhodi: Ali ste izbrisali C:\*.*?
echo "Ali ste izbrisali C:\*.*?" ;

// Izhodi: To ne bo razširjeno: \n nova vrstica
odmev "To ne bo razširjeno: \n nova vrstica";

// Izhodi: spremenljivki $expand in $either nista razširjeni
odmev "Spremenljivki $expand in $either nista razširjeni";
?>

Dvojni narekovaji

Če je niz v dvojnih narekovajih ("), PHP prepozna več ubežnih zaporedij za posebne znake:

Ubežna zaporedja
Naknadno zaporedje Pomen
\n nova vrstica (LF ali 0x0A (10) v ASCII)
\r vrnitev v začetek (CR ali 0x0D (13) v ASCII)
\t vodoravni zavihek (HT ali 0x09 (9) v ASCII)
\v navpični zavihek (VT ali 0x0B (11) v ASCII) (od PHP 5.2.5)
\e ubežni znak (ESC ali 0x1B (27) v ASCII) (od PHP 5.4.4)
\f vir strani (FF ali 0x0C (12) v ASCII) (od PHP 5.2.5)
\\ poševnica nazaj
\$ znak za dolar
\" dvojni narekovaj
\{1,3} zaporedje znakov, ki ustreza regularnemu izrazu znaka v osmiškem številskem sistemu
\x(1,2) zaporedje znakov, ki ustreza regularnemu izrazu znaka v šestnajstiškem zapisu

Tako kot pri nizu v enojnih narekovajih bo tudi ubežanje katerega koli znaka izpisalo samo poševnico nazaj. Pred PHP 5.1.1, poševnica nazaj \($var) ni bil objavljen.

Heredoc

Tretji način za definiranje nizov je uporaba sintakse heredoc: <<< . Za tem operatorjem morate podati identifikator in nato podajanje vrstice. Za tem pride sama vrstica in nato isti identifikator, ki zapre vstavljanje.

Linija mora začnite z zaključnim identifikatorjem, tj. pojaviti se mora v prvem stolpcu vrstice. Poleg tega mora identifikator upoštevati enaka pravila poimenovanja kot vse druge oznake v PHP: vsebovati samo alfanumerične znake in podčrtaj ter se ne sme začeti s številko (podčrtaji so dovoljeni).

Pozor

Zelo pomembno je upoštevati, da zaključna identifikacijska vrstica ne sme vsebovati nobenih drugih znakov razen podpičja ( ; ). To pomeni, da id ne sme biti zamaknjen in da pred ali za podpičjem ne sme biti presledkov ali zavihkov. Pomembno je tudi razumeti, da mora biti prvi znak pred končnim identifikatorjem znak za novo vrstico, kot ga določa vaš operacijski sistem. Na primer, v sistemih UNIX, vključno z Mac OS X, to \n. Nova vrstica se mora prav tako začeti takoj za končnim identifikatorjem.

Če je to pravilo kršeno in zaključni identifikator ni "čist", se šteje, da zaključni identifikator manjka in PHP ga bo še naprej iskal. Če v tem primeru pravilnega zaključnega identifikatorja nikoli ne najdemo, bo to povzročilo napako pri razčlenjevanju s številko vrstice na koncu skripta.

Heredoc ni mogoče uporabiti za inicializacijo polj razreda. Od PHP 5.3 naprej ta omejitev velja samo za tukajdokumente, ki vsebujejo spremenljivke.

Primer #1 Napačen primer

razred foo(
javna $bar =<<bar
EOT;
}
?>

Heredoc besedilo se obnaša enako kot niz v dvojnih narekovajih, ne da bi jih bilo. To pomeni, da vam v heredoc ni treba ubežati narekovajem, vendar lahko še vedno uporabite zgornja ubežna zaporedja. Spremenljivke se obdelujejo, vendar morate biti tako previdni pri uporabi kompleksnih spremenljivk znotraj heredoc kot pri delu z nizi.

Primer #2 Primer definiranja niza heredoc

$str =<<Primer vrstice,
pokriva več vrstic,
z uporabo sintakse heredoc.
EOD;

Razred foo
{
var $foo ;
var $bar ;

Funkcija foo()
{
$this -> foo = "Foo" ;
$to ->
}
}

$foo = novo foo();
$name = "MojeIme" ;

odmev<<Moje ime je "$name". Vtipkam $foo -> foo .
Zdaj pa sklepam
( $foo -> bar [ 1 ]) .
To bi moralo izpisati veliko črko "A": \x41
EOT;
?>

Moje ime je "MyName". Vtipkam Foo. Zdaj izpišem Bar2. To bi moralo izpisati veliko črko "A": A

Za posredovanje podatkov skozi argumente funkcije je mogoče uporabiti tudi sintakso heredoc:

Od različice 5.3.0 je postalo mogoče inicializirati statične spremenljivke in lastnosti/konstante razredov s sintakso heredoc:

Primer #4 Uporaba heredoc za inicializacijo statičnih spremenljivk

// Statične spremenljivke
funkcija foo()
{
statični $bar =<<Tukaj ni ničesar ...
ETIKETA;
}

// Lastnosti/konstante razreda
razred foo
{
const BAR =<<Primer uporabe konstante
FOOBAR;

Javni $baz =<<Primer uporabe polja
FOOBAR;
}
?>

Od PHP 5.3.0 naprej lahko identifikator Heredoc stavite tudi v dvojne narekovaje:

Nowdoc

Nowdoc je enak za nize z enojnimi narekovaji kot heredoc za nize z dvojnimi narekovaji. Nowdoc je podoben heredocu, vendar znotraj njega zamenjave niso opravljene. Ta zasnova je idealna za vdelavo kode PHP ali drugih velikih blokov besedila, ne da bi ga morali ubežati. V tem je nekoliko podoben konstrukciji SGML z razglasitvijo bloka besedila, ki ni namenjen obdelavi.

Nowdoc je označen z istim zaporedjem <<< , ki se uporablja v heredoc, vendar je naslednji identifikator v enojnih narekovajih, na primer, <<<"EOT" . Vsi pogoji, ki veljajo za identifikatorje heredoc, veljajo tudi za nowdoc, zlasti tisti, ki veljajo za zaključni identifikator.

Primer #6 Primer Nowdoc

$str =<<<"EOD"
Primer besedila,
obsega več vrstic
z uporabo sintakse nowdoc.
EOD;

/* Bolj zapleten primer s spremenljivkami. */
razred foo
{
javni $foo ;
javni $bar ;

Funkcija foo()
{
$this -> foo = "Foo" ;
$this -> bar = array("Bar1" , "Bar2" , "Bar3" );
}
}

$foo = novo foo();
$name = "MojeIme" ;

odmev<<<"EOT"
Moje ime je "$name". Natisnem $foo->foo.
Zdaj tiskam ($foo->bar).
To ne bi smelo izpisati velike črke "A": \x41
EOT;
?>

Rezultat izvajanja tega primera:

Moje ime je "$name". Natisnem $foo->foo. Zdaj tiskam ($foo->bar). To ne bi smelo izpisati velike črke "A": \x41

Komentiraj:

Za razliko od heredoc lahko Nowdoc uporabljate v katerem koli kontekstu s statičnimi podatki. Tipičen primer inicializacije polj razreda ali konstant:

Primer #7 Primer uporabe statičnih podatkov

razred foo(
javna $bar =<<<"EOT"
bar
EOT;
}
?>

Komentiraj:

podpora za nowdoc je bila dodana v PHP 5.3.0.

Ravnanje s spremenljivkami

Če je niz podan v dvojnih narekovajih ali z uporabo heredoc, se spremenljivke v njem obdelajo.

Obstajata dve vrsti sintakse: preprosta in zapletena. Preprosta sintaksa je lažja in priročnejša. Omogoča obdelavo spremenljivke, vrednosti polja ( niz) ali lastnosti predmeta ( predmet) z najmanj truda.

Kompleksno sintakso je mogoče prepoznati po zavitih oklepajih, ki obkrožajo izraz.

Preprosta sintaksa

Če tolmač naleti na znak za dolar ( $ ), zajame čim več znakov, da tvori veljavno ime spremenljivke. Če želite podati konec imena, ime spremenljivke zapičite v zavite oklepaje.

$sok = "jabolko";

echo "Popil je nekaj $juice soka." . PHP_EOL ;
// ne deluje, "s" je veljaven znak za ime spremenljivke,
// vendar se naša spremenljivka imenuje $juice.
echo "Spil je sok iz $sokov." ;
?>

Rezultat izvajanja tega primera:

Popil je nekaj jabolčnega soka. Popil je sok iz.

Element polja ( niz) ali lastnost predmeta ( predmet). V matričnih indeksih je oglati oklepaj ( ] ) označuje konec definicije indeksa. Za lastnosti predmetov veljajo ista pravila kot za preproste spremenljivke.

Primer št. 8 Primer preproste sintakse

$juices = array("apple" , "orange" , "koolaid1" => "purple" );

echo "Popil je nekaj $juices [ 0 ] soka." . PHP_EOL ;
echo "Popil je nekaj $juices [ 1 ] soka." . PHP_EOL ;
echo "Popil je nekaj $juices [ koolaid1 ] soka." . PHP_EOL ;

razredni ljudje (
public $john = "John Smith" ;
public $jane = "Jane Smith" ;
public $robert = "Robert Paulsen" ;

Javni $smith = "Smith" ;
}

$ljudje = novi ljudje();

echo "$ljudje -> john je spil nekaj $juices [ 0 ] soka." . PHP_EOL ;
echo " $people -> john je nato pozdravil $people -> jane." . PHP_EOL ;
echo "$people -> Johnova žena je pozdravila $people -> robert." . PHP_EOL;
echo " $people -> robert je pozdravil dva $people -> smiths." ; // Ne bo delovalo
?>

Rezultat izvajanja tega primera:

Popil je nekaj jabolčnega soka. Popil je pomarančni sok. Spil je nekaj vijoličnega soka. John Smith je spil nekaj jabolčnega soka. John Smith je nato pozdravil Jane Smith. Žena Johna Smitha je pozdravila Roberta Paulsena Robert Paulsen je pozdravil oba.

Za vse, kar je bolj zapleteno, uporabite zapleteno sintakso.

Kompleksna (kodrasta) sintaksa

Zapleteno se imenuje ne zato, ker je težko razumljivo, ampak zato, ker omogoča uporabo zapletenih izrazov.

Vsako skalarno spremenljivko, element polja ali lastnost objekta, preslikano v niz, je mogoče predstaviti v nizu s to sintakso. Samo napišite izraz na enak način, kot bi ga izven črte, in ga nato zavijte { in } . Zaradi { ni mogoče ubežati, bo ta sintaksa prepoznana le, ko $ sledi neposredno { . Uporaba {\$ natisniti {$ . Nekaj ​​ilustrativnih primerov:

// Pokaži vse napake
javljanje_napake(E_VSE);

$great = "super" ;

// Ne deluje, izhodi: To je (super)
echo "To je ($super)" ;

// Deluje, rezultati: To je super
echo "To je ($super)" ;
echo "To je $(super)" ;

// Deluje
odmev "Ta kvadrat je širok($kvadrat -> širina) 00 centimetrov." ;

// Deluje, navedene ključne besede delujejo samo s sintakso zavitih oklepajev
echo "To deluje: ( $arr [ "ključ" ]) " ;

// Deluje
echo "To deluje: ( $arr [ 4 ][ 3 ]) " ;

// To je neveljavno iz istega razloga kot $foo zunaj
// vrstice. Z drugimi besedami, še vedno bo delovalo,
// ker pa PHP najprej išče konstanto foo, bo to povzročilo
// napaka ravni E_NOTICE (nedefinirana konstanta).
odmev "Ni prav:( $arr [ foo ][ 3 ]) " ;

// Deluje. Pri interni uporabi večdimenzionalnih nizov
// vrstice vedno uporabljajo zavite oklepaje
echo "To deluje: ( $arr [ "foo" ][ 3 ]) " ;

// Deluje.
echo "To deluje: ". $arr [ "foo" ][ 3 ];

odmev "Tudi to deluje:( $obj -> values ​​​​[ 3 ]-> name ) " ;

odmev "To je vrednost imenovane spremenljivke$name : ($( $name )) " ;

odmev "To je vrednost spremenljivke, imenovane, kot jo vrne funkcija getName():($( getName ())) " ;

odmev "To je vrednost spremenljivke po imenu, ki jo vrne \$object->getName():($( $object -> getName ())) " ;

// Ne deluje, rezultati: To je tisto, kar getName() vrne: (getName())
odmev "To je tisto, kar getName() vrne: (getName())";
?>

Z uporabo te sintakse je mogoče tudi dostopati do lastnosti objekta znotraj nizov.

razred foo(
var $bar = "Jaz sem bar." ;
}

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

Rezultat izvajanja tega primera:

Jaz sem bar. Jaz sem bar.

Komentiraj:

Funkcije, klici metod, statične spremenljivke razreda in konstante razreda delujejo interno {$} , začenši s PHP 5. Vendar pa bo podana vrednost obravnavana kot ime spremenljivke v istem kontekstu kot vrstica, v kateri je definirana. Uporaba enojnih zavitih oklepajev ( {} ) ne bo deloval za dostop do vrednosti funkcij, metod, konstant razreda ali statičnih spremenljivk razreda.

// Pokaži vse napake
javljanje_napake(E_VSE);

razred piva (
const softdrink = "rootbeer" ;
public static $ale = "ipa" ;
}

$rootbeer = "A & W" ;
$ipa = "Alexander Keith" ;

// To deluje, rezultati: Rad bi A & W
echo "Rad bi ($( beers :: softdrink )) \n" ;

// Tudi to deluje, rezultati: Rad bi Alexander Keith's
echo "Rad bi ($( beers :: $ale )) \n" ;
?>

Dostopanje in spreminjanje znaka v nizu

Znake v nizih lahko uporabite in spremenite tako, da določite njihov odmik od začetka niza, začenši z ničlo, v oglatih oklepajih za nizom, na primer $str. Za ta namen si zamislite niz kot niz znakov. Če morate dobiti ali zamenjati več kot 1 znak, lahko uporabite funkcije substr() in substr_replace().

Komentiraj: Do znaka v nizu lahko dostopate tudi z uporabo zavitih oklepajev, na primer $str(42) .

Pozor

Poskus pisanja na odmik zunaj meja vrstice bo niz obpolnil s presledki do tega odmika. Neceloštevilski tipi bodo pretvorjeni v celoštevilske tipe. Napačna vrsta odmika bo povzročila napako ravni E_OBVESTILO. Zapisovanje z negativnim odmikom bo povzročilo napako ravni E_OBVESTILO, pri branju pa vrne prazen niz. Uporabljen je samo prvi znak dodeljenega niza. Če dodelite prazen niz, se dodeli ničelni bajt (NULL).

Pozor

Nizi v PHP so notranji nizi bajtov. Posledica tega je, da dostop ali spreminjanje niza pri odmiku ni varno za večbajtno kodiranje in bi se smelo izvajati samo z nizi v enobajtnih kodiranjih, kot je ISO-8859-1.

Primer #9 Nekaj ​​primerov nizov

// Pridobi prvi znak niza
$str = "To je test." ;
$first = $str [0];

// Pridobi tretji znak niza
$tretji = $str [ 2 ];

// Pridobi zadnji znak niza
$str = "To je še test." ;
$last = $str [strlen ($str) - 1];

// Spremeni zadnji znak vrstice
$str = "Poglej morje" ;
$str [strlen ($str)- 1] = "e";

?>

Od PHP 5.4 mora biti odmik v nizu določen kot celo število ali niz, ki vsebuje števke, sicer bo izdano opozorilo. Prejšnji odmik, podan z nizom, kot je "foo", se je brez opozorila spremenila v 0 .

Primer #10 Razlike med PHP 5.3 in PHP 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 izvajanja tega primera v PHP 5.3:

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

Rezultat izvajanja tega primera v PHP 5.4:

string(1) "b" bool(true) Opozorilo: Nedovoljen odmik niza "1.0" v /tmp/t.php v vrstici 7 string(1) "b" bool(false) Opozorilo: Nedovoljen odmik niza "x" v / tmp/t.php v vrstici 9 string(1) "a" bool(false) string(1) "b" bool(false)

Komentiraj:

Poskus dostopa do spremenljivk drugih vrst (razen nizov ali objektov, ki izvajajo določene vmesnike) z uporabo oz {} se bo tiho vrnil NIČ.

Komentiraj:

PHP 5.5 je dodal podporo za dostop do znakov v nizovnih literalih s sintakso oz {} .

Obstaja veliko uporabnih funkcij za spreminjanje nizov.

Osnovne funkcije so opisane v razdelku o funkcijah nizov, za napredno iskanje in zamenjavo pa regularni izraz ali funkcije regularnega izraza, združljive s Perlom.

Pretvori v niz

Vrednost je mogoče pretvoriti v niz z uporabo pretvorbe (vrvica), ali funkcije strval(). V izrazih, kjer je zahtevan niz, se pretvorba izvede samodejno. To se zgodi, ko uporabljate funkcije odmev oz tiskanje, ali ko se vrednost spremenljivke primerja z nizom. Če v priročniku preberete razdelke Vrste in Manipulacije s tipi, bo naslednje jasnejše. Poglej tudi settype().

Nizi se vedno pretvorijo v niz "niz", zato ne morete prikazati vsebine polja ( niz), z uporabo odmev oz tiskanje da vidim, kaj vsebuje. Za ogled posameznega elementa uporabite nekaj takega echo $arr["foo"]. Spodaj si oglejte nasvete za prikaz/ogled celotne vsebine.

Objekti v PHP 4 so bili vedno pretvorjeni v niz "predmet". Če želite prikazati vrednosti polj predmeta ( predmet) za namene odpravljanja napak, berite naprej. Če želite pridobiti ime razreda zahtevanega predmeta, uporabite get_class(). Od PHP 5 je na voljo tudi metoda __toString.

NIČ se vedno pretvori v prazen niz.

Kot lahko vidite zgoraj, neposredna pretvorba nizov, predmetov ali virov v niz ne zagotavlja nobenih uporabnih informacij o samih vrednostih, razen njihovih vrst. Boljši način za izpis vrednosti za odpravljanje napak je uporaba funkcij print_r() in var_dump().

Večino vrednosti v PHP je mogoče pretvoriti v niz za trajno shranjevanje. Ta metoda se imenuje serializacija in jo je mogoče izvesti s funkcijo serialize(). Če ima vaša namestitev PHP podporo za WDDX, je možna tudi serializacija v strukturo XML.

Pretvarjanje nizov v številke

Če je niz prepoznan kot številska vrednost, se dobljena vrednost in vrsta določita na naslednji način.

Če niz ne vsebuje nobenega od znakov ".", "e" ali "E" in je vrednost števila v območju celih števil (definirano PHP_INT_MAX), bo niz prepoznan kot celo število ( celo število). V vseh drugih primerih se šteje za število s plavajočo vejico ( lebdi).

Vrednost je določena z začetkom niza. Če se vrstica začne z veljavno številsko vrednostjo, bo ta vrednost uporabljena. V nasprotnem primeru bo vrednost 0 (nič). Veljavna številska vrednost je ena ali več števk (ki lahko vsebujejo decimalno vejico), pred katerimi je neobvezno znak, ki mu sledi neobvezen eksponent. Eksponent je "e" ali "E", ki mu sledi ena ali več števk.

$foo = 1 + "10,5" ; // $foo je float (11.5)
$foo = 1 + "-1.3e3" ; // $foo je float (-1299)
$foo = 1 + "bob-1.3e3" ; // $foo je celo število (1)
$foo = 1 + "bob3" ; // $foo je celo število (1)
$foo = 1 + "10 majhnih prašičev"; // $foo je celo število (11)
$foo = 4 + "10.2 prašički" ; // $foo je float (14.2)
$foo = "10,0 prašičev" + 1; // $foo je float (11)
$foo = "10,0 prašičev" + 1,0; // $foo je float (11)
?>

več podrobne informacije Za informacije o tej pretvorbi glejte razdelek o strtod(3) v dokumentaciji za Unix.

Če želite preizkusiti katerega od primerov v tem razdelku, ga kopirajte in prilepite ter naslednjo vrstico, da vidite, kaj se zgodi:

echo "\$foo== $foo ; tip: " . gettype ($foo). "
\n" ;
?>

Ne pričakujte, da boste dobili kodo znaka tako, da jo pretvorite v celo število (kot se na primer naredi v C). Za pretvorbo znakov v njihove kode ASCII in nazaj uporabite funkcije ord() in chr().

Podrobnosti implementacije tipa niza

Vrsta niza ( vrvica) v PHP je implementiran kot niz bajtov in celo število, ki vsebuje dolžino medpomnilnika. Ne vsebuje nobenih informacij o tem, kako te bajte pretvoriti v znake, to nalogo pa prepušča programerju. Za vsebino niza ni nobenih omejitev, kot je bajt z vrednostjo 0 ("NUL" bajt) se lahko nahaja kjer koli (vendar se zavedajte, da nekatere funkcije, kot je navedeno v tem priročniku, niso "binarno varne", tj. lahko posredujejo nize knjižnicam, ki prezrejo podatke po NUL -bajtu).

Ta narava vrste nizov pojasnjuje, zakaj PHP nima ločene vrste »bajt« – nizi igrajo to vlogo. Funkcije, ki vrnejo nebesedilne podatke – na primer poljuben podatkovni tok, prebran iz omrežne vtičnice – še vedno vrnejo nize.

Glede na dejstvo, da PHP ne narekuje posebnega kodiranja za nize, bi se lahko vprašali, kako se potem kodirajo nizovni literali. Na primer črta "á" enakovreden "\xE1"(ISO-8859-1), "\xC3\xA1"(UTF-8, normalizacijski obrazec C), "\x61\xCC\x81"(UTF-8, normalizacijski obrazec D) ali kakšna druga možna predstavitev? Odgovor je, da bo niz kodiran tako, kot je zapisan v skriptni datoteki. Torej, če je skript napisan v kodiranju ISO-8859-1, bo niz kodiran v ISO-8859-1 itd. Vendar to pravilo ne velja, ko je omogočen način Zend Multibyte: v tem primeru je skript mogoče napisati v poljubnem kodiranju (bodisi eksplicitno določenem ali samodejno določenem) in nato pretvoriti v specifično interno kodiranje, ki bo pozneje uporabljeno za nizovni literali. Upoštevajte, da ima kodiranje skripta (ali notranje kodiranje, če je omogočen Zend Multibyte) nekaj omejitev: kodiranje mora biti skoraj vedno nadnabor ASCII, kot je UTF-8 ali ISO-8859-1. Upoštevajte tudi, da lahko kodiranja, ki so odvisna od stanja, kjer se lahko uporabijo iste vrednosti bajtov v začetnem in nezačetnem stanju premika, povzročijo težave.

Da bi bile uporabne, morajo funkcije nizov seveda narediti nekaj predpostavk o kodiranju niza. Na žalost je med funkcijami PHP precej različnih pristopov k temu vprašanju:

  • Nekatere funkcije predvidevajo, da je niz kodiran v nekem enobajtnem kodiranju, vendar jim za pravilno delovanje ni treba interpretirati bajtov kot posebnih znakov. Ta kategorija vključuje npr. substr(), strpos(), strlen() in strcmp(). Drug način razmišljanja o teh funkcijah je, da delujejo na pomnilniških medpomnilnikih, tj. delajo neposredno z bajti in njihovimi odmiki. poboti.
  • Druge funkcije pričakujejo, da bo kodiranje posredovano kot parameter, morda ob predpostavki nekega privzetega kodiranja, če parameter kodiranja ni bil podan. Ta funkcija je
  • Končno obstajajo funkcije, ki predpostavljajo, da niz uporablja specifično kodiranje, običajno UTF-8. Sem sodi večina funkcij iz razširitev intl in PCRE (v slednjem primeru samo pri podajanju modifikatorja u). Čeprav je to storjeno namerno, funkcija utf8_decode() implicira kodiranje UTF-8 in utf8_encode()- ISO-8859-1.

Navsezadnje pisanje pravilnih programov, ki delujejo z Unicode, pomeni skrbno izogibanje funkcijam, ki ne delujejo z Unicode in bi lahko poškodovale podatke, in namesto tega uporabiti veljavne funkcije, običajno iz razširitev intl in mbstring. Vendar je uporaba funkcij, ki podpirajo Unicode, dober začetek. Ne glede na funkcije, ki jih ponuja jezik, je treba poznati samo specifikacijo Unicode. Na primer, če program predpostavlja, da v jeziku obstajajo samo male in velike črke, dela veliko napako.

Kakšno vrsto narekovajev naj uporabim za oblikovanje nizov – apostrofe ali klasične dvojne narekovaje?

Oglejmo si razliko med dvojnimi in enojnimi narekovaji v PHP in uporabimo primere, da ugotovimo, kdaj uporabiti katere.

Spremenljivke in ubežna zaporedja za posebne znake, najdene v nizih v enojnih narekovajih, niso obdelane. Nize, obdane z apostrofi, tolmač PHP obdela veliko hitreje kot podobne nize, obdane z dvojnimi narekovaji.

Razlog je preprost: tolmač PHP dodatno preveri nize v dvojnih narekovajih za prisotnost spremenljivk, in če jih najde, se namesto imena spremenljivke v niz vstavi njena vrednost. Toda vrstico, obdano z apostrofi, tolmač zazna kot običajno besedilo in PHP v teh vrsticah ne izvaja nobenih transformacij. Mislim, da je jasno, da bo obdelava nizov v enojnih narekovajih v vsakem primeru hitrejša.

Najprej opišemo, kako definiramo niz, nato pa preverimo, koliko hitrejša bo obdelava nizov v enojnih narekovajih.

Najenostavnejši način za definiranje niza je, da ga zadate v enojne narekovaje ("). Če želite uporabiti enojne narekovaje v nizu z enojnimi narekovaji, mora biti pred njimi poševnica nazaj (\), kar pomeni, da mora biti poševnica nazaj. Če mora biti poševnica nazaj pred enim narekovajem ali na koncu vrstice, ga morate podvojiti. Če poskusite ubežati kateremu koli drugemu znaku, bo natisnjena tudi poševnica nazaj.

Tukaj je primer uporabe enojnih narekovajev:
// Izhod: preprost niz
echo "Preprost niz";
// Natisne: Tukaj sem
echo "Tukaj sem";
// Izhod: To ne bo vstavilo: \n nove vrstice
echo "To ne bo vstavilo:\nnova vrstica";
// Izhodi: tudi spremenljivka $example ne bo zamenjana
echo "Tudi spremenljivka $example ne bo zamenjana"; Če je niz v dvojnih narekovajih ("), PHP prepozna velika količina nadzorna zaporedja za posebne znake in tudi nadomesti svojo vrednost namesto imena spremenljivke v nizu. Tako kot pri enojnih narekovajih mora biti za uporabo dvojnih narekovajev v nizu z dvojnimi narekovaji pred njimi poševnica nazaj (\).

Tukaj je primer uporabe dvojnih narekovajev:
// Izhod: preprost niz
echo "Preprost niz";
// Rezultati: Podjetje "Snowdrop"
echo "Podjetje \"Snowdrop\"";
// Izhod: To bo pripeljalo do nove vrstice
echo "To se bo prekinilo v novo vrstico \n";
// Izhod: spremenljivka bo zamenjana
$example = "bo zamenjan";
echo "Spremenljivka $example"; Upoštevati je treba tudi, da je zaporedje "\n" ( nova vrstica), "\r" (povratni začetek) za golo besedilo, ne HTML. Tako ne boste videli sprememb v brskalniku (samo v izvorna koda strani).

Ugotovimo, koliko hitrejši so enojni narekovaji od dvojnih. Za meritve bomo napisali kratko testno skripto, pri čemer bomo takoj opozorili, da bodo rezultati, ki so odvisni od strojne opreme vašega računalnika ali strežnika, drugačni, če jo testirate sami.
// Vrni časovni žig na začetku zanke
$start = mikročas (true);
// Ustvari zanko za 1 milijon ponovitev
za ($i = 0; $i< 1000000; $i++) {
$text = "Tukaj je niz znakov";
}
// Izračunaj porabljen čas
$time = (microtime(true) - $start); Rezultat: 0,09 sekunde.

Če enojne narekovaje zamenjamo z dvojnimi:
$text = "Tukaj je niz znakov"; Rezultat bo 0,10 sekunde.

Kot lahko vidite, je pri uporabi besedilnih nizov razlika v času izvajanja zelo majhna, lahko bi celo rekli, da je sploh ni. Zabava se začne, ko poskušamo združiti niz in spremenljivko.
$text = "Tukaj je niz znakov $i"; oz
$text = $i."Tukaj je niz znakov"; Rezultat približno: 0,27 sekunde.

Razlika je precej opazna. Združevanje in dvojni narekovaji očitno vplivajo na zmogljivost, ko so nizu dodane spremenljivke.

Ko strežnik obdela kodo, preveri vso vsebino dvojnih narekovajev za spremenljivke, konstante in drugo. Traja. In strežnik obdela tisto, kar je med enojnimi narekovaji, kot že pripravljeno besedilo in ga ne zanima, kaj je tam. Razlika med zmogljivostjo enojnih in dvojnih narekovajev je zelo majhna, a če razvijate zelo obremenjen projekt, je že nekaj prihranjenih milisekund zmaga.