تعریف و استفاده از متغیر (Variable) در PHP

در بحث قبل از بخش آموزش مقدماتی PHP با کلیاتی از این زبان برنامه نویسی وب آشنا شدیم، گفتیم که PHP زبان سمت سرور (Server-side) است و پردازش آن توسط مفسر (Processor) سرور انجام و خروجی آن در نهایت به صورت کدهای HTML از سمت سرور به مرورگر (یا هر واسط کاربری دیگر) ارسال می شود، اکنون در ادامه آموزش های مقدماتی این بخش، می خواهیم با یکی از پرکاربردترین و متداول ترین مفاهیم در بین زبان های برنامه نویسی مختلف و به طور خاص برنامه نویسی PHP یعنی مفهوم متغیر (Variable) آشنا شویم که در نوشتن برنامه های کاربردی نقش کلیدی داشته و به دفعات مختلف در سورس کدهایمان تعریف و استفاده می شود، درک مبحث متغیر به عنوان مبحث پایه و مقدمه آشنایی با مباحث پیشرفته تر و پیچیده تر برنامه نویسی با PHP از اهمیت زیادی برخوردار است و توصیه می شود حتما پس از مطالعه و تمرین کافی به مباحث بعدی رجوع کنیم.
مفهوم عبارت متغیر در برنامه نویسی
متغیر (Variable) در برنامه نویسی به معنی نماد و نشانه ای است که در حین اجرای برنامه ها همواره می تواند مقادیر غیرثابت و تغییرپذیری داشته باشد، به طور مثال اگر برنامه ای بنویسیم که نمرات دانش آموزان را به عنوان ورودی دریافت و میانگین آنها را در خروجی چاپ کند، این ورودی و خروجی معمولا به صورت متغیر تعریف می شوند چرا که مقادیر دریافتی و مقدار نهایی ثابت نیست و از دانش آموزی به دانش آموز دیگر متفاوت خواهد بود، اگرچه زبان های برنامه نویسی مختلف از شیوه نگارش (Syntax) خاص خود برای تعریف متغیر استفاده می کنند، اما مفهوم و قاعده کلی بین آنها معمولا به همین صورت است که در بالا گفته شد.
آشنایی با کاربرد متغیر در PHP
متغیرها در PHP برای نگهداری مقادیر با انواع مختلف (رشته ای (String)، عددی (Int)، آرایه (Array)، بولین (Boolean) و...) به کار می روند، در واقع می توان گفت که متغیرها ظرف (Container) نگهداری اطلاعات مختلف یک برنامه تحت وب هستند که هر کجا نیاز باشد می توانیم به آنها دسترسی داشته و حتی محتوای آنها را تغییر دهیم، برای آشنایی با کاربرد متغیر در PHP یک مثال را با هم مرور می کنیم، در نمونه کد زیر تعداد کالاهای تولید شده توسط یک کارگاه فرضی در طی سه سال در متغیرهای مختلف قرار داده شده است، می خواهیم در خروجی میانگین تولیدات این کارگاه در طی سه سال را محاسبه کنیم:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | آشنایی با متغیر در PHP</title>
<!-- Webgoo.ir -->
<style type="text/css">
body {
font-family: Tahoma, Geneva, sans-serif;
direction: rtl;
font-size: 12px;
}
</style>
</head>
<body>
<?php
//تعداد تولیدات در طی سه سال به تفکیک سال
$factory_year_1 = 160;
$factory_year_2 = 185;
$factory_year_3 = 195;
//مجموع تولیدات
$factory_all = $factory_year_1 + $factory_year_2 + $factory_year_3;
//میانگین سه ساله
$factory_average = $factory_all / 3;
echo 'میانگین تولیدات در طی سه سال: ' . $factory_average;
?>
<hr>
متغیر در PHP با علامت $ در ابتدا شروع می شود، متغیر می تواند مقادیر عددی، رشته ای و... داشته باشد.<br>
زبان PHP را در اصطلاح HTML-embedded گویند، یعنی دستورات PHP را می توان در بین تگ های HTML نوشت و خروجی گرفت.
</body>
</html>
پیش نمایشتحلیل کد بالا چندان سخت نیست، ابتدا سه متغیر با نام های دلخواه factory_year_1، factory_year_2، factory_year_3 با مقادیر عددی تعریف کرده ایم که تعداد تولیدات یک کارگاه فرضی را در خود نگهداری می کنند:
$factory_year_1 = 160;
$factory_year_2 = 185;
$factory_year_3 = 195;
در گام بعد مجموع تولیدات کارگاه را در متغیری با نام factory_all محاسبه کرده ایم:$factory_all = $factory_year_1 + $factory_year_2 + $factory_year_3;
در نهایت در متغیر factory_average میانگین سه ساله را محاسبه و با دستور echo از آن خروجی گرفته ایم:$factory_average = $factory_all / 3;
echo 'میانگین تولیدات در طی سه سال: ' . $factory_average;
نکته 1: در خصوص علامت های محاسباتی (جمع، تفریق، ضرب، تقسیم و...) PHP در آموزش های بعدی به صورت جداگانه صحبت خواهیم کرد.نکته 2: مانند اغلب زبان های برنامه نویسی اگر مقادیر متغیر بین علامت های '' (single quotation) یا "" (double quotation) قرار گیرد، نوع متغیر رشته متنی (String) خواهد بود، به همین ترتیب اگر مقدار متغیر یک عدد باشد نوع آن عددی (Int) تفسیر می شود.
نکته 3: در PHP چند دستور مختلف برای گرفتن خروجی وجود دارد، از جمله print، print_r و echo، در حالت معمول استفاده از echo توصیه می شود (echo از print سریعتر و انعطاف پذیرتر است و چند پارامتر مختلف را می توان با آن به خروجی ارسال کرد، اما print تنها یک پارامتر می پذیرد و در صورت اجرای صحیح، مقادیر 1 را به عنوان نتیجه برمی گرداند).
شیوه های نگارش (Syntax) و استفاده از متغیر در PHP
تعریف و استفاده از متغیرها در PHP مانند هر زبان برنامه نویسی دیگر دارای اصول و شیوه نگارش (Syntax) خاص خود است که در زیر به اختصار آنها را مرور می کنیم:
- متغیر در PHP با علامت $ (dollar) در ابتدا و سپس نام متغیر تعریف و مقدار آن با علامت = اختصاص داده می شود.
- PHP به بزرگ یا کوچک بودن حروف متغیرها حساس است (case-sensitive).
- نام متغیرها در PHP می تواند شامل حروف انگلیسی (a-z A-Z)، اعداد (9-0) و علامت _ (underscore) باشد.
- شروع نام متغیر در PHP نباید با اعداد باشد، به طور مثال این شیوه نامگذاری صحیح نیست:
$1_test = 1;
چند مثال از نحوه صحیح تعریف و استفاده از متغیر در PHP:$my_var = 'learning PHP is easy!';
$count = 200;
$count_1 = 200;
$count_2 = 300;
$result = $count_1 + $count_2;
$var = 1;
$VAR = 2;
$_php_step = 'PHP Step: ' . 2;
- کدنویسی در زبان PHP معمولا سختگیری های زبان هایی مانند C، C++، Java و... را ندارد، در این زبان ها هنگام تعریف متغیر باید نوع آن را نیز مشخص کنیم (به فرض رشته، عدد، آرایه و...)، اما در PHP این کار به صورت خودکار انجام می شود، در مثال زیر کد اول مربوط به تعریف و استفاده از متغیر در زبان Java و کد دوم مربوط به تعریف و استفاده از همان متغیر در زبان PHP است:int number;
number = 5;
number = number + 10;
System.out.println(number);
$number = 5;
$number = $number + 10;
echo $number;
- در صورتی که متغیر PHP در علامت های '' (single quotation marks) قرار داده شود، اثر خود را از دست می دهد و مانند یک عبارت متنی در خروجی چاپ خواهد شد، مثال:<?php
/*
خروجی برابر با:
My Country is $country
*/
$country = 'Iran';
$str = 'My Country is $country';
echo $str;
?>
- برای چاپ مقادیر متغیر در خروجی یا باید آن را در بین علامت های "" (double quotation marks) قرار دهیم یا اینکه با علامت . (نقطه) مقادیر رشته ای داخل '' (single quotation marks) را با متغیر ترکیب نمائیم، مثال:<?php
/*
خروجی برابر با:
My Country is Iran
*/
$country = 'Iran';
$str = "My Country is $country";
echo $str;
?>
<?php
/*
خروجی برابر با:
My Country is Iran
*/
$country = 'Iran';
$str = 'My Country is ' . $country;
echo $str;
?>
متغیرهای از پیش تعریف شده (Predefined Variables) در PHP
در هنگام تعریف و استفاده از متغیرها در PHP باید دقت داشته باشیم برخی عبارات و نام ها از قبل توسط مفسر PHP رزرو شده اند (Reserved Predefined Variables) و دارای مفهوم و کارکرد خاصی هستند، به طور مثال متغیرهایی که به آنها در اصطلاح Superglobals گفته می شود و در همه قسمت های برنامه در دسترس هستند:
$GLOBALS
$_SERVER
$_GET
$_POST
$_FILES
$_COOKIE
$_SESSION
$_REQUEST
$_ENV
برای مشاهده جزئیات بیشتر در این خصوص می توانیم به راهنمای سایت php.net در آدرس زیر مراجعه کنیم:http://php.net/manual/en/reserved.variables.php
حدود دسترسی (Scope) متغیرها در PHP
در زبان های برنامه نویسی جهت کنترل دقیق بر روی عناصر مختلف یک برنامه مبحثی تحت عنوان حدود دسترسی یا Scope وجود دارد که به طور خلاصه مشخص کننده این است که یک متغیر، آبجکت و... در کدام قسمت از برنامه در دسترس و قابل استفاده باشد، به طور مثال متغیرها در PHP در حالت عادی به صورت Global تعریف می شوند و در همه قسمت ها در دسترس هستند، البته برای این گفته مثال های نقض وجود دارد، از جمله اینکه متغیر تعریف شده در خارج از یک تابع، درون تابع به صورت معمول قابل استفاده نیست:
<?php
$a = 10;
function myFunc(){
$b = $a * 2;
return $b;
}
echo myFunc();
?>
در صورت اجرای کد بالا با خطای زیر مواجه خواهیم شد:Notice: Undefined variable: a
اما اگر نیاز به دسترسی به متغیر خارج از تابع باشد، PHP برای این شیوه دسترسی به متغیرها راهکارهایی در نظر گرفته است، از جمله استفاده از عبارت global در ابتدای نام متغیر:<?php
$a = 10;
function myFunc(){
global $a;
$b = $a * 2;
return $b;
}
echo myFunc();
?>
خروجی کد بالا عدد 20 خواهد بود.مبحث Scope در PHP جزئیات بیشتری از آنچه گفته شد دارد که در حال حاضر به جهت جلوگیری از پیچیده شدن آموزش ها به همین حد اکتفا می کنیم، در خلال مباحث بعدی به صورت موردی به این موضوع خواهیم پرداخت، جهت آشنایی بیشتر مراجعه به آدرس زیر مفید خواهد بود:
http://php.net/manual/en/language.variables.scope.php
مثال و پیش نمایش آنلاین
برای جمع بندی مطالب این قسمت از آموزش ها، یک مثال کاربردی از مبحث متغیرها در PHP را به همراه پیش نمایش آنلاین آن مرور می کنیم:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | شیوه های تعریف و استفاده از متغیر در PHP</title>
<!-- Webgoo.ir -->
<style type="text/css">
body {
font-family: Tahoma, Geneva, sans-serif;
direction: rtl;
font-size: 12px;
}
.ltr {
display: inline-block;
direction: ltr;
}
</style>
</head>
<body>
<?php
$_1 = 1;
echo 'چاپ متغیر:[<div class="ltr">$_1</div>]<br>' . $_1;
echo '<hr>';
$name = 'user';
echo 'چاپ متغیر:[<div class="ltr">$name</div>]<br>' . $name;
echo '<hr>';
$section = 'آموزش مقدماتی';
$category = 'PHP';
$lesson = 2;
echo 'چاپ متغیر:[<div class="ltr">$section . \' \' . $category . \' درس \' . $lesson</div>]<br>' . $section . ' ' . $category . ' درس ' . $lesson;
echo '<hr>';
function testScope(){
$result = null;
if(defined(@$name)){
$result = 'متغیر <div class="ltr">$name</div> در دسترس است!';
} else{
$result = 'متغیر <div class="ltr">$name</div> در دسترس نیست!';
}
$result .= '<br>';
$result .= 'نکته: زمانی که در قسمت echo از علامت single quotation marks استفاده می کنیم، برای درج single quotation های دیگر در این قسمت باید با بک اسلش اثر آنها را خنثی کنیم، در غیر اینصورت خطای Syntax خواهیم داشت، در قسمت خروجی این مثال از این شیوه استفاده شده است.';
$result .= '<hr>';
return $result;
}
echo 'حد دسترسی به متغیر یا Scope:<br>';
echo testScope();
echo 'حساس بودن PHP به بزرگ یا کوچک بودن حروف متغیر:<br>';
$case = 'case';
$Case = 'Case';
echo $case . ' != ' . $Case;
echo '<hr>';
echo 'سورس کدهای این مثال را در برنامه های ویرایشگر PHP مانند برنامه PhpStorm وارد کنید تا به صورت دقیقتری با جزئیات و Syntax ها آشنا شوید.';
?>
</body>
</html>
پیش نمایش آنلایننکته: علامت @ (at sign) برای کنترل (Suppress) عدم نمایش خطاهای Notice در خروجی استفاده می شود، به فرض اگر متغیری در کدها به نحوی تعریف یا مقداردهی شده باشد که امکان دارد در هنگام اجرای برنامه آن متغیر یا مقدار فراهم نشود می توانیم برای عدم نمایش خطای Notice توسط مفسر PHP از علامت @ در جایی که پارامتر به کار می رود استفاده کنیم، در مثال بالا برای متغیر name در تابع testScope از این کاراکتر استفاده کرده ایم.

