بررسی قواعد دستوری String بصورت جامع (مقاله)

پرسیده شده
فعالیت 1558 روز پیش
دیده شده 826 بار
0

در مقاله ی قبلی، در مورد نوع string صحبت کردیم.
حالا در این مقاله، کمی به جزئیات آن بپردازیم.

 

در PHP 7، برای طول یک string روی سیستم عامل 64 بیتی، محدودیتی در نظر گرفته نشده است. اما در سیستم عامل 32 بیتی و همچنین نسخه های قبلی، یک string تا حداکثر 2گیگابایت میتواند ذخیره شود.

 

بررسی قواعد گرامری:

1. یک string میتواند داخل single-quote قرار گیرد:

<?php
$string = 'این یک جمله ی تستی میباشد.';

 

* اعداد را میتوانید در قالب یک string تعریف کنید:

<?php
$string = '1396';
var_dump($string); // output: string '1396' (length=4)

 

* اگر نام متغیری را داخل single-quote قرار دهید، عیناً چاپ میشود و در نتیجه، مقدار آن چاپ نخواهد شد:

<?php
$site = '7learn.com';
$string = 'به سایت $site خوش آمدید';
echo $string;

 

نتیجه ی کد بالا، به شکل زیر است:

به سایت $site خوش آمدید

* اگر بخواهید جمله ی I'll be back را در داخل single-quote بگذارید، بخاطر وجود علامت ' در قسمت I'll خطا اتفاق می افتد.

<?php
echo 'I'll be back';

علت بروز خطا اینست که، string را داخل تک کوت قرار داده اید. مفسر اولین ' را بعنوان شروع string در نظر میگیرد و دنبال دومین ' که به معنی پایان string است، میگردد اما در وسط رشته یعنی I'll به تک کوت میرسد، در نتیجه در قسمت I رشته را تمام شده میبیند و مابقی عبارت باعث بروز خطا میشود.
 

با توجه به تعریف string در داخل single-quote، میبایست به مفسر بگوییم که single-quote ای که در داخل رشته آمده، معنی پایان آن رشته را نمیدهد و خودش یک مقدار است. یعنی single-quote در قسمت I'll را، اصطلاحاً Escape کنیم. پس single-quote را با \ می آوریم: \'

<?php
echo 'I\'ll be back'; // output: I'll be back

echo 'به \'سون لرن\' خوش آمدید'; // output: به 'سون لرن' خوش آمدید

 

* برای استفاده از \ در رشته، آنرا با یک backslash دیگر Escape کنید: \\

<?php
echo '\\'; // output: \
echo 'c:\\'; // output: c:\

نکته: پس متوجه شدیم که دو کاراکتر \' و \\ اگر داخل single-quote بیایند، دارای معنی میباشند.

