آشنایی با مفهوم Variable (متغیر) در زبان PHP


Variable از واژهٔ انگلیسی Vary به معنی «متغیر بودن» ساخته شده است و در دنیای برنامه‌نویسی هم Variable (متغیر) به ظرفی اشاره دارد که به صورت موقت دیتایی را درون حافظه ذخیره می‌سازد. در زبان برنامه‌نویسی PHP، شاهد ۸ نوع مختلف از متغیرها هستیم که به ۴ دستهٔ کلی زیر تقسم‌بندی می‌شوند:
- Scalar
- Non-scalar یا Composite
- Resource
- Null

دستهٔ Scalar شامل بولین (Boolean)، عدد صحیح (Integer)، عدد اعشاری (Float) و رشته (String) است؛ دستهٔ Non-scalar شامل آرایه (Array) و آبجکت (Object) است؛ Resource به چیزی اشاره دارد که در خود زبان PHP تعبیه نشده است (همچون ارتباط با دیتابیس) و Null هم تایپ خاصی است که حاوی هیچ مقداری نبوده و تهی است.

شیوهٔ نامگذاری متغیرها در زبان PHP
فارغ از اینکه بخواهیم چه نوع متغیری ایجاد کنیم، یکسری قوانین کلی وجود دارند که در نام‌گذاری متغیرها در زبان PHP حتماً می‌بایست مد نظر قرار داده شوند که عبارتند از:
- نام متغیر باید با علامت $ شروع شود (مثلاً userId$)
- نام متغیر می‌تواند ترکیبی از حروف، اعداد و _ باشد (مثلاً user_id$)
- اولین حرف در نام متغیر پس از علامت $ باید یک حرف انگلیسی یا علامت _ باشد (مثلاً 1user$ مورد قبول نیست).
-نام متغیرها در زبان PHP اصطلاحاً Case-sensitive است؛ به عبارت دیگر، مفسر این زبان به حروف بزرگ و کوچک در ارتباط با متغیرها حساس است (مثلاً از دید مفسر این زبان userId ،$userID$ و userid$ سه متغیر مختلف محسوب می‌شوند).

به عنوان چند نمونه از نام‌های غلط در نامگذاری متغیرها در زبان PHP داریم:

my variable // There is a white space
my.variable // There is a dot
$1variable // There is a number at the beginning
$my-variable // There is a dash
به خاطر داشته باشید
در بالا با اصطلاح Case-sensitive آشنا شدید بدین معنا که نسبت به بزرگی یا کوچکی حروف حساسیت وجود دارد. در مقابل، اصطلاح دیگری وجود دارد تحت عنوان Case-insensitive که حاکی از آن است که مفسر PHP نسبت به بزرگی یا کوچکی حروف حساسیت ندارد.
به طور کلی، مفسر PHP نسبت به بزرگی یا کوچکی حروف در نام متغیرها، کلاس‌ها، متدها و چیزهایی از این دست حساس (Case-sensitive) است اما نسبت به نام دستوراتی همچون echo یا print و فانکشن‌های از پیش تعریف شده در خود زبان همچون ()sort غیرحساس (Case-insensitive) است. به عبارت دیگر، هیچ فرقی نمی‌کند که دستور اِکو را به صورت echo، eCHo و یا ECHO بنویسیم (البته توصیه می‌شود که استاندارد نوشتن کلیهٔ دستورات با حروف کوچک دنبال شود).

آشنایی با اصطلاحات نامگذاری‌ها در برنامه‌نویسی
به طور کلی سه روش مختلف برای نام‌گذاری چیزهای مختلف در سورس‌کد وجود دارد که عبارتند از camelCase ،snake_case و StudlyCase یا PascalCase. برای روشن شدن منظور از تک‌تک این اصطلاحات، متغیرهای زیر را در نظر بگیرید:

$fist_name = "Behzad"; // This is snake_case
$firstName = "Behzad"; // This is camelCase
$FirstName = "Behzad"; // This is StudlyCase (PascalCase) 

همان‌طور که ملاحظه می‌شود، منظور از اصطلاح snake_case این است که کلیهٔ حروف نام متغیر را به صورت کوچک بنویسیم و از آنجا که در نام‌گذاری متغیرها مجاز به استفاده از Space (فاصله) نیستیم، به جای فاصله از Underscore یا همان علامت _ استفاده می‌کنیم.

منظور از اصطلاح camelCase هم این است که اولین حرف نام متغیر به صورت کوچک سپس اولین حرف کلیهٔ کلمات با حروف بزرگ نوشته می‌شوند (وجه تسمیهٔ این روش نام‌گذاری به این دلیل است که نام متغیر به نوعی شبیه به کوهان شتر می‌شود).

در نهایت، به روش نام‌گذاری StudlyCase یا PascalCase می‌رسیم که دقیقاً مشابه روش camelCase است با این تفاوت که حرف اول اولین کلمه نیز همچون سایر کلمات به صورت بزرگ نوشته می‌شود.

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

اختصاص مقدار به یک متغیر
با استفاده از علامت = که اصطلاحاً Assignment Operator نامیده می‌شود، می‌توان مقادیر دلخواه خود را به متغیرها در زبان PHP اختصاص دهیم.

هشدار
اشتباهی که بسیاری از کدآموزان در فرایند آموزشی خود مرتکب می‌شوند این است که فکر می‌کنند علامت = در برنامه‌نویسی همان کاری را انجام می‌دهد که در ریاضیات انجام می‌دهد؛ به عبارت دیگر،‌ فکر می‌کنند که علامت = میزان برابری چیزی را نشان می‌دهد اما این در حالی است که در زبان‌های برنامه‌نویسی اصلاً این‌گونه نیست و این علامت برای تخصیص مقداری به یک متغیر استفاده می‌شود. در زبان‌های برنامه‌نویسی اگر بخواهیم میزان برابری را نشان دهیم، می‌بایست از علائم == و یا === استفاده نماییم.

