تفاوت بین نقل قول های تک و دوگانه در php چیست؟ تفاوت بین رشته های تک و دوگانه در PHP چیست؟ جزئیات اجرای نوع رشته

بر کسی پوشیده نیست که نقل قول ها در PHP می توانند تکی یا دوگانه باشند. بیایید دریابیم که چه زمانی استفاده های خاص از علامت نقل قول مناسب تر است.

نقل قول های تک

ساده ترین راه برای تعریف رشته این است که متن را در یک نقل قول قرار دهید.

اگر لازم است از یک نقل قول در متن استفاده کنیم، باید با یک اسلش جلو (\) از آن فرار کنیم.

دنباله های فرار در داخل نقل قول ها کار نمی کنند.

نمونه هایی از استفاده از نقل قول تکی:

نقل قول های دوگانه

اگر متن را با گیومه های دوتایی هایلایت کنید، رشته به همان شکلی که با گیومه های تکی مشخص می شود، تعریف می شود. اما البته بین نقل قول ها تفاوت هایی وجود دارد.

وضعیت فرار از نقل قول مانند نقل قول های تک است.

رشته ای که در گیومه های دوتایی محصور شده است، بیشتر توالی های فرار را برای کاراکترهای خاص تشخیص می دهد.

مهمترین تفاوت این واقعیت است که دو گیومه متغیرها را کنترل می کند.

نمونه هایی از استفاده از دو نقل قول:

بیایید روی این واقعیت تمرکز کنیم که رشته‌هایی با گیومه‌های دوگانه، متغیرها را کنترل می‌کنند.

وقتی یک رشته پردازش می شود چه اتفاقی می افتد؟ مترجم هر رشته را با دو گیومه برای متغیرها بررسی کنید، یعنی تجزیه اجباری رخ می دهد که زمان بیشتری را می طلبد. بله، اغلب این یک کسری از ثانیه است، اما خود واقعیت باید درک شود. یعنی اگر پردازش یک رشته را با گیومه های مختلف (البته بدون متغیر) مقایسه کنید، قطعاً رشته ای با کوتیشن تک سریعتر پردازش می شود.

محاسبات

در وب سایت ProfiPHP محاسبات جالبی برای آن پیدا کردم این موضوع. نویسنده یک فیلمنامه ساده نوشت که با آن زمان پردازش رشته ها را محاسبه کرد.

این مقاله کوتاه نحوه و مکان استفاده را نشان می دهد نقل قول در PHP.

نقل قول های تک (آپوستروف) در PHP

رشته های محصور شده در یک نقل قول به هیچ وجه توسط PHP پردازش نمی شوند. به این معنا که نقل‌قول‌های منفرد متن محصور شده بین آنها را همانطور که هست نشان می‌دهند.

// اکو صحیح "زندگی چطور است؟" echo "زندگی چطور است؟ $name"; echo "زندگی چطوره؟"$name; // اکو نادرست "حالت چطوره؟ $name";

کاراکترهای خاص در نقل قول تک و دو

برای اطمینان از اینکه، به عنوان مثال، کاراکتر تب (\t) به جای یک اسلش و حرف t به عنوان یک کاراکتر تب تفسیر می شود، باید خط متنی را که شامل کاراکتر تب است در دو گیومه قرار دهید. شما فقط می توانید از \' و \\ در نقل قول تک استفاده کنید. همه دنباله‌های فرار دیگر (\n، \r، \$، و غیره) در داخل نقل قول‌های تکی مجاز نیستند.

// اکو نادرست "چطوری؟\n"; // اکو صحیح "چطوری؟\n";

برای فرار از نقل قول های دوتایی در یک رشته، نقل قول ها را قبل از اسلش \" قرار دهید.

// اکو نادرست "

چه خبر؟

"; // اکو صحیح"

چه خبر؟

"؛ پژواک"

چه خبر؟

";

دو نقل قول در PHP

متن محصور شده در دو نقل قول بسیار متفاوت است. به عنوان مثال، متغیرهای محصور شده در دو گیومه با مقادیر خود جایگزین می شوند. این باعث می شود تا کامپایل راحت باشد پرس و جوهای SQLبا استفاده از دو نقل قول

$query = "INSERT INTO جدول (پست، نویسنده، متن، تاریخ) VALUES ("$id"،"$author"،"$text،"$date"");

من در برنامه نویسی PHP متخصص نیستم، اما کمی گیج هستم که چرا برخی از کدها را در PHP با رشته ای می بینم که در گیومه های تکی و گاهی اوقات دوتایی قرار دارند.

فقط می دانم که در زبان دات نت یا سی، اگر به صورت تک کوتیشن باشد، به این معنی است که یک کاراکتر است نه رشته.

راه حل

آنچه شما باید بدانید

$a = "نام"; $b = "$a من"; == "نام من" $c = "$a من"; != "نام من"