در بقیه ی موارد اگر \ را بهمراه کاراکترها بیاورید (مثل " ، \n ، \t ، \r و ...) به هیچ معنی خاصی اشاره نمیکند و آن عبارت عیناً چاپ خواهد شد:

<?php
echo 'c:\wamp'; // output: c:\wamp
echo 'c:\wamp\www\\'; // output: c:\wamp\www\

echo 'http:\\\\7learn.com'; // output: http:\\7learn.com

echo 'Hello\nWorld'; // output: Hello\nWorld
echo 'Hello\n\tWorld'; // output: Hello\n\tWorld

 

* علامت double-quote در داخل single-quote (' " ') بعنوان یک مقدار شناخته میشود و نیازی به Escape آن نیست:

<?php
$site = '7learn.com';
echo 'به "سون لرن" خوش آمدید'; // output: به "سون لرن" خوش آمدید
echo 'به "$site" خوش آمدید'; // output: به "$site" خوش آمدید

echo '"'; // output: "
echo '"""'; // output: """

 

* اگر double-quote را در داخل sinqle-quote بیاورید و Escape کنید، به هیچ مقداری اشاره نمیکند و عینا چاپ میشود:

<?php
echo 'String in \"single-quote\"'; // output: String in \"single-quote\"

 

 

2. یک string میتواند داخل double-quote قرار گیرد:

<?php
$string = "این یک جمله ی تستی میباشد.";

 

* اگر نام متغیری را داخل double-quote قرار دهید، آن متغیر پردازش میشود و مقدار آن چاپ میشود: (برخلاف single-quote)

<?php
$site = 'سون لرن';
$string = "به سایت $site خوش آمدید";
echo $string;

نتیجه ی کد بالا، به شکل زیر است:

به سایت سون لرن خوش آمدید

همانطور که میبینید، متغیر $site در داخل double-quote پردازش شده است و مقدار آن چاپ شده است.

 

* علامت single-quote در داخل double-quote (" ' ") بعنوان یک مقدار شناخته میشود:

<?php
$site = '7learn.com';
echo "Welcome to '7learn.com'"; // output: Welcome to '7learn.com'
echo "Welcome to '$site'"; // output: Welcome to '7learn.com'

echo "'"; // output: '
echo "'''"; // output: '''

 

* کاراکتر های Escape شده ی زیر، در داخل double-quote معنی خاصی دارند:

\n  newline
\r  carriage return
\t  horizontal tab
\v  vertical tab
\e  escape
\f  form feed
\\  backslash
\$  dollar sign
\"  double-quote

 

* برای استفاده از " در رشته ای که داخل double-quote آمده است، باید آنرا Escape کرد: \"

<?php
echo "Welcome to \"7learn.com\""; // output: Welcome to "7learn.com"

 

  * اگر میخواهید $site را داخل double-quote قرار دهید و عیناً خودش چاپ شود، کافیست علامت $ را Escape کنید: \$

<?php
$site = '7learn.com';
echo "مثال برای متغیر \$site"; // output: مثال برای متغیر $site

 

در نظر داشته باشید کاراکتری مانند \n یک Enter در سورس ایجاد میکند، بنابراین ارتباطی با تگ <br> ندارد. یا کاراکتری مانند \t معادل یک Tab در سورس میباشد ولی در صفحه ی نمایش، یک فاصله نشان میدهد.

<?php
$string = "Hello \nWorld";
echo $string;

اگر سورس کد صفحه را در مرورگر باز کنید، خروجی به شکل زیر خواهد بود:

Hello 
World

اما در صفحه ی نمایش، به شکل زیر خواهید دید:

Hello World

 

همچنین به مثال زیر توجه کنید:

<?php
$string = "Line 1 \n\tLine 2";
echo $string;

نمایش آن در سورس کد:

Line 1 
    Line 2

در صفحه ی نمایش:

Line 1 Line 2

 

با خواندن این مقاله، تا به اینجا متوجه شدیم:

1. متغیر ها در single-quote تفسیر نمیشوند.
2. متغیرها در double-quote تفسیر میشوند.
3. کاراکترهای معنی دار در داخل single-quote فقط \\ و \' هستند. و بقیه ی کاراکترها تفسیر نمیشوند و عینا چاپ خواهند شد.
4. کاراکترهای معنی دار در داخل double-quote تفسیر میشوند.

 

 

بررسی نکات:
با توجه به توضیحاتی که تا اینجای جلسه گفتیم، میخواهیم نکاتی را برای درک بیشتر موضوع، بررسی کنیم.

نکته 1: برای اتصال چندین عبارت، از علامت . استفاده میشود:

<?php
$site = '7learn.';
echo 'Welcome' . ' ' . 'to ' . $site . 'com' . '<br>';
echo "Welcome" . " " . "to " . $site . "com" . "<br>";
echo "Welcome to $site" . 'com<br>';

// outputs:
//Welcome to 7learn.com
//Welcome to 7learn.com
//Welcome to 7learn.com

سه دستور بالا، خروجی یکسانی دارند.

 

نکته 2: اما اگر بخواهید مثال بالا را به شکل زیر بنویسید:

<?php
$site = '7learn.';
echo "Welcome to $sitecom<br>";

// output:
// Notice: Undefined variable: sitecom
// Welcome to 

خطای Notice اتفاق می افتد. چون متغیر $sitecom وجود ندارد. بنابراین برای جلوگیری از تداخل، میتوانید متغیر را در پرانتز بگذارید:

<?php
$site = '7learn.';
echo "Welcome to {$site}com<br>"; // output: Welcome to 7learn.com

echo "Welcome to ${site}com<br>"; // output: Welcome to 7learn.com

 

نکته 3: برای خوانایی سورس صفحه، میتوانید از \n ، \r\n ، \t و whitespace استفاده کنید:(روش های مختلف)

<?php
echo '<html>' . "\n";
echo '    <head>' . "\n";
echo '        <title>7learn.com</title>' . "\n";
echo '    </head>' . "\n";
echo '    <body>' . "\n";
echo '        Hello<br>World' . "\n";
echo '    </body>' . "\n";
echo '<html>' . "\n";

خروجی کدهای بالا بصورت زیر میباشد:

<html>
    <head>
        <title>7learn.com</title>
    </head>
    <body>
        Hello<br>World
    </body>
<html>

ثابتی در PHP 5.0.2 معرفی شده است، بنام PHP_EOL (به معنای End Of Line) که با توجه به پلتفرم اجرایی، \r\n یا \n را اجرا میکند.
در پلتفرم UNIX/Mac و Linux \n و در Windows \r\n بعنوان پایان خط و ابتدای خط جدید، در نظر گرفته میشود.

دو روش دیگر برای پیاده سازی، مثال بالا:

<?php
echo '<html>
    <head>
        <title>7learn.com</title>
    </head>
    <body>
        Hello<br>World
    </body>
<html>' . PHP_EOL;

///***************************///

echo "<html>\n";
echo "\t" . '<head>' . PHP_EOL;
echo "\t\t<title>7learn.com</title>" . PHP_EOL;
echo "\t</head>" . PHP_EOL;
echo "\t<body>" . PHP_EOL;
echo "\t\tHello<br>World" . PHP_EOL;
echo "\t</body>" . PHP_EOL;
echo "<html>" . PHP_EOL;

هر دو روش، خروجی یکسانی دارند.
برای پیاده سازی رشته ها، میتوانید از هر روشی که به ذهنتان میرسد، استفاده کنید.

 

در قسمت پایانی این جلسه، دو روش دیگر برای پیاده سازی string را بررسی خواهیم کرد.


3. پیاده سازی یک string به روش Heredoc:
این ساختار با علامت <<< و یک شناسه شروع میشود و در لاین بعدی string میآید و در نهایت، با همان شناسه ای که در ابتدا آمده است، به پایان میرسد.

<?php
$html =<<<EOT
<html>
\t<head>
\t\t<title>7learn.com</title>
\t</head>
\t<body>
\t\tHello<br>World
\t</body>
<html>
EOT;

echo $html;

نتیجه مثال بالا، مانند مثال های قبل خواهد بود.

اما نکات این ساختار:
1. ساختار Heredoc مانند double-quote رفتار میکند. البته استفاده از double-quote در داخل رشته، نیاز به Escape ندارد.

<?php
$name = 'mohsen';
echo <<<EOT
My name is "$name".
EOT;

// output: My name is "mohsen".

2. نام شناسه، نباید با یک عدد شروع شود.
3. شناسه ی شروع و پایان، میبایست همنام باشند.
4. string نباید در لاین شروع ساختار، بیاید. بنابراین بعد از <<<LABEL باید در لاین بعدی string بیاید.
5. شناسه ی شروع میتواند در double-quote قرار گیرد:(در PHP 5.3.0 اضافه شده است و اختیاریست.)
 

<?php
echo <<<"EOT"
یک رشته برای تست
EOT;

6. شناسه ی پایانی باید در یک لاین جدید بیاید و همچنین قبل و بعدش نباید کاراکتر یا فاصله یا کامنتی باشد(بجز semicolon) و بعد از semicolon میبایست Enter زده شود و به لاین بعد رفت.
برای مثال، کد زیر باعث بروز خطا میشود:

<?php
echo <<<"EOT"
یک رشته برای تست
	EOT;

//output: Parse error: syntax error, unexpected end of file

 

4. چهارمین راه برای تعریف یک string، ساختار Nowdoc میباشد:

پیاده سازی این ساختار بمانند روش قبلیست و تفاوتی که دارد، میبایست، شناسه ی شروع را در single-quote قرار داد:

<?php
$name = 'mohsen';
echo <<<'EOT'
My name is '$name'.
EOT;

// output: My name is '$name'.

این ساختار مانند single-quote عمل میکند.

Nowdoc از PHP 5.3.0 اضافه شده است.

فایل پیوست

محسن موحد
محسن موحد

1 دی 98