نحوهٔ استفاده از متغیرها با دستور echo در زبان PHP
برای روشن‌تر شدن این مسئله، مثالی می‌زنیم:

$firstName = 'Behzad';
$lastName = 'Moradi';
echo "My firstname is $firstName and my lastname is $lastName.";

به عنوان خروجی کدهای فوق داریم:

My firstname is Behzad and my lastname is Moradi.

در تفسیر کدهای فوق، بایستی بگوییم که Variale (متغیر) در زبان PHP با قرار دادن یک علامت $ و نام دلخواه ساخته شده، سپس یک علامت = قرار می‌دهیم و یک Value (مقدار) برای آن در نظر می‌گیریم و در نهایت هم یک علامت ; قرار می‌دهیم.

حال اگر بخواهیم مقادیر متغیرهای خود را با استفاده از دستورات echo و یا print چاپ کنیم، می‌بینیم که به سادگی از علائم " " استفاده کرده، هر عبارتی که بخواهیم می‌نویسیم و هر کجا هم که نیاز داشته باشیم مقادیر متغیرها چاپ شوند، آنها را جایگذاری می‌کنیم.

نکته‌ای که در اینجا می‌بایست مد نظر داشته باشیم این است که می‌توان از علائم { } دور متغیر استفاده کنیم تا این اطمینان حاصل گردد که نام متغیر به اسامی قبل و بعدش نمی‌چسبد:

$firstName = 'Behzad';
$lastName = 'Moradi';
echo "My firstname is {$firstName} and my lastname is {$lastName}.";

دقیقاً خروجی قبل را در یافت خواهیم کرد با این تفاوت که می‌توانیم اطمینان حاصل کنیم که به اشتباه نام متغیر به یک استرینگ نخواهد چیسبید. به عنوان مثال:

$firstName = 'Behzad';
$lastName = 'Moradi';
echo "My firstname is $firstNameand my lastname is {$lastName}.";

اگر از علائم { } استفاده نکنیم، همان‌طور که مشاهده می‌شود ممکن است نام متغیر به استرینگ‌های قبل و یا بعدش بچسبد که در این صورت داریم به مفسر دستور می‌دهیم که مقدار متغیر جدیدی -که وجود خارجی ندارد- را چاپ کند.

هشدار
توجه داشته باشید که برای چاپ کردن مقادیر متغیرها در زبان PHP با استفاده از دستور echo حتماً می‌بایست از علائم " " استفاده کرد و در صورتی که از علائم ' ' استفاده شود، نتیجهٔ دلخواه را نخواهیم گرفت و علت این مسئله هم آن است که علائم " " می‌توانند هر آنچه که مابین آنها قرار گرفته را Interprete (تفسیر) کنند در حالی که علائم ' ' صرفاً چیزی که مابین آنها قرار گیرد را همان‌طور که هستند چاپ می‌کنند. به همین دلیل به نظر می‌رسد که از یک سو اگر سرعت برای دولوپر مهم باشد و از سوی دیگر نیازی به قابلیت‌های علائم " " نداشته باشد، سرعت اجرای ' ' بیشتر است. 

برای روش‌تر شدن هشدار فوق، کدهای بالا را به صورت زیر ریفکتور می‌کنیم:

$firstName = 'Behzad';
$lastName = 'Moradi';
echo 'My firstname is $firstName and my lastname is $lastName.';

به عنوان خروجی اسکریپت فوق داریم:

My firstname is $firstName and my lastname is $lastName.

می‌بینیم که اگر به جای علائم " " از علائم ' ' استفاده کنیم، به جای نمایش دادن مقادیر متغیرها، نام متغیرها چاپ خواهد شد و مسلماً این چیزی نیست که مد نظر ما است.

نکته
در صنعت توسعهٔ نرم‌افزار، زمانی که دست به اعمال تغییرات در سورس‌کد پروژهٔ خود بزنیم، به این فرایند Refactor کردن گفته می‌شود. ریفکتور کردن معمولاً به منظور بهبود سورس‌کد صورت می‌گیرد.

آشنایی با مفهوم Concatenation
گاهی‌اوقات نیاز داریم تا چندین استرینگ و متغیر را به یکدیگر بچسبانیم که برای این منظور می‌بایست با مفهومی تحت عنوان Concatenation (به معنی الحاق، الصاق یا چسباندن) آشنا شویم. برای مثال، اسکریپت فوق را در نظر می‌گیریم:

$firstName = 'Behzad';
$lastName = 'Moradi';
echo 'My firstname is ' . $firstName . ' and my lastname is ' . $lastName;

می‌بینیم که هر کجا که استرینگ داریم، آنها را مابین علائم ' و ' قرار داده‌‌ایم سپس یک نقطه قرار داده و استرینگ بعدی را آورده‌ایم. به فرایند چسباندن یکسری استرینگ/متغیر به یکدیگر، Concatenation گفته می‌شود. به عنوان خروجی اسکریپت فوق داریم:

My firstname is Behzad and my lastname is Moradi

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

$firstVariable = "hi";
$$firstVariable = "hello";
echo $hi;

به عنوان خروجی اسکریپت فوق داریم:

hello

در واقع، ما یک متغیر ساخته‌ایم تحت عنوان firstVariable$ که مقدار استرینگ hi را دارد. در خط دوم از دو علامت $$ استفاده کرده سپس نام متغیری که پیش از این ساخته‌ بودیم را نوشته و مقداری دلخواه همچون hello را هم برای آن در نظر گرفته‌ایم. حال اگر متغیر hi$ را چاپ کنیم، خواهیم دید که مقدار hello چاپ می‌شود. در حقیقت، کاری که در خط دوم انجام داده‌ایم این است که دستور داده‌ایم که مقدار متغیر firstVariable$ به عنوان نام متغیر جدیدمان در نظر گرفته‌ شود.

آشنایی با زبان‌های اصطلاحاً Statically-typed و Dynamically-typed
به خاطر داشته باشید که در این مبحث، Type (تایپ) اصلاً به معنی «تایپ کردن» نیست بلکه به معنی «نوع» بوده و به نوع دیتایی که در متغیرها ذخیره می‌شود اشاره دارد.

