Php дээрх дан болон давхар хашилтын хооронд ямар ялгаа байдаг вэ? PHP дахь ганц ба давхар хашилттай мөрүүдийн ялгаа нь юу вэ? Стринг төрлийн хэрэгжилтийн дэлгэрэнгүй

РНР хэл дээрх ишлэл нь дан эсвэл давхар байж болох нь нууц биш юм. Хашилтын зарим хэрэглээ хэзээ илүү тохиромжтой болохыг олж мэдье.

Ганц ишлэл

Мөрийг тодорхойлох хамгийн энгийн арга бол текстийг дан хашилтанд оруулах явдал юм.

Хэрэв бид текстэнд ганц эшлэл ашиглах шаардлагатай бол түүнээс налуу зураасаар (\) зугтах хэрэгтэй.

Ганц хашилт доторх зугтах дараалал ажиллахгүй.

Ганц ишлэл ашиглах жишээ:

Давхар ишлэл

Хэрэв та текстийг давхар хашилтаар тодруулбал мөр нь дан хашилттай адил тодорхойлогдоно. Гэхдээ мэдээж ишлэлүүдийн хооронд ялгаа бий.

Хашилтаас зугтах нөхцөл байдал нь дан ишлэлтэй адил байна.

Давхар хашилтанд орсон мөр нь тусгай тэмдэгтүүдийн ихэнх зугтах дарааллыг таньдаг.

Хамгийн чухал ялгаа нь давхар хашилт нь хувьсагчдыг зохицуулдаг явдал юм.

Давхар хашилт ашиглах жишээ:

Давхар хашилттай тэмдэгт мөр нь хувьсагчдыг зохицуулдаг гэдэгт анхаарлаа хандуулцгаая.

Мөрийг боловсруулахад юу болох вэ? Орчуулагч тэмдэгт мөр бүрийг давхар хашилтаар шалгана, өөрөөр хэлбэл албадан задлан шинжилдэг бөгөөд энэ нь нэмэлт цаг шаарддаг. Тийм ээ, энэ нь ихэвчлэн хоёр секундын дотор байдаг, гэхдээ энэ нь өөрөө ойлгох ёстой. Өөрөөр хэлбэл, хэрэв та нэг мөрийн боловсруулалтыг өөр өөр хашилттай (мэдээж хувьсагчгүйгээр) харьцуулж үзвэл нэг хашилттай мөр илүү хурдан боловсруулагдах нь дамжиггүй.

Тооцоолол

ProfiPHP вэбсайтаас би сонирхолтой тооцооллыг олсон энэ сэдэв. Зохиолч энгийн скрипт бичсэн бөгөөд үүгээрээ мөрийг боловсруулах хугацааг тооцоолсон.

Энэхүү богино өгүүлэлд хэрхэн, хаана ашиглахыг харуулсан болно PHP хэл дээрх ишлэлүүд.

PHP хэл дээрх дан ишлэл (зүсмэл тэмдэг).

Ганц хашилтанд орсон мөрүүдийг РНР ямар ч байдлаар боловсруулдаггүй. Өөрөөр хэлбэл, дан ишлэл нь тэдгээрийн хооронд хавсаргасан текстийг байгаагаар нь илэрхийлдэг.

// Зөв цуурай "Амьдрал яаж байна?"; echo "Амьдрал ямар байна? $name"; echo "Амьдрал ямар байна?".$name; // Буруу цуурай "Сайн байна уу? $name";

Ганц болон давхар хашилтын тусгай тэмдэгтүүд

Жишээлбэл, tab тэмдэгтийг (\t) налуу зураас болон t үсэг гэхээсээ илүү таб тэмдэгт гэж тайлбарлахын тулд таб тэмдэгт агуулсан текстийн мөрийг давхар хашилтанд оруулах ёстой. Та зөвхөн \' ба \\-г ганц хашилтанд ашиглаж болно. Бусад бүх зугтах дарааллыг (\n, \r, \$ гэх мэт) нэг хашилтанд оруулахыг зөвшөөрөхгүй.

// Буруу цуурай "Сайн байна уу?\n"; // Зөв цуурай "Сайн байна уу?\n";

Мөр доторх давхар хашилтаас зайлсхийхийн тулд хашилтыг урвуу зураасны өмнө байрлуулна уу \" .

// Буруу цуурай "

Юу байна даа?

"; // Зөв цуурай"

Юу байна даа?

"; цуурай "

Юу байна даа?

";

PHP хэл дээрх давхар хашилт

Давхар хашилтанд бичсэн текстийг өөр өөрөөр авч үздэг. Жишээлбэл, давхар хашилтанд орсон хувьсагчдыг утгуудаар нь солино. Энэ нь зохиоход хялбар болгодог SQL асуулгадавхар хашилт ашиглах.

$query = "INSERT INTO хүснэгт (нийтлэл, зохиогч, текст, огноо) VALUES ("$id","$author","$text","$date"");

Би РНР програмчлалын чиглэлээр мэргэшсэн мэргэжилтэн биш ч яагаад PHP дээр ганц, заримдаа давхар хашилтанд тэмдэглэгдсэн мөр бүхий кодыг олж харснаа бага зэрэг эргэлзэж байна.

.NET эсвэл C хэл дээр ганц хашилтанд бичвэл тэмдэгт тэмдэгт гэсэн үг гэдгийг л би мэднэ.

Шийдэл

Та юу мэдэх ёстой вэ

$a = "нэр"; $b = "миний $a"; == "миний нэр" $c = "миний $a"; != "миний нэр"

PHP-д хүмүүс "a", "миний нэр", "abc xyz" зэрэг тогтмол мөрийг тодорхойлохдоо дан хашилтыг ашигладаг бол давхар хашилтыг ашиглан "a $b $c $d" гэх мэт таних тэмдэг агуулсан мөрийг тодорхойлдог.

Бас өөр зүйл

Цуурай "миний нэр";

илүү хурдан

Цуурай "миний нэр";

Цуурай "миний". $a;

-аас удаан

Цуурай "миний $a";