در PHP، افراد برای تعریف رشته ثابت مانند "a"، "my name"، "abc xyz" از کوتیشن‌های منفرد استفاده می‌کنند، در حالی که از دو کوتیشن برای تعریف رشته‌ای حاوی شناسه‌ای مانند "a $b $c $d" استفاده می‌کنند.

و یک چیز دیگر این است

پژواک "نام من"؛

سریعتر از

پژواک "نام من"؛

پژواک "من" $a;

کندتر از

اکو "$a من"؛

این برای رشته های دیگر استفاده شده صادق است.

در PHP، متن در گیومه های تک به عنوان یک مقدار رشته در نظر گرفته می شود، در حالی که متن در کوتیشن های دوگانه، متغیرها را با جایگزینی و پردازش مقدار آنها تجزیه می کند.

$test = "متغیر"; echo "Hello Mr $test"; // خروجی این خواهد بود: Hello Mr متغییر echo "Hello Mr $test"; // خروجی این خواهد بود: سلام آقای $test

در اینجا نقل قول دوگانه مقدار را تجزیه می کند و نقل قول واحد به عنوان یک مقدار رشته در نظر گرفته می شود (بدون تجزیه متغیر $test).

هر دو نوع کاراکتر تودرتو رشته هستند. استفاده از یک نوع نقل قول برای نتیجه گیری نوع دیگری از نقل قول راحت است. """ و """ بزرگترین تفاوت بین انواع نقل قول این است که مراجع شناسه تودرتو در داخل گیومه‌های دوتایی جایگزین می‌شوند تا داخل نقل قول‌های تکی.

