دو نقل قول در php. تفاوت بین رشته های تک و دوگانه در PHP چیست؟ php فرار از نقل قول
این مقاله کوتاه به شما نشان می دهد که چگونه و کجا از آن استفاده کنید نقل قول در 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 بسیار سریعتر از رشته های مشابه احاطه شده توسط دو نقل قول پردازش می شوند.
دلیل این امر ساده است: رشته های موجود در گیومه های دوگانه علاوه بر این توسط مفسر PHP برای وجود متغیرها بررسی می شوند و در صورت وجود متغیرها، مقدار آن به جای نام متغیر در رشته درج می شود. اما رشته محصور شده در آپوستروف ها توسط مفسر به عنوان متن ساده درک می شود و PHP هیچ تغییری در این رشته ها انجام نمی دهد. فکر میکنم واضح است که پردازش رشتهها در گیومهها سریعتر خواهد بود.
برای شروع، نحوه تعریف رشته را شرح خواهیم داد و سپس بررسی خواهیم کرد که پردازش رشته ها در گیومه های تکی چقدر سریعتر خواهد بود.
ساده ترین راه برای تعریف رشته، محصور کردن آن در گیومه های تکی (") است. برای استفاده از گیومه های تکی در داخل رشته ای که در گیومه های تکی قرار گرفته اند، باید قبل از آنها یک کاراکتر بک اسلش (\)، یعنی escape شده باشد. اسلش باید قبل از یک نقل قول باشد یا در انتهای رشته باشد، باید آن را کپی کنید.
در اینجا نمونه ای از استفاده از نقل قول های تک آمده است:
// خروجی: یک رشته ساده
پژواک "رشته ساده"؛
// خروجی: من اینجا هستم
پژواک "من اینجا هستم"؛
// خروجی: این درج نخواهد شد: \n خط جدید
echo "این درج نمی شود: \n خط جدید";
// خروجی: متغیر $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 ثانیه
تفاوت بسیار محسوس است. اگر متغیرها به رشته اضافه شوند، الحاق و نقلقولهای دوگانه به وضوح بر عملکرد تأثیر میگذارند.
هنگامی که سرور کد را پردازش می کند، کل محتوای نقل قول های دوگانه را برای متغیرها، ثابت ها و موارد دیگر بررسی می کند. طول می کشد. و آنچه بین نقل قول ها قرار دارد توسط سرور به عنوان متن آماده پردازش می شود و برای آن مهم نیست که چه چیزی وجود دارد. تفاوت بین عملکرد نقلقولهای تک و مضاعف بسیار کم است، اما اگر در حال توسعه یک پروژه با بارگذاری بالا هستید، چند میلیثانیه ذخیرهشده در حال حاضر یک پیروزی است.
رشته در PHP مجموعه ای از کاراکترها با هر طولی است. بر خلاف C، رشته ها همچنین می توانند دارای کاراکترهای تهی باشند که به هیچ وجه بر برنامه تأثیر نمی گذارد. به عبارت دیگر می توان از رشته ها برای ذخیره داده های باینری استفاده کرد. طول رشته فقط با مقدار RAM آزاد محدود می شود.
در PHP یک کاراکتر همان بایت است، یعنی دقیقا ۲۵۶ کاراکتر مختلف امکان پذیر است. این همچنین به این معنی است که PHP پشتیبانی داخلی یونیکد ندارد. برخی از پشتیبانی از یونیکد توسط توابع ارائه می شود utf8_encode()و utf8_decode() .
یک رشته را می توان به راحتی با استفاده از توابع استاندارد پردازش کرد و همچنین می توان به هر کاراکتری در آن به طور مستقیم دسترسی داشت.
یک مثال ساده از یک متغیر رشته:
$a= "این فقط متنی است که روی یک متغیر رشته ای نوشته شده است";
echo $a; //خروجی "این فقط متنی است که روی یک متغیر رشته ای نوشته شده است"
?>
حال بیایید نگاهی دقیق تر به نحو نوع داده بیندازیم. رشته.
نحو نوع رشته (رشته)
یک رشته را می توان به سه روش مختلف تعریف کرد.
ساده ترین راه برای تعریف رشته این است که آن را در گیومه های تکی (نماد " ).
برای استفاده از یک نقل قول در یک رشته، مانند بسیاری از زبان های دیگر، باید قبل از آن یک کاراکتر بک اسلش ( \ ) یعنی از آن محافظت کنید. اگر بک اسلش باید قبل از یک نقل قول باشد یا در انتهای یک رشته باشد، باید آن را کپی کنید. توجه داشته باشید که اگر بخواهید از هر شخصیت دیگری فرار کنید، بک اسلش نیز چاپ می شود! بنابراین به طور کلی نیازی به فرار از بک اسلش نیست.
برخلاف دو نحو دیگر، دنبالههای متغیر و فرار برای کاراکترهای خاص در رشتههای محصور در نهفرآوری شده.
در اینجا نمونه ای از استفاده از نقل قول های تک آمده است:
اکو "این یک رشته ساده است";
اکو "همچنین، می توانید در خطوط وارد کنید
شخصیت خط جدید مانند این
چون اشکالی نداره";
// خروجی: یک روز آرنولد گفت: "من برمی گردم"
اکو "یک روز آرنولد گفت "من برمی گردم";
اکو "C:\\*.* را حذف کردی؟";
// خروجی: C:\*.* را حذف کردید؟
echo "C:\*.* را حذف کردی؟" ;
// خروجی: این درج نخواهد شد: \n خط جدید
اکو "این درج نمی شود: \n خط جدید";
// خروجی: متغیرهای $expand نیز جایگزین $ نمیشوند
اکو "متغیرهای $expand نیز جایگزین $یا نیستند";
?>
اگر رشته در دو گیومه قرار گیرد ( " ) PHP توالی های فرار بیشتری را برای کاراکترهای خاص تشخیص می دهد:
جدول فرار:
دنباله | معنی |
---|---|
\n | خط جدید (LF یا 0x0A (10) در ASCII) |
\r | برگشت بار (CR یا 0x0D (13) در ASCII) |
\ t | زبانه افقی (HT یا 0x09 (9) در ASCII) |
\\ | بک اسلش |
\$ | علامت دلار |
\" | نقل قول دوگانه |
\{1,3} | دنباله ای از کاراکترها که با یک عبارت منظم، یک کاراکتر در هشتی مطابقت دارد |
\x(1،2) | دنباله ای از کاراکترها مطابق با عبارت منظم، کاراکتر هگزادسیمال |
باز هم اگر بخواهید هر شخصیت دیگری را یادداشت کنید، بک اسلش نیز چاپ می شود!
راه دیگر برای تعریف رشته ها استفاده از آن است هردوک- نحو ("<<< "). بعد از<<< необходимо указать идентификатор, затем идет строка, а потом этот же идентификатор, закрывающий вставку.
شناسه بسته شدن باید از ستون اول سطر شروع شود. علاوه بر این، شناسه باید از قوانین نامگذاری مشابهی مانند سایر تگهای PHP پیروی کند: فقط شامل نویسههای الفبای عددی و زیرخط باشد و باید با یک غیر رقمی یا زیرخط شروع شود.
توجه! توجه به این نکته بسیار مهم است که رشته با شناسه بسته شدن هیچ کاراکتر دیگری به جز یک نقطه ویرگول ( ; ). این به این معنی است که یک شناسه است و هیچ فاصله یا برگه ای قبل یا بعد از نقطه ویرگول وجود ندارد. همچنین درک این نکته مهم است که اولین کاراکتر قبل از شناسه بسته شدن باید یک کاراکتر خط جدید باشد، همانطور که توسط سیستم عامل شما تعریف شده است. به عنوان مثال، در Windows® این است \r.
اگر این قاعده نقض شود و شناسه بسته کننده "تمیز" نباشد، در نظر گرفته می شود که شناسه بسته کننده وجود ندارد و PHP به جستجوی آن ادامه می دهد. اگر در این حالت، شناسه بستن صحیح هرگز پیدا نشد، باعث خطای پردازش با شماره خط در انتهای اسکریپت می شود.
هردوک-text مانند یک رشته دو نقل قول بدون داشتن آنها رفتار می کند. این بدان معنی است که شما نیازی به فرار از نقل قول در heredoc ندارید، اما همچنان می توانید از دنباله های فرار بالا استفاده کنید. متغیرها کنترل می شوند، اما باید در هنگام استفاده از متغیرهای پیچیده در داخل هردوک مانند زمانی که با رشته ها کار می کنید، مراقب باشید.
مثال تعریف رشته هردوک:
$str =<<
شامل خطوط متعدد
با استفاده از نحو هردوک
EOD;
/* مثال پیچیده تر با متغیرها. */
غذای کلاس
{
var $foo ;
var $bar ;
functionfoo()
{
$this -> foo = "foo" ;
$this -> bar = array("Bar1" , "Bar2" , "Bar3" );
}
}
$foo = newfoo();
$name = "MyName" ;
اکو<<
الان دارم بیرون میارم($foo -> نوار [ 1 ]) .
این باید یک خروجی "A" بزرگ داشته باشد:\x41
EOT;
?>
من در برنامه نویسی PHP متخصص نیستم، اما کمی گیج هستم که چرا برخی از کدها را در PHP می بینم که رشته ای در گیومه های تکی و گاهی اوقات دوتایی محصور شده است.
من فقط می دانم که در زبان دات نت یا سی، اگر به صورت نقل قول باشد به این معنی است که یک کاراکتر است و نه رشته.
راه حل
آنچه شما باید بدانید
$a = "نام"; $b = "my$a"; == "نام من" $c = "$a من"; != "نام من"
در PHP، افراد برای تعریف رشته ثابت مانند "a"، "my name"، "abc xyz" از کوتیشنهای منفرد استفاده میکنند، در حالی که از دو کوتیشن برای تعریف رشتهای حاوی شناسهای مانند "a $b $c $d" استفاده میکنند.
و یه چیز دیگه
پژواک "نام من"؛
سریعتر از
پژواک "نام من"؛
پژواک "من" . $a;
کندتر از
echo "my $a";
این برای رشته های دیگر در حال استفاده صادق است.
در PHP، متن در گیومه های تک به عنوان یک مقدار رشته در نظر گرفته می شود، در حالی که متن در کوتیشن های دوگانه، متغیرها را با جایگزینی و پردازش مقدار آنها تجزیه می کند.
$test = "متغیر"; echo "Hello Mr $test"; // خروجی این خواهد بود: Hello Mr متغییر echo "Hello Mr $test"; // خروجی این خواهد بود: سلام آقای $test
در اینجا نقل قول دوگانه مقدار را تجزیه می کند و نقل قول واحد به عنوان یک مقدار رشته در نظر گرفته می شود (بدون تجزیه متغیر $test).
هر دو نوع کاراکتر تودرتو رشته هستند. استفاده از یک نوع نقل قول برای نتیجه گیری نوع دیگری از نقل قول راحت است. """ و """. بزرگترین تفاوت بین انواع نقل قول این است که مراجع شناسه تودرتو در داخل گیومههای دوتایی جایگزین میشوند، نه درون گیومههای تکی.
رشته مجموعه ای از کاراکترها است. در PHP یک کاراکتر همان بایت است، یعنی دقیقا ۲۵۶ کاراکتر مختلف امکان پذیر است. این همچنین به این معنی است که PHP پشتیبانی یونیکد بومی ندارد.برخی پشتیبانی از یونیکد توسط توابع utf8_encode() و utf8_decode() ارائه می شود.
نکته: اگر رشته خیلی بزرگ باشد مشکلی وجود ندارد. عملا هیچ محدودیتی در اندازه رشته ها اعمال شده توسط PHP وجود ندارد، بنابراین هیچ دلیلی برای نگرانی در مورد طول آنها وجود ندارد.
نحو
- یک رشته را می توان به سه روش مختلف تعریف کرد.
نقل قول های تک
ساده ترین راه برای تعریف رشته این است که آن را در گیومه های تکی (کاراکتر ") قرار دهید.
برای استفاده از یک نقل قول منفرد در یک رشته، مانند بسیاری از زبانهای دیگر، باید قبل از آن یک کاراکتر بک اسلش (\)، یعنی escaped باشد. اگر بک اسلش باید قبل از یک نقل قول باشد یا در انتهای یک رشته باشد، باید آن را کپی کنید. توجه داشته باشید که اگر بخواهید از هر شخصیت دیگری فرار کنید، بک اسلش نیز چاپ می شود! بنابراین به طور کلی نیازی به فرار از بک اسلش نیست.
توجه: در PHP 3، یک پیام سطح E_NOTICE در این مورد صادر می شود.
توجه: بر خلاف دو نحو دیگر، متغیرها و دنبالههای فرار برای کاراکترهای خاص که در رشتههای نقلقولی تکی وجود دارند پردازش نمیشوند.
echo "این یک رشته ساده است"؛ echo "شما همچنین می توانید خطوط جدید را در رشته هایی مانند این وارد کنید، زیرا خوب است"; // خروجی: یک روز آرنولد گفت "من برمی گردم" پژواک "یک روز آرنولد گفت "من برمی گردم""; // خروجی: C:\*.* را حذف کردید؟ echo "آیا C:\\*.* را حذف کردید؟" // خروجی: C:\*.* را حذف کردید؟ echo "آیا C:\*.* را حذف کردید؟"; // خروجی: این درج نخواهد شد: \n a newline echo "This will not insert: \n a newline"; // خروجی: متغیرهای $expand نیز برای $either جایگزین نمیشوند.
نقل قول های دوگانه
اگر رشته در دو گیومه (") محصور شود، PHP دنباله های فرار بیشتری را برای کاراکترهای خاص تشخیص می دهد:
جدول 11-1. سکانس های فرار
باز هم اگر بخواهید هر شخصیت دیگری را یادداشت کنید، بک اسلش نیز چاپ می شود!
اما مهمترین ویژگی رشتههای مضاعف، مدیریت متغیر است. برای جزئیات بیشتر به String Handling مراجعه کنید.
هردوک
راه دیگر برای تعریف رشته ها استفاده از نحو heredoc است ("
شناسه بسته شدن باید از ستون اول سطر شروع شود. علاوه بر این، شناسه باید از قوانین نامگذاری مشابهی مانند سایر تگهای PHP پیروی کند: فقط شامل نویسههای الفبای عددی و زیرخط باشد و باید با یک غیر رقمی یا زیرخط شروع شود.
توجه
توجه به این نکته بسیار مهم است که رشته با شناسه بسته شدن هیچ کاراکتر دیگری به استثنای نقطه ویرگول (;) ندارد. این به این معنی است که شناسه نباید تورفتگی داشته باشد و قبل یا بعد از نقطه ویرگول نمی تواند هیچ فاصله یا تبی وجود داشته باشد. همچنین درک این نکته مهم است که اولین کاراکتر قبل از شناسه بسته شدن باید یک کاراکتر خط جدید باشد، همانطور که توسط سیستم عامل شما تعریف شده است. برای مثال، در مکینتاش \r است.
اگر این قاعده نقض شود و شناسه بسته کننده "تمیز" نباشد، در نظر گرفته می شود که شناسه بسته کننده وجود ندارد و PHP به جستجوی آن ادامه می دهد. اگر در این حالت، شناسه بستن صحیح هرگز پیدا نشد، باعث خطای پردازش با شماره خط در انتهای اسکریپت می شود.
متن Heredoc مانند یک رشته دو نقل قول بدون داشتن آنها رفتار می کند. این بدان معنی است که شما نیازی به فرار از نقل قول در heredoc ندارید، اما همچنان می توانید از دنباله های فرار بالا استفاده کنید. متغیرها کنترل می شوند، اما باید در هنگام استفاده از متغیرهای پیچیده در داخل هردوک مانند زمانی که با رشته ها کار می کنید، مراقب باشید.
مثال 11-2. مثال تعریف رشته Heredoc
$str =<<
توجه: پشتیبانی heredoc در PHP 4 اضافه شده است.
پردازش متغیرها
اگر رشته ای در دو گیومه یا با هردوک تعریف شود، متغیرهای داخل آن پردازش می شوند.
دو نوع نحو وجود دارد: ساده و پیچیده. نحو ساده ساده تر و راحت تر است. به شما امکان می دهد یک متغیر، یک مقدار آرایه (آرایه) یا یک ویژگی شی (شیء) را پردازش کنید.
سینتکس پیچیده در PHP 4 معرفی شد و می توان آن را با پرانتزهای فرفری اطراف عبارت تشخیص داد.
نحو ساده
اگر مفسر با علامت دلار ($) روبرو شود، تا آنجایی که ممکن است کاراکترها را جمعآوری میکند تا یک نام متغیر معتبر تشکیل دهد. اگر می خواهید انتهای یک نام را مشخص کنید، نام متغیر را در پرانتزهای فرفری قرار دهید.
$beer = "Heineken"; echo "طعم $beer" عالی است"؛ // کار می کند، """ کاراکتر نامعتبر برای نام متغیر است echo "او مقداری $beers نوشید"; // کار نمی کند، "s" یک کاراکتر معتبر برای نام متغیر پژواک "او مقداری $(Beer)s نوشید" است. // works echo "او مقداری ($beer)s نوشید"; // آثار
به طور مشابه، یک عنصر از یک آرایه (آرایه) یا یک ویژگی از یک شی (ابجکت) می تواند پردازش شود. در شاخصهای آرایه، براکت بسته شدن (]) پایان تعریف شاخص را نشان میدهد. قوانین مشابهی برای ویژگی های شیء اعمال می شود که برای متغیرهای ساده، اگرچه هیچ ترفندی مانند متغیرها برای آنها وجود ندارد.
// این مثال ها به طور خاص در مورد استفاده از آرایه ها در داخل رشته های // هستند. خارج از رشته ها، همیشه کلیدهای رشته // آرایه خود را در گیومه قرار دهید و از خارج از رشته ها (پرانتز) استفاده نکنید. // بیایید همه خطاها را نشان دهیم error_reporting(E_ALL); $fruits = array("توت فرنگی" => "قرمز"، "موز" => "زرد"); // کار می کند، اما توجه داشته باشید که در خارج از پژواک رشته نقل قول "یک موز $fruits است." متفاوت عمل می کند. //Works echo "یک موز ($fruits["banana"]) است."; // کار می کند، اما PHP، همانطور که در زیر توضیح داده شده است، ابتدا // به دنبال ثابت موز است. echo "یک موز ($fruits) است."; // کار نمی کند، از بریس های فرفری استفاده کنید. این باعث خطای پردازش می شود. echo "یک موز $fruits["banana"] است."; // echo "یک موز است" کار می کند. $fruits["موز"] . "." // Works echo "این مربع $square->width متر پهن است."; // کار نمی کند. برای یک راه حل، نحو پیچیده را ببینید. echo "این مربع $square->width00 سانتی متر پهن است.";
برای هر چیز پیچیده تر، باید از نحو پیچیده استفاده کنید.
نحو پیچیده (فرفری).
پیچیده نامیده می شود نه به این دلیل که درک آن دشوار است، بلکه به این دلیل که اجازه استفاده از عبارات پیچیده را می دهد.
در واقع، شما می توانید هر مقدار فضای نامی را در یک خط با این نحو وارد کنید. شما به سادگی عبارت را به همان روشی که خارج از رشته مینویسید بنویسید و سپس آن را در (و) بپیچید. از آنجایی که شما نمی توانید از "(") فرار کنید، این نحو فقط زمانی شناسایی می شود که $ بلافاصله (. (. از "(\$" یا "\($" برای نمایش "($") استفاده کنید). چند مثال گویا:
// بیایید همه خطاها را نشان دهیم error_reporting(E_ALL); $great = "فوق العاده"; // کار نمیکند، خروجیها: این (فانتستیک) پژواک است "This is ($great)"; // کار می کند، خروجی ها: این پژواک فوق العاده است "This is ($great)"; echo "این $(عالی است)"؛ // Works echo "این مربع ($square->width) 00 سانتی متر عرض دارد."; // Works echo "This works: ($arr)"; // این اشتباه است به همان دلیل که $foo خارج از // خط اشتباه است. به عبارت دیگر، این باز هم // کار می کند، اما چون PHP ابتدا به دنبال ثابت foo می گردد، خطای سطح // E_NOTICE (ثابت تعریف نشده) را ایجاد می کند. echo "این اشتباه است: ($arr)"; // آثار. هنگام استفاده از آرایه های چند بعدی، همیشه از مهاربندهای فرفری در داخل // رشته ها echo استفاده کنید "This works: ($arr["foo"])"; // آثار. echo "این کار می کند: ". $arr["foo"]; echo "شما حتی می توانید بنویسید ($obj->values->name)"; echo "این مقدار متغیری به نام $name: ($($name)) است";
دسترسی به یک کاراکتر در یک رشته و تغییر آن
کاراکترهای رشتهها را میتوان با تعیین افست آنها از ابتدای رشته، که از صفر شروع میشود، در پرانتزهای فرفری بعد از رشته استفاده کرد و تغییر داد.
توجه: برای سازگاری با عقب، همچنان میتوانید از براکتهای آرایه برای همان هدف استفاده کنید. با این حال، از PHP 4 این نحو منسوخ شده است.
مثال 11-3. چند مثال رشته ای
// اولین کاراکتر رشته را دریافت کنید $str = "این یک تست است."; $first = $str(0); // کاراکتر سوم رشته را دریافت کنید $third = $str(2); // آخرین کاراکتر رشته را دریافت کنید $str = "این هنوز یک آزمایش است."; $last = $str(strlen($str)-1); // آخرین کاراکتر رشته را تغییر دهید $str = "به دریا نگاه کنید"; $str(strlen($str)-1) = "من";
توابع و اپراتورهای مفید
رشته ها را می توان با استفاده از "." به هم متصل کرد. (نقطه). توجه داشته باشید که عملگر جمع "+" در اینجا کار نمی کند. برای اطلاعات بیشتر به موضوع String Operators مراجعه کنید.
توابع مفید زیادی برای اصلاح رشته ها وجود دارد.
توابع اصلی در بخش توابع رشته، توابع عبارت منظم برای جستجوی پیشرفته و جایگزینی (در دو بخش: Perl و POSIX توسعه یافته) توضیح داده شده است.
همچنین توابعی برای رشته های URL و توابعی برای رمزگذاری/رمزگشایی رشته ها (mcrypt و mhash) وجود دارد.
در نهایت، اگر هنوز چیزی را که به دنبال آن هستید پیدا نکردهاید، به توابع نوع کاراکتر نیز مراجعه کنید.
تبدیل به رشته
با استفاده از cast (string) یا تابع strval() می توانید یک مقدار را به رشته تبدیل کنید. در عباراتی که رشته مورد نیاز است، تبدیل به صورت خودکار انجام می شود. این زمانی اتفاق می افتد که از توابع echo() یا print() استفاده می کنید یا زمانی که مقدار یک متغیر را با یک رشته مقایسه می کنید. خواندن بخشهای Types و Type Manipulation کتابچه راهنمای کاربر، موارد زیر را واضحتر میکند. همچنین settype() را ببینید.
مقدار بولی TRUE به رشته "1" تبدیل می شود و مقدار FALSE به صورت "" (رشته خالی) نمایش داده می شود. به این ترتیب، می توانید مقادیر را در هر دو جهت تبدیل کنید - از نوع بولی به نوع رشته ای و بالعکس.
یک عدد صحیح (عدد صحیح) یا یک عدد ممیز شناور (شناور) به رشته ای تبدیل می شود که با عددی متشکل از ارقام آن (شامل توان اعداد ممیز شناور) نمایش داده می شود.
آرایه ها همیشه به رشته "Array" تبدیل می شوند، بنابراین نمی توانید محتویات یک آرایه را با استفاده از echo() یا print() نمایش دهید تا بفهمید چه چیزی در آن وجود دارد. برای مشاهده یک عنصر، باید کاری مانند echo $arr["foo"] انجام دهید. برای نکاتی در مورد نحوه نمایش/مشاهده همه محتوا به زیر مراجعه کنید.
اشیاء همیشه به رشته "Object" تبدیل می شوند. اگر می خواهید مقدار متغیر عضو شی را برای اهداف اشکال زدایی چاپ کنید، پاراگراف های زیر را بخوانید. اگر می خواهید نام کلاس شی مورد نیاز را دریافت کنید، از get_class() استفاده کنید.
منابع همیشه به رشته هایی با ساختار "Resource id #1" تبدیل می شوند، جایی که 1 شماره منبع منحصر به فردی است که توسط PHP در زمان اجرا به آن اختصاص داده شده است. اگر می خواهید نوع منبع را دریافت کنید، از .
NULL همیشه به یک رشته خالی تبدیل می شود.
همانطور که در بالا می بینید، خروجی آرایه ها، اشیاء یا منابع اطلاعات مفیدی در مورد خود مقادیر در اختیار شما قرار نمی دهد. یک راه مناسب تر برای چاپ مقادیر برای اشکال زدایی استفاده از توابع print_r() و var_dump() است.
همچنین می توانید مقادیر PHP را به رشته هایی برای ذخیره سازی دائمی تبدیل کنید. این روش سریال سازی نامیده می شود و با تابع serialize() قابل انجام است. همچنین، اگر نصب PHP شما دارای پشتیبانی WDDX باشد، می توانید مقادیر PHP را در ساختارهای XML سریال کنید.
تبدیل رشته ها به اعداد
اگر رشته به عنوان یک مقدار عددی شناسایی شود، مقدار و نوع حاصل مطابق شکل زیر تعیین می شود.
اگر رشته ای حاوی هر یک از کاراکترهای "."، "e" یا "E" باشد، به عنوان یک شناور شناخته می شود. در غیر این صورت به عنوان یک عدد صحیح تعریف می شود.
مقدار توسط قسمت ابتدایی رشته تعیین می شود. اگر رشته با یک مقدار عددی معتبر شروع شود، از آن مقدار استفاده می شود. در غیر این صورت مقدار 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 Pigs کوچک"; // $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) مستندات یونیکس مراجعه کنید.
اگر می خواهید هر یک از مثال های این بخش را تست کنید، می توانید آن و خط زیر را کپی و جایگذاری کنید تا ببینید چه اتفاقی می افتد:
اکو "\$foo==$foo; نوع: " . gettype ($foo) . "
\n"؛
انتظار نداشته باشید که کد کاراکتر را با تبدیل آن به یک عدد صحیح دریافت کنید (همانطور که ممکن است برای مثال در C انجام دهید). برای تبدیل کاراکترها به کدها و برگشت آنها، از ord() and استفاده کنید