از بُعد چگونگی تعریف متغیرها، می‌توان زبان‌های برنامه‌نویسی را اصطلاحاً به دو دستهٔ Statically-typed و Dynamically-typed تقسیم‌بندی کرد. به عبارت دیگر، در زبانی که به اصطلاح Statically-typed باشد، دولوپر می‌بایست در حین کدنویسی، تایپ (نوع) متغیر را مشخص کند تا در حین کامپایل برنامه، نوع متغیرها در اختیار کامپایلر وجود داشته باشند. به عنوان مثال، در زبان جاوا که یک زبان Statically-typed است داریم:

int myInteger = 5;

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

int myInteger = "5";

با اروری همچون ارور زیر از طرف کامپایلر جاوا مواجه خواهیم شد:

incompatible types: String cannot be converted to int

زیرا نوع متغیر int (عدد صحیح) است و این در حالی است که ما یک استرینگ (رشته) به عنوان مقدار اولیهٔ آن در نظر گرفته‌ایم.

در مقابل، در زبان‌های به اصطلاح Dynamically-typed نیازی نیست دولوپر در حین کدنویسی نوع متغیرها را مشخص سازد و این در حالی است که پس از اختصاص مقادیر به متغیر،‌ بسته به اینکه مقادیر از چه نوعی هستند، در حین Run-time (تفسیر و اجرای سورس‌کد) تایپ متغیر مشخص خواهد شد. از جملهٔ این نوع زبان‌ها می‌توان به PHP و Python اشاره کرد. به عنوان مثال در زبان PHP داریم:

$myNumber = 5;

می‌بنیم که اصلاً نوع متغیر را تعریف نکردیم اما در حین اجرای اسکریپت فوق، مفسر PHP از روی مقدار در نظر گرفته شده برای این متغیر -که عدد ۵ است- می‌فهمند با یک متغیر از جنس int (عدد صحیح) سر و کار دارد.

آشنایی با تفاوت‌های زبان‌های اصطلاحاً Weakly-typed و Strongly-typed
تفاوت اصلی مابین دو اصطلاح Weakly-typed و Strongly-typed در نحوهٔ به‌کارگیری متغیرها در زبان‌های برنامه‌نویسی است. به عبارت دیگر، در زبانی که Strongly-typed باشد، وقتی که تایپی برای متغیری در نظر گرفته شود، آن تایپ تا ابد باقی خواهند ماند تا اینکه دولوپر با فرایندی تحت عنوان Cast -که در ادامه بیشتر با آن آشنا خواهید شد- بیاید و تایپ متغیر را تغییر دهد.

برای مثال، اگر بخواهیم دو متغیری که تایپ‌ها یکی نیست را با یکدیگر جمع کنیم، ارور دریافت خواهیم کرد اما این در حالی است که چنین سخت‌گیری در مورد زبان‌های به اصطلاح Weakly-typed وجود ندارد. به عنوان نمونه، در زبانی همچون جاوا که یک زبان به اصطلاح Strongly-typed یا Strictly-typed است، با نوشتن کدهای زیر ارور دریافت خواهیم کرد:

public class MyClass {
    public static void main(String args[]) {
        int myInteger = 5;
        String myString = "5";
        int total = myInteger + myString;
        System.out.println(total);
    }
}

به عنوان خروجی برنامهٔ جاوای فوق داریم:

incompatible types: String cannot be converted to int

حال برنامهٔ فوق را ریفکتور کرده تا ارور مذکور مرتفع گردد:

public class MyClass {
    public static void main(String args[]) {
        int myInteger = 5;
        String myString = "5";
        int total = myInteger + Integer.parseInt(myString);
        System.out.println(total);
    }
}

به عنوان خروجی داریم:

10

می‌بینیم پس از اینکه تایپ متغیر myString در خط بعد به Integer تغییر یافت، کامپایلر جاوا به سادگی قادر خواهد بود تا هر دو متغیر myInteger و myString را با یکدیگر جمع کرده و جمع‌جبری آنها ۱۰ خواهد شد.

در مقابل، زبان PHP زبانی است که گفته می‌شود اصطلاحاً Weakly-typed یا Loosely-typed است. به عبارت دیگر، در واقع، در PHP وقتی که ما دست به تعریف متغیری می‌زنیم، ما به عنوان یک دولوپر اصلاً نیازی نیست تا نگران این مسأله باشیم که چه نوع دیتایی قرار است در این متغیر ذخیره گردد. به عنوان نمونه داریم:

$myNumber = 5;

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

$myNumber = 5;
$myString = "5";
$total = $myNumber + $myString;
echo $total;

به عنوان خروجی داریم:

10

در تفسیر اسکریپت فوق بایستی بگوییم که متغیر myString$ به خاطر محتوایی که دارد، نوع آن استرینگ است (در حقیقت، از آنجا که عدد ۵ مابین دو علامت " " قرار گرفته است، یک استرینگ (رشته) محسوب می‌شود که چیزی همچون Five تلقی می‌گردد). اما ما در متغیر سوم -total$- آمده‌ایم و هر دو متغیر که یکی از جنس عدد صحیح است و دیگری از جنس استرینگ را با یکدیگر جمع کرده‌ایم و می‌بینیم که مفسر پی‌اچ‌پی هم بدون هیچ مشکلی هر دو متغیر -که تایپ‌ها آنها با یکدیگر متفاوت است- را به سادگی با یکدیگر جمع کرده و خروجی ۱۰ را در اختیار ما قرار می‌دهد.

نکته‌ای که در اینجا می‌بایست مد نظر داشته باشیم این است که مفسر پی‌اچ‌پی در Run-time (زمان اجرای اسکریپت) به صورت خودکار تمام تلاش خود را می‌کند تا تایپ متغیر myString$ را به تایپی تغییر دهد که بتواند مقدار آن را با متغیر myNumber$ جمع کند. لذا تایپ int در حین اجرا برای متغیر myString$ در نظر گرفته خواهد شد اما اگر پس از اجرای موفقیت‌آمیز اسکریپت، باز هم تایپ این متغیر را بررسی کنیم، می‌بینیم که string است:

