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.
Note: 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.
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.
Note: PHP 3 használatakor azonban egy E_NOTICE szintű figyelmeztetést kapsz, ha ezt kihasználod.
Note: 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:
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.
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.
Example#1 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.
Example#2 "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;
?>
Note: 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.
Note: 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.
Example#3 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.