حلقه for، foreach و while در PHP
توابع (Functions) در PHP
توابع کار با آرایه در PHP - بخش سوم
دستور switch و case در PHP
توابع کار با آرایه در PHP - بخش اول


من در قدیم سیستم مدیریت محتوا استفاده میکردن که وقتی متغیر بدون محتوا ایجاد میکردی ارور نمیداد و نیازی هم به @ قبلش نبود ! ارورها هم بسته نبود! کاری میشه کرد که متغییر خالی تعریف کنیم و @ نذاریم و ارور نداشته باشیم ؟!؟؟؟ کدی برای این کار هست!
مثلا من تمام یه جدول بانک متغیر میکنم تو حالت عادی همشون خالی تا من اطلاعات واردش کنم برای همین باید همرو یه بار تعریف کنم با @ و بعد کارم بکنم میخوام این اتفاق نیوفته و نیازی به تعریف تک تک متغییرها نباشه.
error_reporting(0);
اگر بخواهیم فقط خطاهای کم اهمیت نمایش داده نشوند می توانیم از نمونه دستور زیر استفاده کنیم:error_reporting(E_ERROR | E_WARNING | E_PARSE);
اطلاعات بیشتر:https://www.php.net/manual/en/function.error-reporting.php
علاوه بر این برخی برنامه های مدیریت محتوا مثل وردپرس تنظیمات اختصاصی خود را دارند، به فرض در فایل wp-config.php خطوط زیر مربوط به نمایش یا عدم نمایش خطاها است که با مقدار true و false فعال و غیرفعال می شوند:define('WP_DEBUG', false);
define('WP_DEBUG_DISPLAY', false);
<?php
$var_1 = 'hello';
$var_2 = 'world';
echo $var_1 . ' ' . $var_2;
?>
فایل منجر باید با دیتابیس کار کنه؟ یعنی باید آدرس فایلها رو در دیتابیس ذخیره کنیم حتما؟ چیزی که من نوشتم فقط بوسیله فایل سیستم هست و هیچ ارتباطی با دیتابیس نداره و آدرس فایل ها هم میتونیم مثل یه فهرست داشته باشیم ، این درسته ؟
خیلی ممنون
خیلی ممنون استاد عزیز
استاد این سوالو قبلا هم پرسیدم ولی به جواب نرسیدم میخوام داخل جدول بر اساس ایمیل یه جستجو انجام بدم ، مقدار ایمیل رو با متد گت و ایجکس میفرستم به php ولی نقطه ای که داخل ایمیل هست رو تبدیل میکنه به اسلش ، نمیدونم چکارش کنم این حالتی میگیرمش مثلا ایمیل
aaaa@gmail.com
هست و من اینجوری $_GET['email']
میگیرمش ولی تبدیل میشه به aaaa@gmail/com
خواستم اسلشارو با نقطه جابجا کنم ولی در یه جدول دیگه میخوام با آدرس یوآرال سرچ انجام بدم که اون به هم میخوره :)) مثل پت و مت عمل کردم ، اینو چکار کنم استاد عزیز؟لطفا راهنمایی بفرمایید که چه زمانی قبل از متغیر @ استفاده می شه و کاربردش چیه؟
با تشکر
<?php
echo @$hello;
$param = @$_GET['q'];
if(1 != 1){
$var = 1;
}
echo @$var;
$array = array(1, 2, 3);
echo @$array[5];
?>
به این صورت خطاهایی که کنترل شده هستند می توانند نادیده گرفته شوند.if(isset($_GET['id_charity'])) {
من در یک شرط id را دریافت کردم و چند دستور رو انجام دادم برای شرط بعدی باز نیاز به مقدار id دارم که در شرط بالا مقدار دهی شده چگونه میتوانم به اون مقدار دسترسی پیدا کنم؟$id_charity = null;
if(isset($_GET['id_charity'])) {
$id_charity = $_GET['id_charity'];
}
if($id_charity !== null){
echo $id_charity;
}
$var = 1;
echo 'this is $var';
echo "this is $var";
خروجی در حالت اول:this is $var
خروجی در حالت دوم:this is 1
همچنین می توانیم از کاراکترهای خاص مانند \n
برای ایجاد خط جدید و مواردی از این دست در حالت دابل کوتیشن استفاده کنیم:echo 'this is ' . $var . "\n";
از سینگل کوتیشن معمولا برای ترکیب رشته متنی صرف و متغیرها در PHP استفاده می شود، به فرض:$var_1 = 1;
$var_2 = 2;
echo 'this is var 1: ' . $var_1 . ' and this is var 2: ' . $var_2;
من میخوام برای یک متغیر دو تا مقدار تعیین کنم
مثلا
$abc = "a"
و در همون حین $abc = "b"
هم باشه واضح تر بگم میخوام بگم اگه متغیر مساوی با میزانی که براش تعیین کردم شد، اونوقت یه کد خاص رو اجرا کنه، وقتی از دستور || یا && استفاده میکنم هنگام تعیین مقدار، برنامه به اشتباه در ازای تمام مقادیر اون کد رو اجرا میکنه نه اون تعداد مقادیری که من تعیین کردم$var = array('a', 'b');
if(in_array('c', $var)){
} else{
}
webgoo.ir/help
در کل باید صبور باشید و گام به گام مباحث را یاد بگیرید و به اندازه کافی تمرین و تکرار داشته باشید، در این صورت روند برنامه نویسی وب بسیار روان و شیرین خواهد بود.من میخوام از متغیرها در دستورهای mysql استفاده کنم مثلا :
SELECT name FROM mutable WHERE id=$x
ولی ارور میده و برنامه اجرا نمیشهSELECT name FROM mutable WHERE id = '$x'
نکته: در صورت استفاده مستقیم از متغیر در پرس و جو جهت حفظ امنیت دیتابیس حتما باید از توابع ایمن سازی مانند mysqli_real_escape_string استفاده کنید، البته شیوه توصیه شده ایمن سازی پرس و جوها استفاده از Bind و Prepared Statement است که در آموزش های مقدماتی MySQL به طور مفصل توضیح داده شده است.در بعضی از کدهای پی اچ پی دیدم که ادرس دهیش مثلا اینجوریه
<script type="text/javascript" src="http://sait.ir/99999/999.php?url=88888.ir&sh2=1&sh2=1&sh3=1"></script>
به اینصورت هست که با اضافه کردن متغیرهایی که میبینید که در کد بصورت sh1 و sh2 تعیین شده میشه نتیجه خروجی فایل پی اچ پی رو تغییراتی داد بنده زیاد وارد نیستم و به اصطلاحات هم اشنایی چندانی ندارم ممنون میشم با زبانی ساده بهم اموزشش بدید اگه اموزشهاتون هم هزینه داره بفرمایید تا تقدیم کنم عزیز خواهش میکنم این موضوع خیلی برام مهمه مدتهاست دنبال این راه میگردم یدنیا ممنون میشم اگه راهنماییم کنید
ایمیل هم گذاشتم اگه خبرم کنید واقعا ممنون میشم موفق باشید
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.