PHP kézikönyv
Előző | 11. Fejezet. Típusok | Következő

# Stringek

A string karakterek sorozata. PHP-ben egy karakter pontosan egy bytenak felel meg, így 256 különböző karakter lehetséges. Ez azt is jelenti, hogy a PHP-nek jelenleg nincs beépített Unicode támogatása. Néhány Unicode támogatásért lásd a utf8_encode() és a utf8_decode() függvényeket.

> Megjegyzés: Nem okozhat problémát a stringek körében, hogy túl hosszúvá válnak. Semmiféle korlát nem létezik a PHP által kezelt stringek méretére, ezért nem kell tartani a hosszú stringektől.

## Szintaxis

A stringeket háromféleképpen lehet létrehozni.

- aposztróffal

- idézőjellel

- heredoc szintaxissal

### String létrehozása aposztróffal

A legkönnyebben úgy adhatunk meg egy egyszerű stringet, hogy aposztrófok (' karakterek) közé tesszük.

Ha a stringben egy aposztófot szeretnél elhelyezni, és azzal nem a string végét szeretnéd jelezni, más nyelvekhez hasonlóan egy visszaperjel karaktert kell alkalmaznod az aposztóf előtt (\). Ha egy aposztróf, vagy a string vége előtt el szeretnél helyezni egy visszaperjelet, meg kell dupláznod azt. Figyelj arra, hogy ha bármilyen más karakter elé teszel visszaperjelet, a visszaperjel meg fog jelenni a stringben. Emiatt gyakran nincs szükség magának a visszaperjelnek a duplázására.

> Megjegyzés: PHP 3 használatakor azonban egy E_NOTICE szintű figyelmeztetést kapsz, ha ezt kihasználod.

> Megjegyzés: A többi móddal ellentétben, az aposztrófos stingben a változók értékei és az escape szekvenciák nem helyettesítődnek be.

`<?php
echo 'Ez itt egy egyszerű string';
echo 'A stringekbe újsor karaktereket is építhetsz,
ilyen formában. Ez így szépen
működik.';
// Kimenet: Arnold egyszer azt mondta: "I'll be back"
echo 'Arnold egyszer azt mondta: "I\'ll be back"';
// Kimenet: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';
// Kimenet: You deleted C:\*.*?
echo 'You deleted C:\*.*?';
// Kimenet: Nem helyettesítődik be \n az újsor karakter
echo 'Nem helyettesítődik be \n az újsor karakter';
// Kimenet: A $vóltozók $szintén nem helyettesítődnek be
echo 'A $vóltozók $szintén nem helyettesítődnek be ';
?>`

### String létrehozása idézőjellel

Ha egy stringet idézőjelek (") közé helyezünk, a PHP több speciális jelölés feldolgozására lesz képes:

Táblázat 11-1. Speciális jelölések idézőjeles stringben

jelölés | jelentése
--- | ---
\n | újsor (LF vagy 0x0A (10) ASCII kódú karakter)
\r | kocsivissza (CR vagy 0x0D (13) ASCII kódú karakter)
\t | vízszintes tabulátor (HT vagy 0x09 (9) ASCII kódú karakter)
\\ | visszaperjel
\$ | dollárjel
\" | idézőjel
\[0-7]{1,3} | egy karaktersorozat, ami oktális számokra illeszkedik
\x[0-9A-Fa-f]{1,2} | egy karaktersorozat, ami hexadecimális számokra illeszkedik

Ha bármilyen más karakter elé visszaperjelet írsz, ebben az esetben is ki fog íródni a visszaperjel.

A legfontosabb jellemzője az idézőjeles stringeknek az, hogy a változók behelyettesítésre kerülnek. Lásd a változók behelyettesítése című részt további részletekért.

### String létrehozása heredoc szintaxissal

Egy másfajta módszer a stringek megadására a heredoc szintaxis ("<<<"). [ez itt megint nem elírás, kedves unix-shell programozó!] A <<< jelzés után egy azonosítót kell megadni, majd a stringet, és végül az azonosítót mégegyszer, ezzel zárva le a stringet.

A lezáró azonosítónak mindenképpen a sor legelső karakterén kell kezdődnie. Ugyancsak figyelni kell arra, hogy ez az azonosító is az általános PHP elemek elnevezési korlátai alá tartozik: csak alfanumerikus karaktereket és aláhúzást tartalmazhat, és nem kezdődhet számjegy karakterrel.

Figyelem

Nagyon fontos, hogy odafigyelj arra, hogy a lezáró azonosítót tartalmazó sor ne tartalmazzon semmi mást, csupán esetleg egy pontosvessző (;) karaktert. Ez még pontosabban azt is jelenti, hogy az azonosító nem lehet beljebb kezdve, és nem szabad semmilyen szóköz vagy tabulátor karaktert sem elhelyezni a pontosvessző előtt vagy után. Fontos, hogy az záróazonosító előtt szerepelnie kell egy újsor karakternek az operációs rendszernek megfelelően. Ez például Macintosh-on \r.

Ha ezt a szabály megsérted és a záróazonosító nem "tiszta", akkor nem lesz záróazonosítónak tekitve, így a PHP tovább fogja keresni. Ebben az esetben, ha nem talál érvényes záróazonosítót, akkor szintaktikai hibát fog adni, ahol a hiba sorának száma a szkript végére fog mutatni.

Nem megengedett a heredoc szintaxis használata az osztályok attribútumainak inicializálásakor. Ilyen esetben más string-szintaxist kell használnod.

Példa 11-3. Helytelen példa

`<?php class ize { public $bigyo = <<<EOT bigyo EOT; } ?>`

A heredoc az idézőjeles stringekhez hasonlóan működik, az idézőjelek nélkül. Ez azt jelenti, hogy nem kell visszaperjellel jelülni az idézőjeleket a szövegben, de a fenti speciális jelölések használhatóak. A változók értékei behelyettesítődnek, de az idézőjeles karaktersorozatokhoz hasonlóan gondosan kell ügyelni a komplex változó hivatkozások megadására.

Példa 11-4. "Heredoc" string példa [VAS: Vége A Stringnek de helyette lehet bármi]

`<?php
$str = <<<VAS
Példa egy stringre, amely
több sorban van, és heredoc
szintaxisú
VAS;
/* Komplexebb példa, változókkal. */
class ize
{
var $ize;
var $valami;
function ize()
{
$this->ize = 'Valami';
$this->valami = array('elso', 'masodik', 'harmadik');
}
}
$ize = new ize();
$nev = 'Béla';
echo <<<VAS
A nevem "$nev". Kiírok egy értéket: $ize->ize.
Most kiírok egy tömbelemet: {$ize->valami[1]}.
Ez nagy 'A' kell, hogy legyen: \x41
VAS;
?>`

> Megjegyzés: A heredoc a PHP 4-esben került a nyelvbe.

### Változók behelyettesítése

Ha egy stringet idézőjelek között, vagy heredoc szintaxissal adsz meg, a jelölt változók értékei behelyettesítésre kerülnek.

Kétféleképpen lehet megadni egy változót: az egyszerű és a komplex formátummal. Az egyszerű forma a leggyakoribb és legkényelmesebb. Lehetőséget ad egy skalár, tömb érték vagy egy objektum tulajdonság beillesztésére.

A komplex szintaxis a PHP 4-es változatában került a nyelvbe, és a jelölésben használatos kapcsos zárójelekről ismerhető fel.

#### Egyszerű szintaxis

Ha dollár ($) jelet talál a PHP egy stringben, mohón megkeresi az összes ezt követő azonosítóban is használható karaktert, hogy egy érvényes változónevet alkosson. Használj kapcsos zárójeleket, ha pontosan meg szeretnéd határozni, meddig tart egy változó.

`<?php $ingatlan = 'ház'; echo "kertes $ingatlan kerítéssel"; // működik, szóköz nem lehet változónévben echo "páros $ingatlanszám"; // nem működik, az 's' és további karakterek lehetnek változónévben echo "páros ${ingatlan}szám"; // működik, mert pontosan meg van adva a név echo "páros {$ingatlan}szám"; // működik, mert pontosan meg van adva a név ?>`

Hasonlóképpen meg lehet adni tömbindexet vagy objektum tulajdonságot is. A tömbindexek esetében a záró szögletes zárójel (]) jelöli az index végét, az objektum tulajdonságoknál az egyszerű skalárok szabályai érvényesek, habár objektum tulajdonágok esetén nem használható a fenti trükk.

`<?php
// Ezek a példák a tömbök stringen belüli használatára vonatkoznak.
// Stringen kívül mindig tedd idézőjelbe a tömb string típusú indexeit
// és ne használj {kapcsos zárójeleket} stringen kívül.
// Irassunk ki minden hibát
error_reporting(E_ALL);
$gyumolcsok = array('eper' => 'piros', 'alma' => 'zöld');
// Működik, de lásd az $ize[valami] karakterláncon kívüli problémáját
echo "Az alma $gyumolcsok[alma]."; // ez másképpen használandó karaktersorozatokon kívül.
// Működik
echo "Az alma {$gyumolcsok['alma']}.";
// Működik, de a PHP egy alma nevű konstanst keres először
// mint ahogy alább le van írva
echo "A alma is {$gyumolcsok[alma]}.";
// Nem működik, kapcsos zárójeleket kellene használni. Szintaktikai hibát epirosményez.
echo "A alma is $gyumolcsok['alma'].";
// Működik
echo "A alma is " . $gyumolcsok['alma'] . ".";
// Működik
echo "A négyzet $negyzet->szelesseg méter széles.";
echo "A négyzet $negyzet->szelesseg00 centiméter széles."; // nem működik
// A megoldás érdekében lásd a komplex szintaxis szakaszt!
?>`

Bármely ennél komplexebb helyettesítéshez a komplex szintaxis használatos.

#### Komplex (kapcsos zárójeles) szintaxis

Ezt nem azért nevezzük komplexnek, mert a szintaxis komplex, hanem azért, mert így komplex kifejezések helyettesítésére nyílik lehetőség.

Gyakorltilag bármilyen változó érték behelyettesíthető ezzel a szintaxissal. Egyszerűen úgy kell megadni az értéket adó kifejezést, mintha a stringen kívül dolgoznál vele, és utána { és } jelek közé kell zárni. Mivel a '{' jel megadására nincs speciális jelölés, ez a forma csak akkor fog működni, ha a { után közvetlenül egy $ jel található. (Használhatod a "{\$" vagy "\{$" jelöléseket, ha a stringben a "{$" sorozatot szeretnéd beilleszteni, és nem változóhelyettesítést adsz meg). Néhány példa, ami tisztázhatja a félreértéseket:

`<?php
// Irassunk ki minden hibát
error_reporting(E_ALL);
$oriasi = 'fantasztikus';
// Nem működik, kimenet: Ez { fantasztikus}
echo "Ez { $oriasi}";
// Működik, kimenet: Ez fantasztikus
echo "Ez {$oriasi}";
echo "Ez ${oriasi}";
// Működik
echo "Ez a négyzet {$negyzet->szelesseg}00 cm széles.";
// Működik
echo "Ez működik: {$arr[4][3]}";
// Ez hibás ugyanazért, amiért $ize[bigyo] hibás stringen
// kívül. Más szóval, működik, de mivel a PHP az ize nevű
// konstanst keresi előszőr, E_NOTICE szintű hibát
// fog adni (undefined constant).
echo "Ez wrong: {$arr[ize][3]}";
// Működik. Amikor többdimenziós tömböket használsz, stringen
// belül mindig vedd körük kapcsos zárójelekkel
echo "Ez működik: {$arr['ize'][3]}";
// Működik.
echo "Ez működik: " . $arr['ize'][3];
echo "Még így is írhatod: {$obj->values[3]->nev}";
echo "Ez a $nev nevű valtozó értéke: {${$nev}}";
?>`

### String karaktereinek elérése és módosítása

A string karaktereire nullától számozott indexekkel lehet hivatkozni, a string neve után megadott kapcsos zárójelek között.

> Megjegyzés: Kompatibilitási okokból a tömböknél használatos szögletes zárójelek is alkalmazhatóak a karakterek eléréséhez. Ez a tömb jelzés azonban nem javasolt a PHP 4-től.

Példa 11-5. Néhány string példa

`<?php $str = 'Ez egy teszt.'; $first = $str{0}; // Most meg a harmadik $harmadik = $str{2}; // Az utolsó karakter kiolvasása $str = 'Ez még mindig egy teszt.'; $utolso = $str{strlen($str)-1}; // Utolsó karakter módosítása $str = 'Értem'; $str{strlen($str)-1} = 'd'; ?>`

## Hasznos függvények és operátorok

Stringeket a '.' (pont) stringösszefűző operátorral tudsz összefűzni. A '+' (összeadás) operátor nem alkalmas erre a feladatra. Lásd a String operátorok című részt további információkért.

Számos hasznos függvény létezik stringek manipulálásához.

Lásd a string függvények című részt általános függvényekért, a reguláris kifejezés függvényeket fejlett kereséshez és cserékhez (két formában: Perl és POSIX kiterjesztett).

Külön függvények léteznek URL stringekhez, és stringek kódolásához/dekódolásához (mcrypt és mhash kódolások).

Végül ha ezek között sem találod, amit keresel, lásd a karakter típus függvényeket.

## Konverzió stringgé

Stringgé konvertálni a (string) módosítóval vagy a strval() függvénnyel tudsz. A string konverzió automatikusan végrehajtódik olyan környezetben, ahol string értékre van szükség. Ez echo() és print() függvények használatánál megtörténik, vagy olyankor, amikor változó értékét stringgel hasonlítod össze. A Típusok és Bűvészkedés a típusokkal részek elolvasása segíthet a következők megértésében. Lásd még a settype() függvényt.

A boolean `TRUE` érték az "1" stringgé, a `FALSE` pedig a "" (üres string) stringgé konvertálódik. Ily módon alakítgathatsz oda-vissza a logikai és szöveges adatok között.

Egy egész (integer) vagy egy lebegőpontos szám (float) úgy konvertálódnak, hogy az eredményül kapott string a szám számjegyeiből áll (beleértve az exponenciális részt lebegőpontos számok esetén).

A tömbök mindig az "Array" stringgé konvertálódnak, tehát így nem tudod kiiratni egy tömb tartalmát echo() vagy print() függvénnyel Egy elem kiírásához használj valami ehhez hasonlót: echo $arr['ize']. Lásd lejjebb a teljes tartalom kiírására vonatkozó javaslatokat.

Az objektumok mindig az "Object" stringgé konvertálódnak. Ha egy attribútumának az értékét szeretnéd kiírni, olvasd el a lenti bekezdéseket. Ha azt szeretnéd kideríteni, hogy egy objektum melyik osztálynak a példánya, használd a get_class() függvényt. A PHP 5-ös verziójától a konverzió az objektum __toString() metódusának meghívásával történik.

Az erőforrások (resource) mindig "Resource id #1" formájú strigekké alakítódnak át, ahol 1 az erőforrás egyedi azonosító száma, amelyet a PHP oszt ki futásidőben. Ha az erőforrás típusát szeretnéd megtudni, használd a get_resource_type() függvényt.

A `NULL` mindig az üres stringgé konvertálódik.

Amint fent olvashattad, tömbök, objektumok és erőforrások kiírása nem szolgáltat semmi hasznos információt magukról az értékekről. A hibakezelés (debug) esetén használható értékek kiírására egy jobb módszer megismeréséhez tanulmányozd a print_r() és a var_dump() függvényeket.

A PHP értékeket alakíthatod úgy is stringgé, hogy örökre el tudd tárolni azokat. Ezt a módszert szerializációnak nevezik, és a serialize() függvény alkalmazható erre. A PHP értékeket XML struktúrába is tudod szerializálni, abban az esetben, ha van a PHP konfigurációdban WDDX.

## String konvertálása számmá

Amikor egy string számként értékelődik ki, az eredmény típusa a következőképp kerül meghatározásra.

A string lebegőpontosként értékelődik ki, ha a '.', 'e', vagy 'E' karakterek bármelyikét tartalmazza. Egyébként egészként értékelődik ki.

Az érték meghatározása a string első karakterei alapján történik. Ha a string érvényes számmal kezdődik, ez az érték kerül felhasználásra. Máskülönben az érték 0 lesz [nulla, nem nagy O betű]. Érvényes számnak tekintendő, amelynek opcionális előjelét egy vagy több számjegy követi (melyben lehet egy tizedespont), végül lehet exponense. Az exponens egy 'e' vagy 'E' karakter, melyet egy vagy több szám követ.

`<?php
$ize = 1 + "10.5"; // $ize most float (11.5)
$ize = 1 + "-1.3e3"; // $ize most float (-1299)
$ize = 1 + "bob-1.3e3"; // $ize most integer (1)
$ize = 1 + "bob3"; // $ize most integer (1)
$ize = 1 + "10 Kicsi Pingvin"; // $ize most integer (11)
$ize = 4 + "10.2 Kicsi Pingvinke" // $ize most integer (14)
$ize = "10.0 disznó " + 1; // $ize most integer (11)
$ize = "10.0 disznó " + 0.5; // $ize most float (10.5) [szóval 10 disznó, meg egy féldisznó]
?>`

Ha többet szeretnél megtudni erről a konverzióról, akkor nézd meg a Unix manualt strtod(3). [=RTFM]

Ha szeretnéd kipróbálni valamelyik fejezetbeli példát, elmásolhatod innen a példákat és beszúrhatod az alábbi sort, hogy lásd mi is történik.

[Ahhoz nem árt azért előbb érteni a beszúrt sort. A beszúrandó string elején a "\" azért van, hogy a $ize helyére NE a ize változó értéke kerüljön, hanem a \$ hatására a $ karakter íródjon ki, majd a ize karaktersor, egy egyenlőségjel, és utána a $ize változó értéke. Az első "\" hatására ugyanis a köv. karakter ("$") elveszti különleges jelentését, és kimásolódik a kimenetre, majd jön a "ize=" szöveg, ez is úgy, ahogy van a kimenetre kerül, a fordító nem is találkozott változóval, amit be kellene helyettesíteni. Aztán jön a $ize, ezt már felismeri a fordító, és a változó értékét írja ki]:

`<?php echo "\$ize==$ize; típusa " . gettype($ize) . "<br />\n"; ?>`

Ne reméld, hogy egy karaker kódját megkapod, ha egésszé konvertálod (mint ahogyan például C-ben tennéd). Használd a ord() és a chr() függvényeket a karakterkódok és a karakterek közötti konverzióra.

Előző | Tartalom | Következő
Lebegőpontos számok | Fel | Tömbök