$myNumber = 5;
$myString = "5";
$total = $myNumber + $myString;
echo $total . "
";
echo gettype($myString);

به عنوان خروجی داریم:

10
string
نکته
وقتی که تایپ یک متغیر مشخص می‌شود، اصطلاحاً گفته می‌شود که تایپ آن Declare شده است.

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

آشنایی با مفهوم Variable Casting در زبان PHP
Cast بحثی بسیار مهم در PHP به شما می‌آید و این در حالی است که گاهی‌اوقات دولوپرهای باتجربه نیز از ساز و کار Variable Casting در این زبان آگاهی ندارند!

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

$myVariable = '123';
$variableType = gettype($myVariable);
echo "My Variable Value is $myVariable and its type is $variableType";

همان‌طور که ملاحظه می‌شود، متغیری داریم تحت عنوان myVariable$ که مقداری هم که برای آن در نظر گرفته شده است، استرینگی است تحت عنوان '123'. در حقیقت، از آنجا که ۱۲۳ مابین دو علامت ' و ' قرار گرفته‌ است، همچون یک عبارت یا نوشته با آنها برخورد می‌شود (به عبارت دیگر، چیزی مشابه 'One Two Three' است).

در خط بعد متغیر دیگری تعریف کرده‌ایم تحت عنوان variableType$ که مقدار آن را برابر با یکی از فانکشن‌های از پیش تعریف شده در زبان PHP تحت عنوان ()gettype قرار داده‌ایم و همان‌طور که از نام این فانکشن مشخص است، این وظیفه را دارا است تا تایپ (نوع) پارامتر ورودی‌اش را مشخص سازد.

در همین راستا، به عنوان پارامتر ورودی این فانکشن، متغیری که پیش از این تعریف کرده‌ایم را در نظر می‌گیریم و در خط آخر هم با استفاده از دستور echo استرینگی را به صورت زیر چاپ خواهیم کرد:

My Variable Value is 123 and its type is string

می‌بینیم که مقدار هر دو متغیر بازگردانده شده است و این در حالی است که تایپ متغیر myVariable$ اصطلاحاً string است. حال به منظور درک بهتر فرایند کَستینگ، کدهای فوق را به صورت زیر تغییر می‌دهیم:

$myVariable = '123';
$myVariable = (int) $myVariable;
$variableType = gettype($myVariable);
echo "My Variable Value is $myVariable and its type is $variableType";

مجدد اسکریپت فوق را در مرورگر اجرا می‌کنیم:

My Variable Value is 123 and its type is integer

می‌بینیم که مقدار متغیر $variableType از string به integer تغییر یافت. آنچه اتفاق افتاده این است که در خط دوم متغیر myVariable$ را اصطلاحاً Cast کرده‌ایم به int. به عبارت دیگر، خود اقدام به تبدیل کردن تایپ (نوع) متغیر از string به integer کرده‌ایم.

به خاطر داشته باشید
همان‌طور که ملاحظه می‌شود به جای نوشتن کامل تایپ integer از int استفاده کرده‌ایم. اصطلاحاً گفته می‌شود که int یک Alias (نام مستعار) برای integer است. همچنین bool هم یک نام مستعار برای Boolean است.

حال قصد داریم تا به جای int متغیر مد نظر را به بولین کَست کنیم:

$myVariable = '123';
$myVariable = (bool) $myVariable;
$variableType = gettype($myVariable);
echo "My Variable Value is $myVariable and its type is $variableType";

ابتدا خروجی اسکریپت فوق را چک می‌کنیم:

My Variable Value is 1 and its type is boolean

می‌بینیم که پس از کست کردن متغیر به bool، مقدار آن برابر با ۱ شده است و تایپ هم به درستی boolean نمایش داده می‌شود.

به خاطر داشته باشید
دیتاتایپ Boolean دو مقدار بیشتر نمی‌تواند داشته باشد: true یا false. همچنین مقدار عددی true برابر با عدد ۱ و مقدار عددی false برابر با ۰ است.

پیش از این گفتیم که روش دومی که برای کَست کردن می‌توانیم استفاده کنیم، استفاده از فانکشن‌های از پیش تعریف شده در زبان PHP است. نکتهٔ جالب در مورد این دست فانکشن‌ها این است که نام آنها به خوبی گویای کاری است که انجام می‌دهند که عبارتند از floatval ،intval ،strval و boolval. به طور مثال داریم:

$myVariable = '123';
$myVariable = intval($myVariable);
$variableType = gettype($myVariable);
echo "My Variable Value is $myVariable and its type is $variableType";

به عنوان خروجی هم داریم:

My Variable Value is 123 and its type is integer

راه‌کار آخر هم برای کَست کردن متغیرها استفاده از فانکشن ()settype است. برای روشن‌تر شدن این مسئله، کدهای زیر را در نظر بگیرید:

$myVariable = '123';
$myVariable = settype($myVariable, 'integer');
$variableType = gettype($myVariable);
echo "My Variable Value is $myVariable and its type is $variableType";

به عنوان خروجی اسکریپت فوق داریم:

My Variable Value is 1 and its type is boolean

همان‌طور که ملاحظه می‌شود، نتیجه غیرمنتظره است! در واقع، کاری که این فانکشن انجا می‌دهد این است که دیتاتایپ را تغییر می‌دهد که اگر این کار با موفقیت صورت گیرد مقدار true و در غیر این صورت، مقدار false را باز می‌گرداند و همان‌طور که پیش از این گفتیم، معادل استرینگی true برابر با ۱ و معادل استرینگی false برابر با ۰ است؛ لذا از آنجا که در اسکریپت فوق این فرایند با موفقیت انجام شده، در خط دوم مقدار ۱ به متغیرمان اختصاص می‌یابد و تایپ آن بولین می‌شود و همین می‌شود که در خروجی عدد ۱ را می‌بینیم. حال چنانچه بخواهیم همچون گذشته نتیجهٔ مد نظر را مشاهده کنیم، می‌بایست اسکریپت فوق را به صورت زیر ریفکتور نماییم:

$myVariable = '123';
settype($myVariable, 'integer');
$variableType = gettype($myVariable);
echo "My Variable Value is $myVariable and its type is $variableType";

حال خروجی را چک می‌کنیم:

My Variable Value is 123 and its type is integer

می‌بینیم که نتیجهٔ قابل انتظار مشاهده می‌شود. در واقع، کاری که در اسکریپت فوق پس از اعمال تغییرات انجام داده‌ایم این است که در خط دوم به جای آنکه خروجی فانکشن settype که معادل با ۱ است را به متغیر myVariable اختصاص دهیم، صرفاً فرایند کَستینگ را انجام می‌دهیم و خروجی این فانکشن را ذخیره نمی‌سازیم.

نکات حساس در مورد Variable Casting
وقتی در زبان PHP به سراغ فرایند کَستینگ می‌رویم، گاهی نتایج آن‌طور که مد نظر ما است نشان داده نمی‌شود و اینجا است که بایستی با یکسری استثناء‌ها آشنا شویم.

همواره به یاد داشته باشیم که کست کردن از دیتاتایپ Float به Integer هرگز عدد اعشاری را رو به بالا یا پایین رُند نمی‌کند بلکه بخش اعشاری کاملاً حذف می‌گردد:

$myFloat = 123.56;
$myFloat = (int) $myFloat;
echo $myFloat;

به عنوان خروجی داریم:

123

در مورد بولین‌ها اگر یک استرینگ را به بولین کست کنیم، مقدار آن برابر با false می‌شود:

$myString = "";
$myString = (bool) $myString;
var_dump($myString);

به عنوان خروجی داریم:

bool(false)

در کد فوق از فانکشن جدیدی تحت عنوان var_dump استفاده کرده‌ایم. کاری که این فانکشن انجام می‌دهد این است که مقدار متغیر را همچون echo برایمان چاپ می‌کند اما این در حالی است که اطلاعات بیشتری هم در اختیارمان قرار می‌دهد. می‌بینیم که مقدار false بازگردانده شده است (به خاطر داشته باشید که اگر این متغیر خالی نبود و استرینگی داخل آن وجود داشت، پس از کست کردن مقدار true بازگردانده می‌شد).

اگر یک عدد صحیح یا عدد اعشاری را به بولین کست کنیم و در عین حال مقدار آن صفر نباشد، چه عدد مثبت باشد و چه منفی، مقدار true بازگردانده می‌شود:


$myInteger = -123;
$myInteger = (bool) $myInteger;
var_dump($myInteger);

به عنوان خروجی داریم:

bool(true)

کَست کردن یک استرینگ به عدد، ۰ می‌شود:

$myString = "This is string";
$myString = (int) $myString;
var_dump($myString);

به عنوان خروجی داریم:

int(0)

چک کردن تایپ متغیرها در زبان PHP
در زبان PHP یکسری فانکشن‌های از پیش تعریف شده وجود دارند که برای چک کردن تایپ (نوع) یک متغیر می‌توان از آنها استفاده کرد که از آن جمله می‌توان به ()is_int یا ()is_array اشاره کرد که به ترتیب به منظور چک کردن اینکه آیا یک متغیر عدد صحیح یا آرایه هست یا خیر، مورد استفاده قرار می‌گیرد (لازم به ذکر است که این دست فانکشن‌ها در دستورات شرطی (If/Else) مورد استفاده قرار می‌گیرد که در ادامهٔ آموزش‌ها بیشتر با این نوع دستورات آشنا خواهید شد). لیست این فانکشن‌ها عبارت است از:

settype() - Set the type of a variable
get_class() - Returns the name of the class of an object
is_array() - Finds whether a variable is an array
is_bool() - Finds out whether a variable is a boolean
is_callable() - Verify that the contents of a variable can be called as a function
is_float() - Finds whether the type of a variable is float
is_int() - Find whether the type of a variable is integer
is_null() - Finds whether a variable is NULL
is_numeric() - Finds whether a variable is a number or a numeric string
is_object() - Finds whether a variable is an object
is_resource() - Finds whether a variable is a resource
is_scalar() - Finds whether a variable is a scalar
is_string() - Find whether the type of a variable is string
function_exists() - Return TRUE if the given function has been defined
method_exists() - Checks if the class method exists

برای روشن‌تر شدن نحوهٔ به‌کارگیری این فانکشن‌ها، اسکریپت زیر را در نظر بگیرید:

$myVariable = 7;
$type = is_int($myVariable);
echo $type;

به عنوان خروجی اسکریپت فوق داریم:

1

حال اسکریپت فوق را به صورت زیر ریفکتور می‌کنیم:

$myVariable = "7";
$type = is_int($myVariable);
echo $type;

اکنون به عنوان خروجی،‌ هیچ چیزی در معرض دیدمان قرار نخواهد گرفت چرا که نتیجه false است و مقدار عددی false هم برابر با ۰ است که در خروجی نمایش داده نمی‌شود.

تاکنون به نوعی با مفهوم متغیر در زبان PHP آشنا شده‌اید. در ادامه قصد داریم به تفصیل در مورد تک‌تک این ۸ نوع متغیر در زبان PHP بحث کنیم. در واقع، هر کدام از این انواع متغیرها اصطلاحاً Data Type نامیده می‌شوند که این وظیفه را دارند تا نوع خاصی از دیتا (داده) را در خود ذخیره سازند.

آشنایی با متغیرهای اصطلاحاً Scalar
پیش از این گفتیم که در زبان PHP چهار نوع متغیر از نوع Scalar دارد که در ادامه با تک‌تک آنها آشنا خواهید شد:

- آشنایی با String در زبان PHP: (استرینگ یا رشته) به مجموعه حروف الفبا، کاراکترهای خاص، علائم، اعداد و هر چیزی گفته می‌شود که در کنار یکدیگر داخل علائم " " یا ' ' قرار می‌گیرند. به طور مثال، عبارت «من دولوپر هستم» یک استرینگ (رشته) است. به عنوان مثال داریم:

$string = "I am a developer.";
هشدار
همواره به خاطر داشته باشید که اگر ابتدای استرینگ را با علامت " شروع کرده باشید، حتماً بایستی انتهای آن را نیز با علامت " به اتمام برسانید و در صورتی که مثلاً از علامت ' استفاده کنید، ارور دریافت خواهید کرد.

پیش از این گفتیم که متغیرها به این دلیل متغیر نامیده می‌شوند که اصطلاحاً Mutable (قابل تغییر) هستند. در مثال زیر می‌بینیم که ابتدا متغیری با مقدار اولیه‌ای تعریف کرده‌ایم اما در خط بعد مجدد همان متغیر را نوشته و این بار مقدار جدید برای آن در نظر گرفته‌ایم:

$string = "I am a developer.";
$string = "I am a not developer.";
echo $string;

اگر خروجی اسکریپت فوق را ببینیم، خواهیم دید که متغیر string$ مقدار اولیهٔ خود را از دست داده و مقدار جدید جایگزین آن شده است:

I am a not developer.

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

- آشنایی با Integer در زبان PHP: اعداد صحیح مابین 2,147,483,648- و 2,147,483,647 جزو دیتاتایپ Integer هستند. در ارتباط با اعداد صحیح در زبان PHP یکسری قوانین وجود دارند که مهم‌ترین آنها عبارتند از:
- هر عدد صحیح حداقل می‌بایست یک رقم داشته باشد.
- هر عدد صحیح نمی‌بایست هیچ‌گونه رقم اعشاری داشته باشد.
- هر عدد صحیح می‌توان مثبت یا منفی باشد.

به عنوان مثال، در اسکریپت زیر یک متغیر از جنس عدد صحیح ایجاد کرده‌ایم:

$integer = 123;
var_dump($integer);

به عنوان خروجی داریم:

int(123)

می‌بینیم که فانکشن ()var_dump علاوه بر مقدار این متغیر، نوع آن (int) را هم مشخص ساخته است.

همواره به خاطر داشته باشید که اعداد را نمی‌بایست داخل علائم " " و یا ' ' قرار داد چرا که در این صورت آنها را به استرینگ تبدیل کرده‌ایم. همچنین به صورت پیش‌فرض، اعداد در PHP مثبت (+) در نظر گرفته می‌شوند مگر آنکه علامت منفی (-) قبل از آنها درج شود.

- آشنایی با Float در زبان PHP: نام دیگر این نوع دیتاتایپ Floating Point Number یا Double است و به هر نوع عددی گفته می‌شود که رقم اعشاری داشته باشد. به عنوان مثال داریم:

$float = 1.23;
var_dump($float);

به عنوان خروجی داریم:

float(1.23)

- آشنایی با Boolean در زبان PHP: دیتاتایپ بولین از دو حال خارج نیست: true یا false. به عنوان مثال داریم:

$itIsTrue = true;
$itIsFalse = false;
var_dump($itIsTrue, $itIsFalse);

به عنوان خروجی هم داریم:

bool(true) bool(false)

همواره به خاطر داشته باشیم که کلیدواژگان true و false را هرگز نمی‌بایست داخل علائم " " و یا ' ' قرار داد:

$itIsTrue = "true";
$itIsFalse = 'false';
var_dump($itIsTrue, $itIsFalse);

به عنوان خروجی داریم:

string(4) "true" string(5) "false"

در حقیقت، وقتی که کلیدواژگان true و false را داخل دابل کوتیشن یا سینگل کوتیشن قرار می‌‌دهیم، آنها را از حالت بولین خارج ساخته و به استرینگ تبدیل می‌کنیم (همچنین به خاطر داشته باشیم معادل عددی true عدد ۱ و معادل عددی false عدد ۰ است).

آشنایی با متغیرهای اصطلاحاً Non-scalar
در زبان PHP دو نوع متغیر به اصطلاح Non-scalar داریم که عبارتند از Array و Object که در ادامه با هر دوی آنها آشنا خواهید شد:

- آشنایی با Array در زبان PHP: آرایه دیتاتایپی است که این امکان را به دولوپر می‌دهد تا داده‌های مختلفی -که معمولاً با یکدیگر مرتبط هستند- را داخل یک متغیر و در کنار یکدیگر ذخیره سازد. به عنوان مثال، اگر بخواهیم متغیری داشته باشیم که اسامی تعدادی خودرو را داخل خود ذخیره سازد، می‌توانیم از آرایه استفاده کنیم:

$cars = array("Volvo","BMW","Toyota");
var_dump($cars);

به عنوان خروجی هم داریم:


array(3) {
  [0]=>
  string(5) "Volvo"
  [1]=>
  string(3) "BMW"
  [2]=>
  string(6) "Toyota"
}

می‌بینیم آرایه‌ای داریم که ۳ عضو دارد (لازم به ذکر است که مبحث آرایه‌ها در زبان PHP بسیار گسترده است و در فصول آتی، به تفصیل در مورد آنها صحبت خواهیم کرد).

- آشنایی با Object در زبان PHP: آبجکت (شییٔ) دیتاتایپی در زبان PHP است که مرتبط با مفهوم OOP (شییٔ‌‌گرایی) است که در فصول آینده به تفصیل در مورد آن صحبت خواهیم کرد اما در ادامه یک مثال کوچک از عملکرد آن خواهیم زد:

class MyClass
{
    public function showSomething() {
        echo "This is a method in a class.";
    }
}

$myObject = new MyClass;
var_dump($myObject);

به عنوان خروجی داریم:

object(MyClass)#1 (0) { }