ساده ترین راه برای تعریف یک رشته، محصور کردن آن در یک نقل قول (نماد " ).

برای استفاده از یک نقل قول در داخل یک رشته، از آن با یک اسلش فرار کنید ( \ ). اگر نیاز به نوشتن خود اسلش دارید، آن را کپی کنید ( \\ ). همه استفاده‌های دیگر از بک اسلش به عنوان کاراکترهای معمولی تفسیر می‌شوند: این بدان معناست که اگر سعی کنید از دنباله‌های فرار دیگری مانند \rیا \n، آنها به جای هر رفتار خاصی، همانطور که هست خروجی خواهند داشت.

اکو "این یک رشته ساده است";

اکو "شما همچنین می توانید در خطوط وارد کنید
شخصیت خط جدید مانند این،
این خوبه"
;

// خروجی ها: آرنولد یک بار گفت: "من برمی گردم"
اکو "یک روز آرنولد گفت، "من برمی گردم.";

اکو "C:\\*.* را حذف کردی؟";

// خروجی ها: C:\*.* را حذف کردید؟
echo "C:\*.* را حذف کردی؟" ;

// خروجی ها: این گسترش نخواهد یافت: \n خط جدید
اکو "این گسترش نخواهد یافت: \n خط جدید";

// خروجی ها: متغیرهای $expand و $either گسترش نمی یابند
اکو "متغیرهای $expand و $either گسترش نمی‌یابند";
?>

نقل قول های دوگانه

اگر رشته در دو گیومه (") محصور شود، PHP دنباله های فرار بیشتری را برای کاراکترهای خاص تشخیص می دهد:

دنباله های فرار
دنباله معنی
\n خط جدید (LF یا 0x0A (10) در ASCII)
\r برگشت بار (CR یا 0x0D (13) در ASCII)
\ t زبانه افقی (HT یا 0x09 (9) در ASCII)
\ v زبانه عمودی (VT یا 0x0B (11) در ASCII) (از PHP 5.2.5)
\e کاراکتر escape (ESC یا 0x1B (27) در ASCII) (از PHP 5.4.4)
\f فید صفحه (FF یا 0x0C (12) در ASCII) (از PHP 5.2.5)
\\ بک اسلش
\$ علامت دلار
\" نقل قول دوگانه
\{1,3} دنباله ای از نویسه ها مربوط به یک عبارت منظم از یک کاراکتر در سیستم اعداد اکتالی
\x(1،2) دنباله ای از کاراکترهای مربوط به بیان منظم یک کاراکتر در نماد هگزادسیمال

همانند رشته‌ای که در گیومه‌های تکی محصور شده‌اند، فرار از هر کاراکتری، خود اسلش را نیز تولید می‌کند. قبل از PHP 5.1.1، بک اسلش کنید \($var)منتشر نشد

هردوک

راه سوم برای تعریف رشته ها استفاده از نحو heredoc است: <<< . بعد از این عملگر باید یک شناسه و سپس یک خط تغذیه مشخص کنید. پس از این، خود خط می آید، و سپس همان شناسه، بسته شدن درج.

خط بایدبا یک شناسه بسته شروع کنید، یعنی. باید در ستون اول سطر ظاهر شود. به‌علاوه، شناسه باید از قوانین نام‌گذاری مشابهی مانند سایر برچسب‌ها در PHP پیروی کند: فقط شامل نویسه‌های الفبای عددی و زیرخط باشد، و نباید با عدد شروع شود (خارج‌گذاری مجاز است).

توجه

توجه به این نکته بسیار مهم است که خط شناسه بسته نباید دارای هیچ کاراکتر دیگری به جز نقطه ویرگول باشد ( ; ). این بدان معناست که شناسه نباید تورفتگی داشته باشدو اینکه قبل یا بعد از نقطه ویرگول نمی تواند هیچ فاصله یا تبی وجود داشته باشد. همچنین درک این نکته مهم است که اولین کاراکتر قبل از شناسه بسته شدن باید یک کاراکتر خط جدید باشد که توسط سیستم عامل شما تعریف شده است. به عنوان مثال، در سیستم های یونیکس، از جمله Mac OS X، این \n. یک خط جدید نیز باید بلافاصله پس از شناسه بسته شدن شروع شود.

اگر این قاعده نقض شود و شناسه بسته کننده "پاک" نباشد، شناسه بسته شدن گم شده در نظر گرفته می شود و PHP به جستجوی بیشتر آن ادامه می دهد. اگر در این حالت شناسه بستن صحیح هرگز پیدا نشد، باعث خطای تجزیه با شماره خط در انتهای اسکریپت می شود.

از Heredoc نمی توان برای مقداردهی اولیه فیلدهای کلاس استفاده کرد. با شروع از PHP 5.3، این محدودیت فقط برای هردوک های حاوی متغیر اعمال می شود.

مثال شماره 1 مثال اشتباه

غذای کلاس (
عمومی $bar =<<بار
EOT;
}
?>

متن Heredoc مانند یک رشته در گیومه های دوتایی بدون داشتن آنها رفتار می کند. این بدان معنی است که شما نیازی به فرار از نقل قول در heredoc ندارید، اما همچنان می توانید از دنباله های فرار بالا استفاده کنید. متغیرها پردازش می شوند، اما هنگام استفاده از متغیرهای پیچیده در هردوک باید به اندازه کار با رشته ها مراقب باشید.

مثال شماره 2 مثالی برای تعریف رشته هردوک

$str =<<خط مثال،
پوشش چندین خط،
با استفاده از نحو هردوک
EOD;

غذای کلاس
{
var $foo ;
var $bar ;

تابع foo()
{
$this -> foo = "Foo" ;
$this ->
}
}

$foo = new foo();
$name = "MyName" ;

اکو<<نام من "$name" است. $foo -> foo را تایپ می کنم .
حالا من استنباط می کنم
($foo -> نوار [ 1 ]) .
این باید حرف بزرگ "A" را صادر کند: \x41
EOT;
?>

نام من "MyName" است. Foo را تایپ می کنم. حالا من خروجی بار2 را دارم. این باید یک حرف بزرگ "A" را تولید کند: A

همچنین می توان از نحو هردوک برای انتقال داده ها از طریق آرگومان های تابع استفاده کرد:

از نسخه 5.3.0، امکان مقداردهی اولیه متغیرهای استاتیک و خصوصیات/ثابت کلاس با استفاده از نحو heredoc فراهم شده است:

مثال #4 استفاده از heredoc برای مقداردهی اولیه متغیرهای استاتیک

// متغیرهای استاتیک
function foo()
{
استاتیک $bar =<<اینجا چیزی نیست...
برچسب؛
}

// خصوصیات/ثابت کلاس
غذای کلاس
{
const BAR =<<مثال استفاده از ثابت
FOOBAR;

باز عمومی $باز =<<مثال استفاده از فیلد
FOOBAR;
}
?>

از PHP 5.3.0، شما همچنین می توانید شناسه Heredoc را با دو نقل قول احاطه کنید:

Nowdoc

Nowdoc برای رشته های تک گیومه مانند heredoc برای رشته های دو نقل قول است. Nowdoc شبیه هردوک است، اما در داخل آن هیچ تعویضی انجام نمی شود. این طرح برای جاسازی کد PHP یا سایر بلوک های بزرگ متن بدون نیاز به فرار از آن ایده آل است. در این مورد کمی شبیه به ساختار SGML است با اعلام بلوک متنی که قرار نیست پردازش شود.

Nowdoc با همان دنباله نشان داده می شود <<< ، که در heredoc استفاده می شود، اما شناسه زیر در یک نقل قول قرار می گیرد، به عنوان مثال، <<<"EOT" . تمام شرایطی که برای شناسه‌های heredoc اعمال می‌شود، برای nowdoc نیز اعمال می‌شود، به‌ویژه شرایطی که برای شناسه پایانی اعمال می‌شود.

مثال شماره 6 مثال Nowdoc

$str =<<<"EOD"
متن نمونه،
شامل چندین خط
با استفاده از syntax nowdoc
EOD;

/* مثال پیچیده تر با متغیرها. */
غذای کلاس
{
عمومی $foo ;
عمومی $bar ;

تابع foo()
{
$this -> foo = "Foo" ;
$this -> bar = array("Bar1" , "Bar2" , "Bar3" );
}
}

$foo = new foo();
$name = "MyName" ;

اکو<<<"EOT"
نام من "$name" است. من $foo->foo را چاپ می کنم.
حالا من چاپ می کنم ($foo->bar).
این نباید یک خروجی بزرگ "A" داشته باشد: \x41
EOT;
?>

نتیجه اجرای این مثال:

نام من "$name" است. من $foo->foo را چاپ می کنم. حالا من چاپ می کنم ($foo->bar). این نباید یک خروجی بزرگ "A" داشته باشد: \x41

اظهار نظر:

برخلاف heredoc، nowdoc را می توان در هر زمینه ای با داده های ثابت استفاده کرد. یک مثال معمولی از مقداردهی اولیه فیلدها یا ثابت های کلاس:

مثال #7 مثال استفاده از داده های استاتیک

غذای کلاس (
عمومی $bar =<<<"EOT"
بار
EOT;
}
?>

اظهار نظر:

پشتیبانی nowdoc در PHP 5.3.0 اضافه شد.

مدیریت متغیرها

اگر رشته ای در دو گیومه یا با استفاده از heredoc مشخص شود، متغیرهای داخل آن پردازش می شوند.

دو نوع نحو وجود دارد: ساده و پیچیده. نحو ساده ساده تر و راحت تر است. پردازش یک متغیر، یک مقدار آرایه ( آرایه) یا خواص شی ( هدف - شی) با حداقل تلاش.

نحو پیچیده را می توان با پرانتزهای فرفری اطراف عبارت شناسایی کرد.

نحو ساده

اگر مترجم با علامت دلار روبرو شود ( $ ) تا آنجا که ممکن است کاراکترها را برای تشکیل یک نام متغیر معتبر می گیرد. اگر می خواهید انتهای یک نام را مشخص کنید، نام متغیر را در پرانتزهای فرفری قرار دهید.

$juice = "apple" ;

echo "او مقداری آب میوه نوشید." . PHP_EOL ;
// کار نمی کند، "s" یک کاراکتر معتبر برای نام متغیر است،
// اما متغیر ما $juice نام دارد.
echo "او مقداری آبمیوه از آبمیوه های $نوشید." ;
?>

نتیجه اجرای این مثال:

مقداری آب سیب نوشید. مقداری آبمیوه نوشید.

یک عنصر آرایه ( آرایه) یا خاصیت شی ( هدف - شی). در شاخص های آرایه یک براکت بسته شدنی وجود دارد ( ] ) پایان تعریف شاخص را نشان می دهد. قوانین مشابهی برای ویژگی های شیء اعمال می شود که برای متغیرهای ساده.

مثال #8 مثال ساده نحوی

$juices = array("apple" , "narange" , "koolaid1" => "بنفش" );

echo "او مقداری آبمیوه [ 0 ] $نوشید." . PHP_EOL ;
echo "او مقداری آبمیوه [ 1 ] $نوشید." . PHP_EOL ;
echo "او مقداری $juices [ koolaid1 ] juice نوشید." . PHP_EOL ;

افراد کلاس (
public $john = "جان اسمیت" ;
public $jane = "جین اسمیت" ;
public $robert = "رابرت پاولسن" ;

عمومی $smith = " اسمیت " ;
}

$people = افراد جدید();

echo "$people -> جان مقداری $juices [ 0 ] juice نوشید." . PHP_EOL ;
echo " $people -> john سپس به $people -> jane سلام کرد." . PHP_EOL ;
echo "$people -> همسر جان به $people -> رابرت سلام کرد." PHP_EOL;
echo " $people -> robert به دو $people -> smiths سلام کرد." ; // کار نمی کند
?>

نتیجه اجرای این مثال:

مقداری آب سیب نوشید. مقداری آب پرتقال نوشید. مقداری آب بنفش نوشید. جان اسمیت مقداری آب سیب نوشید. جان اسمیت سپس به جین اسمیت سلام کرد. همسر جان اسمیت به رابرت پالسن سلام کرد رابرت پالسن به آن دو سلام کرد.

برای هر چیز پیچیده تر، از نحو پیچیده استفاده کنید.

نحو پیچیده (فرفری).

پیچیده نامیده می شود نه به این دلیل که درک آن دشوار است، بلکه به این دلیل که اجازه استفاده از عبارات پیچیده را می دهد.

هر متغیر اسکالر، عنصر آرایه یا ویژگی شی نگاشت شده به یک رشته را می توان در یک رشته با استفاده از این نحو نمایش داد. فقط عبارت را به همان شکلی که خارج از خط می خواهید بنویسید و سپس آن را در آن بپیچید { و } . از آنجا که { نمی توان فرار کرد، این نحو تنها زمانی شناسایی می شود که $ مستقیم دنبال می کند { . استفاده کنید {\$ برای چاپ {$ . چند مثال گویا:

// نمایش همه خطاها
error_reporting (E_ALL);

$great = "عالی" ;

// کار نمی کند، خروجی ها: این (عالی است)
echo "This is ($great)" ;

// کار می کند، خروجی: این عالی است
echo "This is ($great)" ;
echo "This is $( عالی ) " ;

// آثار
اکو «این میدان عریض است($square -> width ) 00 سانتی متر." ;

// کار می‌کند، کلمات کلیدی نقل‌قول‌شده فقط با نحو پرانتز کار می‌کنند
echo "این کار می کند: ( $arr [ "key" ]) " ;

// آثار
echo "این کار می کند: ( $arr [ 4 ][ 3 ]) " ;

// این به همان دلیلی که $foo در خارج نامعتبر است
// خطوط. به عبارت دیگر، همچنان کار خواهد کرد،
// اما از آنجایی که PHP ابتدا به دنبال foo ثابت می گردد، این باعث می شود
// خطای سطح E_NOTICE (ثابت تعریف نشده).
اکو "درست نیست:( $arr [ foo ][ 3 ]) " ;

// آثار. هنگام استفاده از آرایه های چند بعدی داخلی
// خطوط همیشه از بریس های فرفری استفاده می کنند
echo "این کار می کند: ( $arr [ "foo" ][ 3 ]) " ;

// آثار.
echo "این کار می کند: ". $arr [ "foo" ][ 3 ];

اکو "این هم کار می کند:( $obj -> مقادیر [ 3 ]-> name ) " ;

اکو "این مقدار متغیر نامگذاری شده است$name : ($( $name )) " ;

اکو این مقدار نام متغیری است که getName() برمی گرداند:($( getName ())) " ;

اکو این مقدار متغیر بر اساس نام است که \$object->getName() برمی گرداند:($( $object -> getName ())) " ;

// کار نمی کند، خروجی ها: این همان چیزی است که getName() برمی گرداند: (getName())
اکو "این چیزی است که getName() برمی گرداند: (getName())";
?>

همچنین با استفاده از این نحو امکان دسترسی به خصوصیات شی در رشته ها وجود دارد.

غذای کلاس (
var $bar = "من نوار هستم." ;
}

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

نتیجه اجرای این مثال:

من بار هستم من بار هستم

اظهار نظر:

توابع، فراخوانی متدها، متغیرهای کلاس ایستا و ثابت های کلاس به صورت داخلی کار می کنند {$} ، با PHP 5 شروع می شود. با این حال، مقدار ارائه شده به عنوان یک نام متغیر در زمینه خطی که در آن تعریف شده است، در نظر گرفته می شود. استفاده از بریس های مجعد منفرد ( {} ) برای دسترسی به مقادیر توابع، متدها، ثابت های کلاس یا متغیرهای کلاس ایستا کار نخواهد کرد.

// نمایش همه خطاها
error_reporting (E_ALL);

آبجوهای کلاس (
const softdrink = "rootbeer" ;
public static $ale = "ipa" ;
}

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

// این کار می کند، خروجی می دهد: من A & W را می خواهم
echo "I'd like ($( beers :: softdrink )) \n" ;

// این نیز کار می کند، خروجی: من الکساندر کیث را می خواهم
echo "I'd like ($( beers :: $ale )) \n" ;
?>

دسترسی و تغییر یک کاراکتر در یک رشته

نویسه‌های رشته‌ها را می‌توان با مشخص کردن افست آنها از ابتدای رشته، با شروع از صفر، در براکت‌های مربع بعد از رشته، به عنوان مثال، $str استفاده کرد و تغییر داد. رشته ای را برای این منظور به عنوان آرایه ای از کاراکترها در نظر بگیرید. اگر نیاز به دریافت یا جایگزینی بیش از 1 کاراکتر دارید، می توانید از توابع استفاده کنید substr()و substr_replace().

اظهار نظر: یک کاراکتر در یک رشته همچنین با استفاده از پرانتزهای فرفری قابل دسترسی است، برای مثال $str(42).

توجه

تلاش برای نوشتن به یک افست فراتر از مرزهای خط، رشته را با فاصله تا آن افست پر می کند. انواع غیر صحیح به انواع صحیح تبدیل می شوند. نوع افست اشتباه باعث خطای سطح می شود E_NOTICE. نوشتن با افست منفی باعث خطای سطح می شود E_NOTICEو پس از خواندن، یک رشته خالی برمی گرداند. فقط اولین کاراکتر رشته اختصاص داده شده استفاده می شود. تخصیص به یک رشته خالی یک بایت تهی (NULL) اختصاص می دهد.

توجه

رشته ها در PHP آرایه های داخلی از بایت ها هستند. در نتیجه، دسترسی یا اصلاح یک رشته در یک افست، رمزگذاری چند بایتی ایمن نیست و فقط باید با رشته‌هایی در کدگذاری‌های تک بایتی، مانند 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، offset در رشته باید به صورت یک عدد صحیح یا یک رشته حاوی ارقام مشخص شود، در غیر این صورت یک هشدار صادر خواهد شد. قبلاً توسط رشته ای مانند افست داده شده بود "فو"، بدون هشدار به تبدیل شد 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:

رشته (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) اخطار: تعدیل رشته غیرقانونی "1.0" در /tmp/t.php در خط 7 رشته (1) "b" bool(false) هشدار: رشته غیرقانونی افست "x" در / tmp/t.php در خط 9 رشته (1) "a" bool(false) string(1) "b" bool(false)

اظهار نظر:

تلاش برای دسترسی به متغیرهای انواع دیگر (به استثنای آرایه ها یا اشیایی که رابط های خاصی را پیاده سازی می کنند) با استفاده از یا {} بی صدا باز خواهد گشت خالی.

اظهار نظر:

PHP 5.5 پشتیبانی از دسترسی به کاراکترها را با استفاده از نحو اضافه کرد یا {} .

توابع مفید زیادی برای اصلاح رشته ها وجود دارد.

توابع پایه در بخش توابع رشته و برای جستجوی پیشرفته و جایگزینی، عبارت منظم یا توابع عبارت منظم سازگار با Perl توضیح داده شده است.

تبدیل به رشته

مقدار را می توان با استفاده از قالب به رشته تبدیل کرد (رشته)، یا توابع strval(). در عباراتی که رشته مورد نیاز است، تبدیل به صورت خودکار انجام می شود. وقتی از توابع استفاده می کنید این اتفاق می افتد اکویا چاپ، یا زمانی که مقدار یک متغیر با یک رشته مقایسه می شود. خواندن بخش‌های انواع و نوع دستکاری راهنما، موارد زیر را واضح‌تر می‌کند. همچنین ببینید settype().

آرایه ها همیشه به رشته تبدیل می شوند "آرایه"، بنابراین نمی توانید محتویات آرایه را نمایش دهید ( آرایه)، استفاده كردن اکویا چاپتا ببینیم چه چیزی در آن وجود دارد. برای مشاهده یک عنصر، از چیزی مانند استفاده کنید echo $arr["foo"]. برای نکاتی در مورد نحوه نمایش/مشاهده همه محتوا به زیر مراجعه کنید.

اشیاء در PHP 4 همیشه به یک رشته تبدیل می شدند "هدف - شی". اگر می خواهید مقادیر فیلدهای یک شی را نمایش دهید ( هدف - شی) برای اهداف اشکال زدایی، ادامه مطلب را بخوانید. اگر می خواهید نام کلاس شی مورد نیاز را بدست آورید، استفاده کنید get_class(). از زمان PHP 5، متد __toString نیز در دسترس قرار گرفته است.

خالیهمیشه به رشته خالی تبدیل می شود.

همانطور که در بالا می بینید، تبدیل مستقیم آرایه ها، اشیا یا منابع به یک رشته، هیچ اطلاعات مفیدی در مورد خود مقادیر به جز انواع آنها ارائه نمی دهد. یک راه بهتر برای خروجی مقادیر برای اشکال زدایی استفاده از توابع است print_r()و var_dump().

اکثر مقادیر در PHP را می توان به یک رشته برای ذخیره سازی دائمی تبدیل کرد. این روش سریال سازی نامیده می شود و با استفاده از تابع قابل انجام است serialize(). علاوه بر این، اگر نصب 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 Little Piggies" ; // $foo یک شناور است (14.2)
$foo = "10.0 pigs " + 1 ; // $foo شناور است (11)
$foo = "10.0 pigs " + 1.0 ; // $foo شناور است (11)
?>

بیشتر اطلاعات دقیقبرای اطلاعات در مورد این تبدیل، به بخش strtod(3) در مستندات یونیکس مراجعه کنید.

اگر می خواهید هر یک از مثال های این بخش را تست کنید، آن و خط زیر را کپی و پیست کنید تا ببینید چه اتفاقی می افتد:

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

انتظار نداشته باشید که کد یک کاراکتر را با تبدیل آن به یک عدد صحیح دریافت کنید (همانطور که برای مثال در C انجام می شود). برای تبدیل کاراکترها به کدهای اسکی و برگشت آنها، از توابع استفاده کنید ord()و chr().

جزئیات اجرای نوع رشته

نوع رشته ( رشته) در PHP به صورت آرایه ای از بایت ها و یک عدد صحیح حاوی طول بافر پیاده سازی می شود. هیچ اطلاعاتی در مورد نحوه تبدیل این بایت ها به کاراکتر ندارد و این کار را به برنامه نویس واگذار می کند. هیچ محدودیتی برای محتوای یک رشته، مانند یک بایت با مقدار وجود ندارد 0 (بایت "NUL") را می توان در هر جایی قرار داد (اما، توجه داشته باشید که برخی از توابع، همانطور که در این راهنما بیان شده است، "ایمن باینری" نیستند، یعنی می توانند رشته هایی را به کتابخانه هایی منتقل کنند که داده های پس از NUL -byte را نادیده می گیرند).

این ماهیت نوع رشته توضیح می دهد که چرا PHP یک نوع "بایت" جداگانه ندارد - رشته ها این نقش را بازی می کنند. توابعی که داده‌های غیر متنی را برمی‌گردانند - برای مثال، یک جریان داده دلخواه که از سوکت شبکه خوانده می‌شود - همچنان رشته‌ها را برمی‌گردانند.

با توجه به این واقعیت که PHP رمزگذاری خاصی را برای رشته ها دیکته نمی کند، ممکن است بپرسید که چگونه literals رشته ها رمزگذاری می شوند. مثلا خط "á" معادل "\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 فعال باشد) دارای محدودیت‌هایی است: رمزگذاری تقریباً همیشه باید یک ابر مجموعه ASCII باشد، مانند UTF-8 یا ISO-8859-1. همچنین توجه داشته باشید که رمزگذاری های وابسته به حالت، که در آن مقادیر بایت یکسان در حالت تغییر اولیه و غیر اولیه استفاده می شود، می تواند مشکلاتی ایجاد کند.

البته، برای مفید بودن، توابع رشته باید فرضیاتی در مورد رمزگذاری رشته داشته باشند. متأسفانه، در میان توابع PHP رویکردهای بسیار متنوعی برای این موضوع وجود دارد:

  • برخی از توابع فرض می‌کنند که رشته در کدگذاری تک بایتی کدگذاری شده است، اما برای درست کار کردن، نیازی به تفسیر بایت‌ها به عنوان کاراکترهای خاص ندارند. این دسته برای مثال شامل substr(), strpos(), strlen()و strcmp(). راه دیگری برای تفکر در مورد این توابع این است که آنها بر روی بافرهای حافظه کار می کنند، به عنوان مثال. آنها مستقیماً با بایت ها و افست های آنها کار می کنند. جبران می کند.
  • توابع دیگر انتظار دارند که یک رمزگذاری به عنوان یک پارامتر ارسال شود، شاید اگر یک پارامتر رمزگذاری مشخص نشده باشد، مقداری کدگذاری پیش‌فرض را فرض کنیم. این تابع است
  • در نهایت، توابعی وجود دارند که فرض می کنند یک رشته از یک رمزگذاری خاص، معمولاً UTF-8 استفاده می کند. اکثر توابع از پسوندهای intl و PCRE در اینجا قرار می گیرند (در مورد دوم، فقط هنگام تعیین اصلاح کننده تو). اگرچه این کار به عمد انجام می شود، عملکرد utf8_decode()به معنای رمزگذاری UTF-8 و utf8_encode()- ISO-8859-1.

در نهایت، نوشتن برنامه‌های صحیحی که با یونیکد کار می‌کنند به این معنی است که از توابعی که با یونیکد کار نمی‌کنند و احتمالاً داده‌ها را خراب می‌کنند، با دقت اجتناب کنید و به جای آن از توابع معتبر معمولاً از پسوندهای intl و mbstring استفاده کنید. با این حال، استفاده از توابع با قابلیت یونیکد شروع خوبی است. صرف نظر از ویژگی هایی که یک زبان ارائه می دهد، لازم است مشخصات یونیکد را بدانید. برای مثال، اگر برنامه ای فرض کند که فقط حروف کوچک و بزرگ در یک زبان وجود دارد، اشتباه بزرگی مرتکب شده است.

از چه نوع نقل قول هایی برای قالب بندی رشته ها استفاده کنم - آپوستروف یا نقل قول های کلاسیک دوبل؟

بیایید به تفاوت بین نقل قول های دوگانه و تک در PHP نگاهی بیندازیم و از مثال هایی استفاده کنیم تا بفهمیم چه زمانی از کدام یک استفاده کنیم.

متغیرها و دنباله‌های فرار برای کاراکترهای خاص موجود در رشته‌های محصور شده در گیومه‌های تکی پردازش نمی‌شوند. رشته های احاطه شده با آپوستروف ها بسیار سریع تر از رشته های مشابه احاطه شده توسط مفسر PHP پردازش می شوند.

دلیل در اینجا ساده است: مفسر PHP علاوه بر این، رشته‌ها را در گیومه‌های دوگانه برای وجود متغیرها بررسی می‌کند، و اگر آنها پیدا شوند، به جای نام متغیر، مقدار آن در رشته درج می‌شود. اما یک خط محصور در آپاستروف توسط مفسر به عنوان متن معمولی درک می شود و PHP هیچ تغییری در این خطوط انجام نمی دهد. من فکر می کنم واضح است که پردازش رشته ها در گیومه های تکی در هر صورت سریعتر خواهد بود.

ابتدا، بیایید نحوه تعریف رشته را شرح دهیم، و سپس بررسی کنیم که پردازش رشته ها در گیومه های تکی چقدر سریعتر خواهد بود.

ساده ترین راه برای تعریف یک رشته، محصور کردن آن در گیومه های تکی (") است. برای استفاده از گیومه های تک در یک رشته تک گیومه، باید قبل از آنها یک بک اسلش (\)، یعنی خارج شده باشد. اگر علامت بک باید بیاید. قبل از یک نقل قول یا در انتهای خط، باید آن را کپی کنید. اگر سعی کنید از هر کاراکتر دیگری فرار کنید، اسلش نیز چاپ خواهد شد.

در اینجا نمونه ای از استفاده از نقل قول های تک آورده شده است:
// خروجی: رشته ساده
پژواک "رشته ساده"؛
// چاپ می کند: من اینجا هستم
پژواک "من اینجا هستم"؛
// خروجی: این درج نخواهد شد: \n خط جدید
echo "این درج نمی شود:\nnewline";
// خروجی ها: متغیر $example نیز جایگزین نخواهد شد
echo "متغیر $example نیز جایگزین نخواهد شد"; اگر رشته در دو گیومه (") محصور شود، PHP تشخیص می دهد مقدار زیاددنباله ها را برای کاراکترهای خاص کنترل می کند و همچنین مقدار آن را به جای نام متغیر در رشته جایگزین می کند. درست مانند نقل قول‌های تکی، برای استفاده از گیومه‌های دوتایی در یک رشته دو نقل قول، باید قبل از آنها یک کاراکتر بک اسلش (\) قرار گیرد.

در اینجا مثالی از استفاده از دو نقل قول آورده شده است:
// خروجی: رشته ساده
پژواک "رشته ساده"؛
// خروجی ها: شرکت "Snowdrop"
echo "Company \"Snowdrop\"";
// خروجی: این منجر به یک خط جدید می شود
echo "این به یک خط جدید تبدیل می شود \n";
// خروجی: متغیر جایگزین خواهد شد
$example = "جایگزین خواهد شد";
echo "متغیر $example"; همچنین باید به خاطر داشت که دنباله "\n" ( خط جدید)، "\r" (بازگشت حمل) برای متن ساده، نه HTML. بنابراین شما تغییراتی را در مرورگر (فقط در کد منبعصفحات).

بیایید بفهمیم که نقل قول های تکی چقدر سریعتر از نقل قول های دوگانه هستند. برای اندازه گیری ها، یک اسکریپت تست کوتاه می نویسیم و بلافاصله متذکر می شویم که اگر خودتان آن را تست کنید، نتایجی که به سخت افزار رایانه شخصی یا سرور شما بستگی دارد، متفاوت خواهد بود.
// مهر زمانی را در ابتدای حلقه برگردانید
$start = microtime(true);
// یک حلقه برای 1 میلیون تکرار ایجاد کنید
برای ($i = 0؛ $i< 1000000; $i++) {
$text = "اینجا یک رشته کاراکتر است";
}
// زمان صرف شده را محاسبه کنید
$time = (microtime(true) - $start); نتیجه: 0.09 ثانیه

اگر گیومه های تکی را با نقل قول های دوگانه جایگزین کنیم:
$text = "اینجا یک رشته کاراکتر است"; نتیجه 0.10 ثانیه خواهد بود.

همانطور که می بینید، هنگام استفاده از رشته های متنی، تفاوت در زمان اجرا بسیار کم است، حتی می توان گفت که اصلا وجود ندارد. سرگرمی زمانی شروع می شود که ما سعی می کنیم یک رشته و یک متغیر را ترکیب کنیم.
$text = "اینجا رشته کاراکتر $i است"; یا
$text = $i."اینجا یک رشته کاراکتر است"; نتیجه تقریبا: 0.27 ثانیه

تفاوت کاملا محسوس است. هنگامی که متغیرها به رشته اضافه می شوند، الحاق و دو نقل قول به وضوح بر عملکرد تأثیر می گذارد.

هنگامی که سرور کد را پردازش می کند، تمام محتویات دو نقل قول را برای متغیرها، ثابت ها و موارد دیگر بررسی می کند. طول می کشد. و سرور آنچه را که بین نقل قول ها قرار دارد به عنوان متن آماده پردازش می کند و اهمیتی نمی دهد که چه چیزی وجود دارد. تفاوت بین عملکرد نقل‌قول‌های تک و مضاعف بسیار کم است، اما اگر در حال توسعه یک پروژه با بارگذاری بالا هستید، چند میلی‌ثانیه ذخیره‌شده در حال حاضر یک پیروزی است.