Энэ нь ашигласан бусад мөрүүдийн хувьд үнэн юм.

PHP хэл дээр дан хашилтанд бичсэн текстийг мөрийн утга гэж үздэг бол давхар хашилтанд бичсэн текст нь хувьсагчийн утгыг сольж, боловсруулах замаар задлан шинжилдэг.

$test = "хувьсагч"; echo "Сайн уу ноён $ тест"; // гаралт нь: Hello Mr variable echo "Hello Mr $test"; // гаралт нь: Сайн уу ноён $test

Энд давхар ишлэл нь утгыг задлан шинжилж, нэг ишлэлийг мөрийн утга гэж үзнэ ($test хувьсагчийг задлахгүйгээр).

Хоёр төрлийн үүрлэсэн тэмдэгтүүд нь мөр юм. Нэг төрлийн үнийн саналыг ашиглах нь өөр төрлийн үнийн саналыг дүгнэхэд тохиромжтой. """ ба """ . Ишлэлүүдийн төрлүүдийн хамгийн том ялгаа нь дан ишлэл дотор биш давхар хашилтанд оршуулсан танигчийн лавлагааг сольдогт оршино.

Мөрийг тодорхойлох хамгийн энгийн арга бол түүнийг дан хашилтанд (тэмдэг " ).

Мөр дотор ганц ишлэл ашиглахын тулд урвуу зураасаар зайлуулна уу ( \ ). Хэрэв та урвуу зураасыг өөрөө бичих шаардлагатай бол давхардуулаарай ( \\ ). Буруу ташуу зураасны бусад бүх хэрэглээг ердийн тэмдэгт гэж тайлбарлах болно: энэ нь хэрэв та бусад зугтах дарааллыг ашиглахыг оролдвол гэсэн үг юм. \rэсвэл \n, тэдгээр нь ямар нэгэн онцгой зан үйлийн оронд байгаа байдлаар гарна.

цуурай "энэ бол энгийн мөр";

цуурай "Та мөн мөрөнд оруулж болно
ийм шинэ мөрийн тэмдэгт,
Энэ зүгээр"
;

// Гаралт: Арнольд нэг удаа: "Би буцаж ирнэ" гэж хэлсэн.
цуурай "Нэг өдөр Арнольд "Би эргэж ирнэ" гэж хэлсэн.;

Цуурай "Чи C:\\*.*-г устгасан уу?";

// Гаралт: Та C:\*.*-г устгасан уу?
echo "Чи C:\*.*-г устгасан уу?" ;

// Гаралт: Үүнийг өргөтгөхгүй: \n шинэ мөр
цуурай "Үүнийг өргөтгөхгүй: \n шинэ мөр";

// Гаралтууд: $expand болон $expand хувьсагчуудыг өргөтгөхгүй
цуурай "$expand ба $хувьсагчуудын аль нь ч нээгдээгүй байна";
?>

Давхар ишлэл

Хэрэв мөрийг давхар хашилтанд (") хавсаргасан бол PHP нь тусгай тэмдэгтүүдийн илүү олон зугтах дарааллыг хүлээн зөвшөөрдөг:

Зугтах дараалал
Дараалал Утга
\n шинэ мөр (ASCII дахь LF эсвэл 0x0A (10))
\r тээвэрлэлтийн буцаалт (ASCII дахь CR эсвэл 0x0D (13))
\t хэвтээ таб (ASCII дээр HT эсвэл 0x09 (9))
\v босоо таб (ASCII дахь VT эсвэл 0x0B (11)) (PHP 5.2.5-аас хойш)
\e зугтах тэмдэгт (ESC эсвэл ASCII дахь 0x1B (27)) (PHP 5.4.4-с хойш)
\f хуудасны хангамж (FF эсвэл 0x0C (12) ASCII) (PHP 5.2.5-аас хойш)
\\ урвуу зураас
\$ долларын тэмдэг
\" давхар ишлэл
\{1,3} Найман тооллын системийн тэмдэгтийн тогтмол илэрхийлэлд тохирох тэмдэгтүүдийн дараалал
\x(1,2) арван зургаатын тооллын тэмдэгтийн ердийн илэрхийлэлд тохирох тэмдэгтүүдийн дараалал

Ганц хашилтанд тэмдэглэгдсэн мөртийн нэгэн адил ямар ч тэмдэгтээс зугтах нь мөн урвуу зураасыг өөрөө гаргана. PHP 5.1.1-ээс өмнө урвуу зураасаар зур \($var)хэвлэгдээгүй.

Хередок

Мөрүүдийг тодорхойлох гурав дахь арга бол heredoc синтакс ашиглах явдал юм. <<< . Энэ операторын дараа та тодорхойлогч, дараа нь шугамын тэжээлийг зааж өгөх ёстой. Үүний дараа мөр өөрөө гарч ирдэг бөгөөд дараа нь ижил танигч, оруулгыг хаадаг.

Шугам ёстойхаах танигчаар эхлэх, i.e. энэ нь мөрийн эхний баганад харагдах ёстой. Нэмж дурдахад, танигч нь PHP-ийн бусад бүх шошготой адил нэрлэх дүрмийг баримтлах ёстой: зөвхөн үсэг, тоон тэмдэгт, доогуур зураас агуулсан байх ба тоогоор эхэлж болохгүй (доод зураасыг зөвшөөрдөг).

Анхаар

Хаалтын танигчийн мөрөнд цэг таслалаас бусад тэмдэгт агуулаагүй байхыг анхаарах нь маш чухал юм ( ; ). Энэ нь id гэсэн үг доголтой байж болохгүймөн цэг таслалаас өмнө болон хойно ямар ч хоосон зай, таб байж болохгүй. Хаах танигчийн өмнөх эхний тэмдэгт нь таны үйлдлийн системээр тодорхойлогдсон шинэ мөр байх ёстой гэдгийг ойлгох нь чухал. Жишээлбэл, UNIX системүүд, түүний дотор Mac OS X дээр энэ \n. Шинэ мөр нь хаалтын танигчийн дараа шууд эхлэх ёстой.

Хэрэв энэ дүрэм зөрчигдөж, хаалтын танигч нь "цэвэр" биш бол хаалтын танигч байхгүй гэж тооцогдох ба PHP цаашид үргэлжлүүлэн хайх болно. Хэрэв энэ тохиолдолд хаалтын зөв танигч хэзээ ч олдохгүй бол скриптийн төгсгөлд мөрийн дугаартай задлан шинжлэхэд алдаа гарна.

Heredoc-ийг ангийн талбаруудыг эхлүүлэхэд ашиглах боломжгүй. PHP 5.3-аас эхлэн энэхүү хязгаарлалт нь зөвхөн хувьсагч агуулсан heredoc-д хамаарна.

Жишээ №1 Буруу жишээ

анги foo (
нийтийн $bar =<<баар
EOT;
}
?>

Хередок текст нь давхар хашилтанд тэмдэглэгдсэн тэмдэгт мөртэй адил үйлдэл хийдэг. Энэ нь та heredoc дахь ишлэлээс зугтах шаардлагагүй гэсэн үг, гэхдээ та дээрх зугтах дарааллыг ашиглаж болно. Хувьсагчдыг боловсруулдаг, гэхдээ та heredoc доторх нарийн төвөгтэй хувьсагчдыг мөртэй ажиллахтай адил болгоомжтой хийх хэрэгтэй.

Жишээ No2 Heredoc мөрийг тодорхойлох жишээ

$str =<<Жишээ мөр,
хэд хэдэн мөрийг хамарсан,
heredoc синтакс ашиглан.
EOD;

Анги аа
{
var $foo ;
var $bar ;

foo() функц
{
$this -> foo = "Foo" ;
$энэ ->
}
}

$foo = шинэ foo();
$name = "Миний нэр" ;

цуурай<<Намайг "$name" гэдэг. Би $foo -> foo гэж бичнэ .
Одоо би дүгнэлт хийж байна
( $foo -> бар [ 1 ]) .
Энэ нь том "А" үсгийг гаргах ёстой: \x41
EOT;
?>

Намайг "Миний нэр" гэдэг. Би Foo гэж бичдэг. Одоо би Bar2 гаргалаа. Энэ нь том "А" үсгийг гаргах ёстой: A

Функцийн аргументуудаар өгөгдөл дамжуулахын тулд heredoc синтакс ашиглах боломжтой.

5.3.0 хувилбараас хойш heredoc синтакс ашиглан статик хувьсагч болон ангиллын шинж чанар/тогтмолуудыг эхлүүлэх боломжтой болсон.

Жишээ # 4 Статик хувьсагчдыг эхлүүлэхийн тулд heredoc ашиглаж байна

// Статик хувьсагч
функц foo()
{
статик $bar =<<Энд юу ч байхгүй ...
ШОШГО;
}

// Ангийн шинж чанар/тогтмол
анги foo
{
const BAR =<<Тогтмолыг ашиглах жишээ
ФОБАР;

Нийтийн $baz =<<Талбарыг ашиглах жишээ
ФОБАР;
}
?>

PHP 5.3.0-аас эхлэн та Heredoc танигчийг давхар хашилтаар хүрээлж болно.

Nowdoc

Nowdoc нь дан хашилттай тэмдэгт мөрүүдийн хувьд heredoc нь давхар хашилттай мөрттэй адил юм. Nowdoc нь гередоктой төстэй, гэхдээ дотроо орлуулалт хийгдээгүй. Энэхүү загвар нь PHP код эсвэл бусад том текст блокуудыг үүнээс зугтахгүйгээр оруулахад тохиромжтой. Энэ нь SGML бүтэцтэй бага зэрэг төстэй юм боловсруулахаар төлөвлөөгүй текстийн блокыг зарлах замаар.

Nowdoc-ийг ижил дарааллаар зааж өгсөн болно <<< , энэ нь heredoc-д хэрэглэгддэг боловч дараах танигчийг дан хашилтанд оруулсан болно, жишээлбэл, <<<"EOT" . Heredoc танигчдад хамаарах бүх нөхцөлүүд, ялангуяа хаалтын танигчид хамаарах бүх нөхцөлүүд nowdoc-д мөн хамаарна.

Жишээ №6 Nowdoc жишээ

$str =<<<"EOD"
Жишээ текст,
хэд хэдэн мөрийг хамардаг
nowdoc синтакс ашиглан.
EOD;

/* Хувьсагчтай илүү төвөгтэй жишээ. */
анги foo
{
нийтийн $foo ;
нийтийн $bar;

foo() функц
{
$this -> foo = "Foo" ;
$this -> bar = array("Bar1" , "Bar2" , "Bar3" );
}
}

$foo = шинэ foo();
$name = "Миний нэр" ;

цуурай<<<"EOT"
Намайг "$name" гэдэг. Би $foo->foo хэвлэнэ.
Одоо би ($foo->bar) хэвлэж байна.
Энэ нь "А" том үсгийг гаргах ёсгүй: \x41
EOT;
?>

Энэ жишээг ажиллуулсны үр дүн:

Намайг "$name" гэдэг. Би $foo->foo хэвлэнэ. Одоо би ($foo->bar) хэвлэж байна. Энэ нь "А" том үсгийг гаргах ёсгүй: \x41

Сэтгэгдэл:

Heredoc-ээс ялгаатай нь nowdoc нь статик өгөгдөлтэй ямар ч нөхцөлд ашиглагдаж болно. Ангийн талбарууд эсвэл тогтмолуудыг эхлүүлэх ердийн жишээ:

Жишээ №7 Статик өгөгдлийг ашиглах жишээ

анги foo (
нийтийн $bar =<<<"EOT"
баар
EOT;
}
?>

Сэтгэгдэл:

nowdoc дэмжлэгийг PHP 5.3.0 дээр нэмсэн.

Хувьсагчдыг зохицуулах

Хэрэв мөрийг давхар хашилтанд эсвэл heredoc ашиглан зааж өгсөн бол түүний доторх хувьсагчдыг боловсруулдаг.

Синтакс нь энгийн ба төвөгтэй гэсэн хоёр төрөлтэй. Энгийн синтакс нь илүү хялбар бөгөөд илүү тохиромжтой. Энэ нь хувьсагч, массивын утгыг боловсруулах боломжтой болгодог ( массив) эсвэл объектын шинж чанарууд ( обьект) хамгийн бага хүчин чармайлтаар.

Нарийн төвөгтэй синтаксийг илэрхийлэлийг тойрсон буржгар хаалтаар тодорхойлж болно.

Энгийн синтакс

Хэрэв орчуулагч долларын тэмдэгтэй таарвал ( $ ), энэ нь хүчинтэй хувьсагчийн нэр үүсгэхийн тулд аль болох олон тэмдэгтийг агуулна. Хэрэв та нэрний төгсгөлийг зааж өгөхийг хүсвэл буржгар хаалтанд хувьсагчийн нэрийг бичнэ үү.

$ шүүс = "алим" ;

echo "Тэр долларын шүүсний шүүс уусан." . PHP_EOL;
// ажиллахгүй, "s" нь хувьсагчийн нэрний хүчинтэй тэмдэгт,
// гэхдээ бидний хувьсагчийг $juice гэж нэрлэдэг.
echo "Тэр $juices хийсэн шүүс уусан." ;
?>

Энэ жишээг ажиллуулсны үр дүн:

Тэр алимны шүүс уув. Тэр хийсэн шүүс уув.

Массив элемент ( массив) эсвэл объектын өмч ( обьект). Массивын индексүүдэд хаалтын дөрвөлжин хаалт байдаг ( ] ) индексийн тодорхойлолтын төгсгөлийг тэмдэглэнэ. Энгийн хувьсагчтай адил дүрмүүд нь объектын шинж чанаруудад хамаарна.

Жишээ №8 Энгийн синтакс жишээ

$juices = массив("алим" , "улбар шар" , "koolaid1" => "нил ягаан" );

echo "Тэр $juices [ 0 ] шүүс уусан." . PHP_EOL;
echo "Тэр хэдэн $жүүс [1 ] шүүс уусан." . PHP_EOL;
echo "Тэр хэдэн $juices [koolaid1 ] шүүс уусан." . PHP_EOL;

ангийн хүмүүс (
нийтийн $ john = "Жон Смит" ;
нийтийн $ jane = "Жэйн Смит" ;
нийтийн $ Роберт = "Роберт Паулсен" ;

Нийтийн $smith = "Смит" ;
}

$хүмүүс = шинэ хүмүүс();

echo "$хүмүүс -> Жон хэдэн $жүүс [ 0 ] шүүс уусан." . PHP_EOL;
echo " $хүмүүс -> Жон дараа нь $хүмүүс -> Жэйнтэй мэндчилжээ." . PHP_EOL;
echo "$ хүмүүс -> Жонны эхнэр $ хүмүүс -> Роберт мэндчилэв." . PHP_EOL;
echo " $хүмүүс -> Роберт $хүмүүс -> Смит хоёртой мэндчилэв." ; // ажиллахгүй
?>

Энэ жишээг ажиллуулсны үр дүн:

Тэр алимны шүүс уув. Тэр жүржийн шүүс уув. Тэр нил ягаан шүүс уув. Жон Смит алимны шүүс уусан. Дараа нь Жон Смит Жэйн Смиттэй мэндчилжээ. Жон Смитийн эхнэр Роберт Паулсенд мэндчилгээ дэвшүүлэв.Роберт Паулсен тэр хоёртой мэндчилэв.

Илүү төвөгтэй зүйл бол нарийн төвөгтэй синтакс ашиглана уу.

Нарийн төвөгтэй (буржгар) синтакс

Үүнийг ойлгоход хэцүү биш, харин нийлмэл хэллэгийг ашиглах боломжийг олгодог учраас нийлмэл гэж нэрлэдэг.

Мөрт дүрслэгдсэн аливаа скаляр хувьсагч, массив элемент эсвэл объектын шинж чанарыг энэ синтакс ашиглан тэмдэгт мөрөнд дүрсэлж болно. Илэрхийлэлийг мөрийн гадна талд бичсэнтэй адил бичээд дараа нь орооно { Тэгээд } . Учир нь { зугтах боломжгүй, энэ синтакс зөвхөн тухайн үед танигдах болно $ шууд дагадаг { . Ашиглах {\$ хэвлэх {$ . Хэд хэдэн тод жишээ:

// Бүх алдааг харуулах
алдааны_мэдээлэл(E_ALL);

$ агуу = "агуу" ;

// ажиллахгүй байна, гаралт: Энэ бол (гайхалтай)
echo "Энэ бол ( $ агуу )" ;

// Ажил, гаралт: Энэ бол гайхалтай
echo "Энэ бол ( $ агуу ) " ;
echo "Энэ бол $( гайхалтай ) " ;

// Ажил
цуурай "Энэ талбай өргөн( $square -> өргөн ) 00 сантиметр." ;

// Ажил, иш татсан түлхүүр үгс нь зөвхөн буржгар хаалтны синтакс дээр ажиллана
echo "Энэ ажиллана: ( $arr [ "түлхүүр" ]) " ;

// Ажил
echo "Энэ ажиллана: ( $arr [ 4 ][ 3 ]) " ;

// Энэ нь гаднах $foo-той ижил шалтгаанаар хүчингүй
// мөр. Өөрөөр хэлбэл, энэ нь ажиллах болно,
// гэхдээ PHP эхлээд foo тогтмолыг хайдаг тул энэ нь шалтгаан болно
// түвшний алдаа E_NOTICE (тодорхойгүй тогтмол).
цуурай "Энэ нь зөв биш:( $arr [ foo ][ 3 ]) " ;

// Ажил. Олон хэмжээст массивыг дотооддоо ашиглах үед
// мөрөнд үргэлж буржгар хаалт ашигладаг
echo "Энэ ажилладаг: ( $arr [ "foo" ][ 3 ]) " ;

// Ажил.
echo "Энэ ажилладаг: " . $arr [ "foo" ][ 3 ];

цуурай "Энэ бас ажилладаг:( $obj -> утгууд [ 3 ]-> нэр ) " ;

цуурай "Энэ бол нэрлэсэн хувьсагчийн утга юм$нэр : ($( $нэр )) " ;

цуурай "Энэ нь getName()-ийн буцаадаг хувьсагчийн нэрний утга юм:($( getName ())) " ;

цуурай "Энэ нь \$object->getName()-ийн буцаадаг нэрээрх хувьсагчийн утга юм:($( $object -> getName ())) " ;

// ажиллахгүй байна, гаралт: Энэ бол getName() буцаана: (getName())
цуурай "Энэ бол getName()-ийн буцаадаг зүйл: (getName())";
?>

Мөн энэ синтаксийг ашиглан мөр доторх объектын шинж чанаруудад хандах боломжтой.

анги foo (
var $bar = "Би бол баар." ;
}

$foo = шинэ foo();
$bar = "бар";
$baz = массив("foo" , "bar" , "baz" , "quux");
echo " ( $foo -> $bar ) \n" ;
echo " ( $foo -> $baz [ 1 ]) \n" ;
?>

Энэ жишээг ажиллуулсны үр дүн:

Би баар. Би баар.

Сэтгэгдэл:

Функцууд, аргын дуудлагууд, статик ангиллын хувьсагчууд, ангийн тогтмолууд нь дотооддоо ажилладаг {$} , PHP-ээс эхлэн 5. Гэсэн хэдий ч нийлүүлсэн утгыг тодорхойлогдсон мөртэй ижил контекстэд хувьсагчийн нэрээр авч үзэх болно. Ганц буржгар хаалт ашиглах ( {} ) функцууд, аргууд, ангиллын тогтмолууд эсвэл статик ангийн хувьсагчийн утгуудад хандахад ажиллахгүй.

// Бүх алдааг харуулах
алдааны_мэдээлэл(E_ALL);

ангиллын шар айраг (
const softdrink = "rootbeer" ;
нийтийн статик $ale = "ipa" ;
}

$rootbeer = "A & W" ;
$ipa = "Александр Кейт" ;

// Энэ нь ажиллана, гарна: I would like A & W
echo "Би хүсч байна ($( шар айраг :: зөөлөн ундаа )) \n" ;

// Энэ нь бас ажилладаг, гаралт: I would like Alexander Keith's
echo "Би хүсч байна ($( шар айраг :: $ale )) \n" ;
?>

Мөр дэх тэмдэгтэд хандах, өөрчлөх

Мөр дэх тэмдэгтүүдийг мөрийн дараа дөрвөлжин хаалтанд тэгээс эхлэн тэмдэгтүүдийн офсетийг зааж өгснөөр ашиглаж, өөрчилж болно, жишээ нь $str . Энэ зорилгоор мөрийг тэмдэгтүүдийн массив гэж бод. Хэрэв та 1-ээс олон тэмдэгт авах эсвэл солих шаардлагатай бол функцуудыг ашиглаж болно substr()Тэгээд substr_replace().

Сэтгэгдэл: Мөр дэх тэмдэгтэд буржгар хаалт ашиглан хандаж болно, жишээ нь $str(42) .

Анхаар

Мөрийн хязгаараас хэтэрсэн офсет руу бичих оролдлого нь мөрийг тухайн офсет хүртэлх зайгаар дүүргэнэ. Бүхэл бус төрлүүдийг бүхэл тоонд хөрвүүлнэ. Буруу офсет төрөл нь түвшний алдаа үүсгэдэг Э_МЭДЭГДЭЛ. Сөрөг офсет руу бичих нь түвшний алдаа үүсгэдэг Э_МЭДЭГДЭЛ, унших үед энэ нь хоосон мөрийг буцаана. Зөвхөн томилогдсон мөрийн эхний тэмдэгтийг ашиглана. Хоосон мөрөнд оноох нь хоосон байт (NULL) оноодог.

Анхаар

РНР дахь мөрүүд нь байтуудын дотоод массив юм. Үүний үр дүнд, стринг офсет дээр хандах эсвэл өөрчлөх нь олон байт кодчилолд аюулгүй биш бөгөөд зөвхөн ISO-8859-1 гэх мэт ганц байт кодчилол бүхий мөртүүдийг ашиглан хийх ёстой.

Жишээ №9 Зарим жишээ мөрүүд

// Мөрний эхний тэмдэгтийг авна
$str = "Энэ бол туршилт." ;
$first = $str [ 0 ];

// Мөрний гурав дахь тэмдэгтийг авна
$third = $str [ 2 ];

// Мөрний сүүлчийн тэмдэгтийг авна
$str = "Энэ бол туршилт хэвээр байна." ;
$ last = $str [ strlen ($str ) - 1 ];

// Мөрийн сүүлчийн тэмдэгтийг өөрчлөх
$str = "Далайг хар" ;
$str [ strlen ($str )- 1 ] = "e" ;

?>

PHP 5.4-ийн хувьд мөр дэх офсетийг бүхэл тоо эсвэл цифр агуулсан мөр гэж зааж өгөх ёстой, эс бөгөөс анхааруулга өгөх болно. Өмнө нь өгөгдсөн офсет шиг мөр "хөө", сануулгагүйгээр хувиргасан 0 .

Жишээ №10 PHP 5.3 ба 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" ]));
?>

Энэ жишээг PHP 5.3 дээр ажиллуулсны үр дүн:

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

Энэ жишээг PHP 5.4 дээр ажиллуулсны үр дүн:

string(1) "b" bool(true) Анхааруулга: 7-р мөрөнд /tmp/t.php-д "1.0"-ийн хууль бус мөр офсет string(1) "b" bool(false) Анхааруулга: /-д хууль бус мөр офсет "x" tmp/t.php 9-р мөрөнд string(1) "a" bool(false) string(1) "b" bool(худал)

Сэтгэгдэл:

Бусад төрлийн хувьсагчдад (тодорхой интерфэйсийг хэрэгжүүлдэг массив эсвэл объектоос бусад) хандахыг оролдож байна. эсвэл {} чимээгүйхэн буцаж ирнэ NULL.

Сэтгэгдэл:

PHP 5.5 нь синтакс ашиглан string literal дахь тэмдэгтүүдэд хандах дэмжлэгийг нэмсэн эсвэл {} .

Мөрүүдийг өөрчлөх олон ашигтай функцууд байдаг.

Үндсэн функцуудыг мөрийн функцүүдийн хэсэгт тайлбарласан бөгөөд дэвшилтэт хайлт, солихын тулд ердийн илэрхийлэл эсвэл Perl-тэй нийцтэй тогтмол илэрхийллийн функцууд.

Мөр рүү хөрвүүлэх

Цутгамал ашиглан утгыг мөр болгон хувиргаж болно (мөр), эсвэл функцууд strval(). Мөр шаардлагатай илэрхийлэлд хөрвүүлэлт автоматаар явагдана. Энэ нь функцийг ашиглах үед тохиолддог цуурайэсвэл хэвлэх, эсвэл хувьсагчийн утгыг мөртэй харьцуулах үед. Гарын авлагын Төрөл ба Төрөл засварлах хэсгүүдийг уншсанаар дараахь зүйлийг илүү ойлгомжтой болгоно. бас үзнэ үү settype().

Массивыг үргэлж мөр болгон хөрвүүлдэг "Массив", тиймээс та массивын агуулгыг харуулах боломжгүй ( массив), ашиглах цуурайэсвэл хэвлэхюу агуулагдаж байгааг харахын тулд. Нэг элементийг үзэхийн тулд иймэрхүү зүйлийг ашиглана уу echo $arr["foo"]. Бүх агуулгыг хэрхэн харуулах/үзэх талаарх зөвлөмжийг доороос үзнэ үү.

PHP 4 дээрх объектуудыг үргэлж мөр болгон хөрвүүлдэг байсан "Обьект". Хэрэв та объектын талбаруудын утгыг харуулахыг хүсвэл ( обьект) дибаг хийх зорилгоор уншина уу. Хэрэв та шаардлагатай объектын ангийн нэрийг авахыг хүсвэл ашиглана уу авах_анги(). PHP 5-аас хойш __toString аргыг ашиглах боломжтой болсон.

NULLүргэлж хоосон мөр рүү хөрвүүлэгддэг.

Дээр дурдсанчлан массив, объект эсвэл нөөцийг шууд мөр болгон хөрвүүлэх нь тэдгээрийн төрлөөс өөр утгуудын талаар ашигтай мэдээлэл өгөхгүй. Дибаг хийх утгыг гаргах илүү сайн арга бол функцуудыг ашиглах явдал юм хэвлэх_r()Тэгээд var_dump().

PHP дахь ихэнх утгыг байнгын хадгалалтанд зориулж мөр болгон хөрвүүлж болно. Энэ аргыг цуваа болгох гэж нэрлэдэг бөгөөд функцийг ашиглан хийж болно цуврал болгох(). Нэмж хэлэхэд, хэрэв таны PHP суулгац WDDX дэмжлэгтэй бол XML бүтэц рүү цуваа оруулах боломжтой.

Мөрүүдийг тоо болгон хөрвүүлэх

Хэрэв мөрийг тоон утга гэж хүлээн зөвшөөрвөл гарах утга, төрлийг дараах байдлаар тодорхойлно.

Хэрэв мөр нь ".", "e", "E" тэмдэгтүүдийг агуулаагүй бөгөөд тухайн тооны утга нь бүхэл тооны мужид багтсан бол (тодорхойлогдсон PHP_INT_MAX), мөрийг бүхэл тоо гэж хүлээн зөвшөөрөх болно ( бүхэл тоо). Бусад бүх тохиолдолд энэ нь хөвөгч цэгийн тоо гэж тооцогддог ( хөвөх).

Утгыг мөрийн эхлэлээр тодорхойлно. Хэрэв мөр нь хүчинтэй тоон утгаар эхэлсэн бол энэ утгыг ашиглана. Үгүй бол утга нь 0 (тэг) болно. Хүчинтэй тоон утга нь нэг буюу хэд хэдэн оронтой (аравтын бутархайг агуулж болно) заавал өмнө нь тэмдэг, дараа нь нэмэлт илтгэгч байдаг. Экспонент нь "e" эсвэл "E" ба дараа нь нэг буюу хэд хэдэн цифр байна.

$foo = 1 + "10.5" ; // $foo бол хөвөгч (11.5)
$foo = 1 + "-1.3e3" ; // $foo нь хөвөгч (-1299)
$foo = 1 + "bob-1.3e3" ; // $foo нь бүхэл тоо (1)
$foo = 1 + "bob3" ; // $foo нь бүхэл тоо (1)
$foo = 1 + "10 жижиг гахай" ; // $foo нь бүхэл тоо (11)
$foo = 4 + "10.2 Бяцхан гахай" ; // $foo бол хөвөгч (14.2)
$foo = "10.0 гахай" + 1 ; // $foo нь хөвөгч (11)
$foo = "10.0 гахай" + 1.0; // $foo нь хөвөгч (11)
?>

Илүү дэлгэрэнгүй мэдээлэлЭнэ хөрвүүлэлтийн талаарх мэдээллийг Unix баримт бичгийн strtod(3) хэсгээс үзнэ үү.

Хэрэв та энэ хэсэгт байгаа жишээнүүдийн аль нэгийг туршиж үзэхийг хүсвэл юу болохыг харахын тулд үүнийг болон дараах мөрийг хуулж буулгана уу.

echo "\$foo== $foo; бичнэ үү: " . gettype ($foo). "
\n" ;
?>

Тэмдэгтийн кодыг бүхэл тоо болгон хувиргаж авна гэж битгий бодоорой (жишээ нь, C хэл дээр). Тэмдэгтүүдийг ASCII код болон буцааж хөрвүүлэхийн тулд функцуудыг ашиглана уу ord()Тэгээд chr().

Стринг төрлийн хэрэгжилтийн дэлгэрэнгүй

Мөрний төрөл ( мөр) РНР-д байтуудын массив болон буферийн уртыг агуулсан бүхэл тоо хэлбэрээр хэрэгждэг. Энэ нь эдгээр байтыг хэрхэн тэмдэгт болгон хувиргах талаар ямар ч мэдээлэл агуулаагүй бөгөөд энэ ажлыг программист үлдээдэг. Утгатай байт гэх мэт мөрийн агуулгад хязгаарлалт байхгүй 0 ("NUL" байт) хаана ч байж болно (гэхдээ энэ гарын авлагад дурдсанчлан зарим функцууд нь "хоёртын аюулгүй" биш гэдгийг анхаарна уу, өөрөөр хэлбэл тэдгээр нь NUL -байтаас хойшхи өгөгдлийг үл тоомсорлодог номын санд мөр дамжуулж болно).

Мөрний төрлийн ийм шинж чанар нь PHP-д яагаад тусдаа "байт" төрөл байдаггүйг тайлбарладаг - мөрүүд нь энэ үүргийг гүйцэтгэдэг. Текст бус өгөгдлийг буцаадаг функцууд, тухайлбал, сүлжээний залгуураас уншсан дурын өгөгдлийн урсгал зэрэг нь мөрүүдийг буцаадаг.

РНР нь мөрүүдэд зориулсан тусгай кодчилол заадаггүй гэдгийг харгалзан үзвэл стринг литералууд хэрхэн кодлогдсоныг асууж болно. Жишээлбэл, шугам "á" тэнцүү "\xE1"(ISO-8859-1), "\xC3\xA1"(UTF-8, хэвийн болгох хэлбэр C), "\x61\xCC\x81"(UTF-8, хэвийн болгох хэлбэр D) эсвэл өөр боломжит дүрслэл үү? Хариулт нь мөрийг скрипт файлд бичсэн байдлаар кодлох болно. Тиймээс, хэрэв скриптийг ISO-8859-1 кодчилолоор бичсэн бол мөрийг ISO-8859-1 гэх мэтээр кодчилно. Гэсэн хэдий ч Zend Multibyte горим идэвхжсэн үед энэ дүрэм үйлчлэхгүй: энэ тохиолдолд скриптийг ямар ч кодчилолоор (тодорхой заасан эсвэл автоматаар тодорхойлсон) бичиж, дараа нь тодорхой дотоод кодчилол руу хөрвүүлж болно. тэмдэгт мөр. Скриптийн кодчилол (эсвэл Zend Multibyte идэвхжсэн бол дотоод кодчилол) нь зарим хязгаарлалттай болохыг анхаарна уу: кодчилол нь UTF-8 эсвэл ISO-8859-1 гэх мэт бараг үргэлж ASCII-ийн дээд багц байх ёстой. Эхний болон эхний бус шилжилтийн төлөвт ижил байт утгуудыг ашиглаж болох төлөвөөс хамааралтай кодчилол нь асуудал үүсгэж болзошгүйг анхаарна уу.

Мэдээж хэрэг, стринг функцууд нь ашиг тустай байхын тулд мөрийн кодчиллын талаар зарим таамаглал дэвшүүлэх ёстой. Харамсалтай нь, PHP функцүүдийн дунд энэ асуудалд маш олон янзын арга байдаг:

  • Зарим функцууд нь мөрийг зарим нэг байт кодчилолд кодлосон гэж үздэг ч зөв ажиллахын тулд байтыг тодорхой тэмдэгт болгон тайлбарлах шаардлагагүй. Энэ ангилалд жишээлбэл, substr(), strpos(), strlen()Тэгээд strcmp(). Эдгээр функцүүдийн талаар бодох өөр нэг арга бол санах ойн буфер дээр ажилладаг, өөрөөр хэлбэл. тэд байт болон тэдгээрийн офсеттэй шууд ажилладаг. офсет.
  • Бусад функцууд нь кодчилолыг параметр болгон дамжуулахыг хүлээж байгаа бөгөөд хэрэв кодчилолын параметрийг заагаагүй бол өгөгдмөл кодчилолтой гэж тооцож болно. Энэ функц нь
  • Эцэст нь, мөр нь ихэвчлэн UTF-8 кодчилол ашигладаг гэж үздэг функцууд байдаг. intl болон PCRE өргөтгөлүүдийн ихэнх функцууд энд унадаг (сүүлийн тохиолдолд зөвхөн өөрчлөгчийг зааж өгөх үед) у). Хэдийгээр энэ нь зориудаар хийгдсэн боловч функц utf8_decode() UTF-8 кодчилол, ба utf8_encode()- ISO-8859-1.

Эцсийн дүндээ Юникодтой ажилладаг зөв программ бичнэ гэдэг нь Юникодтой ажилладаггүй, өгөгдлийг гэмтээж болзошгүй функцүүдээс болгоомжтой зайлсхийж, оронд нь ихэвчлэн intl болон mbstring өргөтгөлүүдийн хүчинтэй функцуудыг ашиглахыг хэлнэ. Гэсэн хэдий ч Юникод ашиглах боломжтой функцуудыг ашиглах нь сайн эхлэл юм. Хэл ямар онцлог шинж чанартай байхаас үл хамааран Юникод тодорхойлолтыг өөрөө мэдэж байх шаардлагатай. Жишээлбэл, хэрэв програм нь тухайн хэлэнд зөвхөн жижиг, том үсэг байдаг гэж үзвэл энэ нь маш том алдаа юм.

Мөрүүдийг форматлахад би ямар төрлийн ишлэл ашиглах ёстой вэ - апостроф эсвэл сонгодог давхар хашилт?

PHP хэл дээрх давхар ба дан хашилтын ялгааг харцгаая, жишээн дээр аль нь хэзээ хэрэглэхээ олж мэдье.

Ганц хашилтанд орсон тэмдэгтүүдийн хувьсагч болон escape дарааллыг боловсруулдаггүй. Апострофоор хүрээлэгдсэн мөрүүдийг PHP орчуулагч давхар хашилтаар хүрээлэгдсэн ижил төстэй мөрүүдээс хамаагүй хурдан боловсруулдаг.

Шалтгаан нь энгийн: PHP орчуулагч нь хувьсагч байгаа эсэхийг давхар хашилтанд оруулсан мөрүүдийг нэмэлтээр шалгадаг бөгөөд хэрэв тэдгээр нь олдвол хувьсагчийн нэрний оронд түүний утгыг мөрөнд оруулна. Гэхдээ апострофоор тэмдэглэгдсэн мөрийг орчуулагч ердийн текст гэж ойлгодог бөгөөд PHP нь эдгээр мөрөнд ямар ч хувиргалт хийдэггүй. Ямар ч тохиолдолд дан ишлэл дэх мөрүүдийг боловсруулах нь илүү хурдан байх нь ойлгомжтой гэж би бодож байна.

Эхлээд мөрийг хэрхэн тодорхойлохыг тайлбарлаж, дараа нь дан ишлэл дэх мөрүүдийн боловсруулалт хэр хурдан болохыг шалгая.

Мөрийг тодорхойлох хамгийн энгийн арга бол түүнийг дан хашилтанд (") оруулах явдал юм. Нэг хашилттай мөр дотор дан хашилтыг ашиглахын тулд тэдгээрийн өмнө урвуу ташуу зураас (\) байх ёстой, өөрөөр хэлбэл зугтсан байх ёстой. Хэрэв ташуу зураас ирэх ёстой. Нэг ишлэлийн өмнө эсвэл мөрийн төгсгөлд байгаа бол та үүнийг хуулбарлах хэрэгтэй. Хэрэв та өөр тэмдэгтээс зугтахыг оролдвол урвуу зураасыг мөн хэвлэх болно.

Ганц ишлэл ашиглах жишээ энд байна:
// Гаралт: Энгийн мөр
echo "Энгийн мөр";
// Хэвлэх: Би энд байна
echo "Би энд байна";
// Гаралт: Энэ нь: \n шинэ мөр оруулахгүй
echo "Энэ нь оруулахгүй:\nшинэ мөр";
// Гаралт: $example хувьсагчийг мөн орлуулахгүй
echo "$example хувьсагчийг бас орлуулахгүй"; Хэрэв мөрийг давхар хашилтанд (") оруулсан бол PHP таних болно их хэмжээнийтусгай тэмдэгтүүдийн дарааллыг удирдах ба мөр дэх хувьсагчийн нэрний оронд түүний утгыг орлуулна. Ганц хашилтын нэгэн адил давхар хашилттай мөр дотор давхар хашилтыг ашиглахын тулд тэдгээрийн өмнө урвуу ташуу зураас (\) байх ёстой.

Давхар хашилтыг ашиглах жишээ энд байна:
// Гаралт: Энгийн мөр
echo "Энгийн мөр";
// Үр дүн: "Цасан дусал" компани
echo "Компани \"Цасан дусал\"";
// Гаралт: Энэ нь шинэ мөрөнд хүргэнэ
echo "Энэ нь шинэ мөр болж хувирна \n";
// Гаралт: Хувьсагчийг орлуулах болно
$example = "орлуулах болно";
echo "Хувьсагч $ жишээ"; "\n" дараалал гэдгийг санах нь зүйтэй ( шинэ шугам), "\r" (тээвэр буцах) HTML биш харин энгийн текстийн хувьд. Тиймээс та хөтөч дээрх өөрчлөлтийг харахгүй (зөвхөн эх кодхуудас).

Ганц ишлэл нь давхар хашилтаас хэр хурдан болохыг олж мэдье. Хэмжилтийн хувьд бид богино тестийн скрипт бичих бөгөөд хэрэв та өөрөө үүнийг туршиж үзвэл таны компьютер эсвэл серверийн техник хангамжаас хамаарах үр дүн өөр байх болно гэдгийг бид нэн даруй тэмдэглэх болно.
// Давталтын эхэнд байгаа цагийн тэмдгийг буцаана
$start = microtime(үнэн);
// 1 сая давталт хийх гогцоо үүсгэ
төлөө ($i = 0; $i< 1000000; $i++) {
$text = "Энд тэмдэгтийн мөр байна";
}
// зарцуулсан цагийг тооцоол
$цаг = (микро цаг(үнэн) - $эхлэх); Үр дүн: 0.09 секунд.

Хэрэв бид дан хашилтыг давхар хашилтаар соливол:
$text = "Энд тэмдэгтийн мөр байна"; Үр дүн нь 0.10 секунд болно.

Таны харж байгаагаар текстийн мөрүүдийг ашиглах үед гүйцэтгэлийн хугацааны ялгаа маш бага байдаг бөгөөд энэ нь огт байхгүй гэж хэлж болно. Бид мөр болон хувьсагчийг нэгтгэхийг оролдох үед хөгжилтэй эхэлдэг.
$text = "Энд $i тэмдэгтийн мөр байна"; эсвэл
$text = $i."Энд тэмдэгтийн мөр байна"; Үр дүн нь ойролцоогоор: 0.27 секунд.

Энэ ялгаа нь нэлээд мэдэгдэхүйц юм. Мөрт хувьсагч нэмэх үед холболт болон давхар хашилт нь гүйцэтгэлд тодорхой нөлөөлдөг.

Сервер кодыг боловсруулахдаа хувьсагч, тогтмол гэх мэт давхар хашилтын бүх агуулгыг шалгадаг. Үүнд цаг хугацаа хэрэгтэй. Мөн сервер нь дан ишлэлүүдийн хооронд байгаа зүйлийг бэлэн текст болгон боловсруулдаг бөгөөд тэнд юу байгаа нь хамаагүй. Ганц болон давхар хашилтын гүйцэтгэлийн ялгаа нь маш бага боловч хэрэв та өндөр ачаалалтай төсөл боловсруулж байгаа бол хэдэн миллисекунд хэмнэгдсэн бол аль хэдийн ялалт юм.