آشنایی با Resource در زبان PHP
در واقع، Resource واقعاً یک دیتاتایپ نیست. در زبان PHP یکسری منابعی که خارج از اکوسیستم خود PHP هستند تحت عنوان Resource شناخته می‌شوند. به طور مثال، می‌توان ارتباط با دیتابیس MySQL را مثال زد که نوعی ریسورس محسوب می‌شود (در فصول آینده به تفصیل در مورد دیتابیس‌ بحث خواهیم نمود).

آشنایی با Null در زبان PHP
آخرین نوع از دیتاتایپ‌های زبان PHP اصطلاحاً Null نام دارد که یک دیتاتایپ خاص است که فقط و فقط یک مقدار می‌تواند در خود ذخیره سازد که آن هم Null است (البته این مقدار اصطلاحاً Case-insensitive است؛ لذا مقادیر null ،NULL و nUll هم مشابه Null هستند).به طور کلی، متغیری که دیتاتایپ آن Null باشد، متغیری است که حاوی هیچ‌گونه مقداری نبوده و تهی است. به طور مثال داریم:

$myNullVariable = null;
echo gettype($myNullVariable);

خروجی اسکریپت فوق برابر است با:

NULL

همچنین متغیری که قبلا تعریف کرده باشیم را نیز می‌توانیم به سادگی NULL کنیم:

$myVariable = 123;
$myVariable = null;
var_dump($myVariable);

به عنوان خروجی داریم:

NULL

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

به خاطر داشته باشید
همان‌طور که پیش از این گفتیم که کلیدواژگان true و false را هرگز نمی‌بایست داخل علائم " " و یا ' ' قرار داد، این قانون در مورد کلیدواژهٔ Null هم صدق می‌کند و اگر آن را داخل این علائم قرار دهیم، دیگر مفهوم Null (تهی) بودن خود را از دست می‌داد و به یک استرینگ تبدیل می‌شود.

آشنایی با توابع ()isset و ()unset در PHP
وقتی پای متغیرها در زبان PHP در میان باشد، یکسری فانکشن‌ها (توابع) کاربردی هستند که می‌بایست با آنها آشنا باشیم که از آن جمله می‌توان به ()isset و ()unset اشاره کرد. به منظور روشن شدن کاربرد این توابع، کدهای زیر را مد نظر قرار می‌دهیم:

$firstName = 'Behzad';
$checkIfVariableIsSet = isset($firstName);
echo $checkIfVariableIsSet;

به عنوان خروجی اسکریپت فوق داریم:

1

در تفسیر اسکریپت فوق بایستی بگوییم که ابتدا متغیری تعریف کرده تحت عنوان firstName$ و مقداری پیش‌فرض هم برای آن در نظر گرفته‌ایم؛ سپس متغیری ساخته‌ایم تحت عنوان checkIfVariableIsSet$ و مقدار آن را برابر با فانکشن ()isset قرار داده‌ایم و متغیر firstName$ را به عنوان پارامتر ورودی این فانکشن پاس داده‌ایم. پس از اجرای این اسکریپت در مرورگر، می‌بینیم که مقدار ۱ بازگردانده می‌شود.

در حقیقت، خروجی فانکشن ()isset بولینی است؛ به عبارت دیگر، خروجی این فانکشن یا true است یا false که اگر true باشد مقدار ۱ و در غیر این صورت مقدار ۰ بازگردانده می‌شود (البته مقدار ۰ در خروجی نمایش داده نمی‌شود).

نکته
در برنامه‌نویسی از فعل Pass به معنی «پاس دادن» به کرات استفاده می‌شود. در واقع، زمانی که مثلاً پارامتری را به عنوان ورودی یک فانکشن در نظر می‌گیریم، اصطلاحاً گفته می‌شود که آن پارامتر به فانکشن مد نظر پاس داده شده است.

حال اسکریپت فوق را به صورت زیر ریفکتور می‌کنیم:

$firstName = 'Behzad';
$checkIfVariableIsSet = isset($firstName);
echo $checkIfVariableIsSet;
unset($firstName);
echo $firstName;

به عنوان خروجی اسکریپت فوق داریم:

1
Notice: Undefined variable: firstName in /var/www/sokanacademy-php-course/index.php on line 6

همان‌طور که می‌بینیم، پس از آپدیت، از فانکشن ()unset استفاده کرده و متغیر firstName$ را به عنوان پارامتر ورودی آن در نظر گرفته‌ایم. کاری که این فانکشن انجام می‌دهد این است که به کلی متغیر را از داخل حافظه پاک می‌کند؛ از این پس، اگر بخواهیم مجدد این متغیر را echo کنیم، می‌بینیم که با اروری مواجه می‌شویم حاکی از آنکه چنین متغیری اصلاً وجود خارجی ندارد!

آشنایی با فانکشن ()empty در زبان PHP
برای اینکه چک کنیم ببینیم آیا یک متغیر Empty (خالی) است یا خیر، می‌بایست از فانکشنی تحت عنوان ()empty استفاده کنیم:

$firstName = 'Behzad';
$checkIfVariableIsEmpty = empty($firstName);
echo $checkIfVariableIsEmpty;

به عنوان خروجی اسکریپت فوق هیچ چیزی مشاهده نمی‌شود چرا که متغیر مد نظر خالی نیست. در حقیقت اگر متغیر خالی باشد، این فانکشن مقدار true و اگر پر باشد مقدار false را باز می‌گرداند و از آنجا که در مثال فوق متغیر پر است، مقدار false بازگردانده شده که معادل عددی آن برابر با ۰ است که این مقدار هم در خروجی چاپ نخواهد شد. حال اسکریپت فوق را به صورت زیر آپدیت می‌کنیم:

$firstName = '0';
$checkIfVariableIsEmpty = empty($firstName);
echo $checkIfVariableIsEmpty;

به عنوان خروجی اسکریپت فوق داریم:

1

ما مقدار ۰ را برای متغیر خود در نظر گرفته‌ایم و زمانی که آن را به عنوان پارامتر ورودی به فانکشن ()empty پاس می‌دهیم، این فانکشن مقدار ۱ را باز می‌گرداند؛ به عبارت دیگر، این فانکشن به ما اعلام می‌کند که متغیر firstName$ خالی است اما این در حالی است که اینگونه نیست!

هشدار
یک از رفتار‌های عجیب و غریب فانکشن ()empty این است که مقدار ۰ را خالی در نظر می‌گیرد و همین مسئله بسیاری از دولوپرهای تازه‌کار PHP را دچار سردرگمی می‌سازد. در همین راستا، فانکشن ()emtpy راه‌کار خوبی برای چک کردن اینکه یک متغیر آیا Set (مقداردهی) شده است یا خیر نمی‌باشد!

آشنایی با متغیر‌های Super Global
در زبان PHP یکسری متغیرهای از پیش تعریف شده داریم تحت عنوان Super Global که از هر جایی در اسکریپت در دسترس هستند که در جدول زیر به معرفی آنها به همراه عملکردشان پرداخته‌ایم:

توضیحات نام
حاوی کلیهٔ اطلاعات فرم‌های HTML است که با استفاده از متد GET ارسال می‌شوند. GET_$
حاوی کلیهٔ اطلاعات فرم‌های HTML است که با استفاده از متد POST ارسال می‌شوند. POST_$
حاوی کلیهٔ متغیرهایی که در اسکوپ گلوبال موجود هستند. GLOBALS$
حاوی اطلاعات فایل‌هایی است که قرار است روی سرور آپلود شوند. FILES_$
حاوی ترکیبی از اطلاعات GET ،$_POST_$ و COOKIE_$ است. REQUEST_$
حاوی کوکی‌هایی است که از طرف مرورگر ارسال می‌شوند. COOKIE_$
حاوی اطلاعات ذخیره شده در سِشِن است. SESSION_$
حاوی اطلاعاتی همچون آدرس IP و دیگر اطلاعات مرتبط با سرور است. SERVER_$
حاوی اطلاعات مرتبط با Environment Variables است که برای PHP ارسال می‌شوند. ENV_$

به عنوان مثال، متغیر سوپر گلوبال SERVER_$ دارای چندین Key (کلید) مختلف است که حاوی اطلاعات ارزشمندی برای دولوپرها است که در ادامه بیشتر با آنها آشنا خواهید شد:

echo $_SERVER['SERVER_NAME'];
echo "
";
echo $_SERVER['SERVER_SOFTWARE'];
echo "
";
echo $_SERVER['REQUEST_METHOD'];
echo "
";
echo $_SERVER['REQUEST_TIME'];
echo "
";
echo $_SERVER['DOCUMENT_ROOT'];
echo "
";
echo $_SERVER['HTTP_USER_AGENT'];
echo "
";
echo $_SERVER['SCRIPT_NAME'];

به عنوان خروجی اسکریپت فوق داریم:

localhost
Apache/2.4.27 (Ubuntu)
GET
1513764118
/var/www
Chrome/63.0.3239.108 Safari/537.36
/sokanacademy-php-course/02/variable/index.php

- آشنایی با کلید SERVER_NAME: این کلید نام سروری که اسکریپت مد نظرمان داخل آن در حال اجرا است را باز می‌گرداند.

- آشنایی با کلید SERVER_SOFTWARE: این کلید اطلاعاتی در مورد نرم‌افزاری که اسکریپت‌مان روی آن در حال اجرا است را باز می‌گرداند.

- آشنایی با کلید REQUEST_METHOD: این کلید متدی که اسکریپت با استفاده از آن اجرا شده است را در معرض دید دولوپر می‌گذارد.

- آشنایی با کلید REQUEST_TIME: این کلید زمانی که اسکریپت مد نظر اجرا شده است را نشان می‌دهد.

- آشنایی با کلید DOCUMENT_ROOT: این کلید دایرکتوری روت (اصلی) که اسکریپت داخل آن قرار گرفته است را مشخص می‌سازد.

- آشنایی با کلید HTTP_USER_AGENT: این کلید اطلاعاتی در مورد مرورگری که اسکریپت از طریق آن اجرا شده است را مشخص می‌سازد.

- آشنایی با کلید SCRIPT_NAME: این کلید مسیر و نام اسکریپتی که در حال اجرا است را باز می‌گرداند.

برای کسب اطلاعات بیشتر، به لینک Superglobals در سایت رسمی PHP مراجعه نمایید.

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
محسن
محسن
در مورد نامگذاری متغیرها در زبان PHP مورد دیگه ای هم هست که نام متغیر با اعداد نمی تونه شروع بشه و اسپیس هم در نام متغیر مجاز نیست

همینطور بهتر هست نام متغیر گویای مقدار یا عملکرد اون باشه


و البته از عبارات رزرو شده هم نمی شه به عنوان نام متغیر استفاده کرد
Insight
Insight
یکی از تفاوت های زبان پی‌اچ‌پی با سایر زبان های برنامه‌نویسی یا اسکریپتینگ رفتاری‌ست که در حساسیت به بزرگی و کوچکی حروف داره. اکثر زبان‌های دنیا، Case-Sensitive هستن و برخی دیگه مثل HTML، اینطور نیستن.
اما زبان پی‌اچ‌پی عملکرد متفاوتی داره. اصولا در مورد چیزهایی که اصطلاحا user-defined هستن، Case-Sensitive و در مورد کلماتی که در خود پی‌اچ‌پی تعریف شدن (مثل نام توابع) Case-Insensitive هست.
کاربر میهمان
کاربر میهمان
echo 'My firstname is ' . $firstName . ' and my lastname is ' . $lastName;
به طور کلی دستور اکو با شیوه پایین سریعتراز بالا کار میکند
echo 'My firstname is ' , $firstName , ' and my lastname is ' , $lastName;

چون 4 بار عمل الحاق رشته در بالایی رخ میدهد و در پایینی صرفا 4بار عمل چاپ انجام میشود.

------------

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

یوزر میتونه با var_dump($_SERVER); تمام اندیسهایی رو که از وب سرور گرفته میشه رو چک بکنه.

با تشکر محمود اسکندری 👍