داده ها در زبان های برنامه نویسی، انواع مختلفی دارند، مثل نوع رشته ای، عددی، ...
در زبانی مانند C، وقتی میخواهید یک متغیر از نوع عدد صحیح(Integer) تعریف کنید، دستور int a;
را مینویسید. (چون قراره، داده ی عددی داخلش بریزید.)
یا متغیری از نوع رشته ای را بصورت string b;
تعریف میکنید. (چون قراره، یک نوع رشته ای را به آن اختصاص دهید.)
همانطور که در جلسه ی قبل دیدید، زبان PHP برخلاف زبان C، وقتی متغیری تعریف میکنیم، نمیگوئیم نوع متغیر چیست و چه نوع داده ای در این متغیر مجاز است.
PHP جزو زبان های Loosely Typed میباشد و نیازی نیست نوع متغیرها را ذکر کنیم.
به مثال زیر توجه کنید:
$a_bool = true; // a boolean
$a_str = "mohsen"; // a string
$an_int = 12; // an integer
در مثال بالا، سه متغیر تعریف کرده ایم که دارای سه نوع مختلف(بولین، رشته، عدد صحیح) میباشد.
زبان PHP از 9 نوع داده، پشتیبانی میکند. در ادامه، انواع داده ها را بررسی کرده ایم.
1. نوع Boolean:
ساده ترین نوع در متغیرهای PHP، متغیرهای بولی هستند. متغیر بولین، درست یا غلط بودن را بیان میکند. بنابراین یا میتوانند true
باشند یا false
TRUE
و FALSE
به حروف کوچک و بزرگ حساس نیستند و اصطلاحاً case-insensitive هستند.<?php
$a = TrUe;
$b = falsE;
$c = true;
echo $a; // 1
2. نوع Integer:
* متغیری از نوع عدد صحیح، بازه ی ℤ = {..., -2, -1, 0, 1, 2, ...}
را میگیرد.
* متغیرهای صحیح میتوانند در مبناهای 10 و 16 و 8 و 2 تعریف شوند.
+ برای تعریف عددی در مبنای 8، کافیست عدد را با 0
شروع کنید: $octal = 0567;
+ برای تعریف عددی در مبنای 16، کافیست عدد را با 0x
شروع کنید: $hexadecimal = 0x1f;
+ برای تعریف عددی در مبنای باینری، کافیست عدد را یا 0b
شروع کنید: $binary = 0b1011;
* با قرار دادن علامت (+ و -) میتوانید عدد مثبت یا منفی، تعریف کنید: $a = -123;
<?php
$a = 1234; // decimal number
$a = -123; // a negative number
$a = 0123; // octal number (equivalent to 83 decimal)
$a = 0x1A; // hexadecimal number (equivalent to 26 decimal)
$a = 0b11111111; // binary number (equivalent to 255 decimal)
خط 2: یک متغیر integer با مقدار مثبت، تعریف شده است. $a = 1234;
خط 3: یک متغیر integer با مقدار منفی، تعریف شده است. $a = -123;
خط 4: یک متغیر integer در مبنای 8، تعریف شده است. $a = 0123;
خط 5: یک متغیر integer در مبنای 16، تعریف شده است. $a = 0x1A;
خط 6: یک متغیر integer در مبنای 2، تعریف شده است. $a = 0b11111111;
01282
را 012
در نظر میگرفت. اما از PHP 7 اگر رقم غیر مجازی استفاده کنید، با خطای Parse error: Invalid numeric literal
مواجه میشوید.
هر متغیر، برای ذخیره کردنِ مقداری در حافظه ی RAM (سرور)، دارای ظرفیتی است.
ظرفیت متغیرها به نوع سیستم عامل سرور بستگی دارد.
سؤال: چرا سرور؟
پاسخ: بدلیل اینکه، کدهای شما روی سرور تفسیر میشوند و در نتیجه از منایع سرور استفاده میشود.
ظرفیت متغیر integer در سیستم عامل 32 بیتی به اندازه ی 4 بایت میباشد. (32 خانه ی 0 و 1)
اما از آنجایی که زبان PHP، فقط متغیرهای عددی علامت دار(signed) را پشتیبانی میکند و بدون علامت(unsigned) را پشتیبانی نمیکند، بنابراین، 1 بیت از 32 بیت، مخصوص علامت است.(+ و -)
حالا اگر 31 خانه را با بیشترین مقدار یعنی مقدار 1 در نظر بگیرید: 1111111111111111111111111111111 = 2147483647
نتیجه 1: در سیستم عامل 32 بیتی، متغیرهای integer در بازه ی -2147483647 , ... , +2147483647
مقدار دهی میشوند.
نتیجه 2: اما در سیستم عامل های 64 بیتی، متغیرهای integer در بازه ی -9223372036854775807 , ... , +9223372036854775807
مقدار دهی میشوند.
* ثابت PHP_INT_SIZE
به سایز یک متغیر integer در سرور، اشاره میکند.
* ثابت PHP_INT_MAX
به حداکثر مقداری که میتوان به یک متغیر integer اختصاص داد، اشاره میکند.
* ثابت PHP_INT_MIN
به حداقل مقداری که به یک متغیر میتوان اختصاص داد، اشاره میکند.
PHP_INT_MIN
از PHP 7.0.0 اضافه شده است.<?php
echo PHP_INT_SIZE; // 8 Byte
echo '<br>';
echo PHP_INT_MAX; // +9223372036854775807
Integer overflow: (سرریز شدن)
همانطور که توضیح دادم، متغیر Integer دارای ظرفیتی میباشد. حالا اگر عددی استفاده کنیم که بیشتر از ظرفیت Integer باشد، اصطلاحاً Overflow اتفاق می افتد.
به علت زیاد شدن 0 و 1 ها، ظرف Integer لبریز میشود و در نتیجه بعنوان مقدار Float تفسیر خواهد شد.
var_dump()
وجود دارد که اطلاعاتی در مورد یک متغیر، نشان میدهد.مثال زیر مربوط به سرریز شدن Integer در سیستم 32 بیتی است:
<?php
$large_number = 2147483647;
var_dump($large_number); // int(2147483647)
$large_number = 2147483648;
var_dump($large_number); // float(2147483648)
خط 2: مقدار MAX در سیستم 32 بیتی را اختصاص داده است.
خط 3: تابع var_dump($large_number);
نشان میدهد، متغیر Integer است.
خط 5: یک واحد بیشتر از مقدار قبلی را اختصاص داده است.
خط 6: میبینید که overflow اتفاق افتاده و تابع var_dump()
میگوید متغیر Float است.
مثال زیر برای سیستم های 64 بیتی:
<?php
$large_number = 9223372036854775807;
var_dump($large_number); // int(9223372036854775807)
$large_number = 9223372036854775808;
var_dump($large_number); // float(9.2233720368548E+18)
3. نوع Float:
اعداد اعشاری بعنوان Float یا Double شناخته میشوند.
<?php
$a = 12.75;
var_dump($a); // float(12.75)
$b = 0.0001;
var_dump($b); // float(0.0001)
$c = 0.0;
var_dump($c); // float(0)
$d = 1.;
var_dump($d); // float(1)
$e = -0.9e-2;
var_dump($e); // float(-0.009)
در مثال بالا، روش های مقدار دهی اعداد Float را مشاهده میکنید.
4. نوع String:
به مجموعه ای از کاراکتر ها (از قبیل حرف، عدد، علامت)، یک string (رشته) میگویند.
در PHP، رشته ها در داخل '...'
(single quotes) یا "..."
(double quotes) قرار میگیرند.
در مثال زیر، رشته ها را داخل single quote تعریف میکنیم:
<?php
$string_1 = 'bithub.ir'; // var_dump: string 'bithub' (length=9)
$string_2 = 'This is a simple string'; // var_dump: string 'This is a simple string' (length=23)
$string_3 = 'به سایت بیت هاب خوش آمدید.'; // var_dump: string 'به سایت بیت هاب خوش آمدید.' =>(length=46)<=
$string_4 = '12'; // var_dump: string '12' (length=2)
echo '/* string value */'; // output: /* string value */
echo 'Hello "World"'; // output: Hello "World"
echo 'Welcome to $string_1'; // output: Welcome to $string_1
حالا مثال قبلی را با double qoute میزنیم:
<?php
$string_1 = "bithub.ir"; // var_dump: string 'bithub' (length=9)
$string_2 = "This is a simple string"; // var_dump: string 'This is a simple string' (length=23)
$string_3 = "به سایت بیت هاب خوش آمدید."; // var_dump: string 'به سایت بیت هاب خوش آمدید.' =>(length=46)<=
$string_4 = "12"; // var_dump: string '12' (length=2)
echo "/* string value */"; // output: /* string value */
echo "Hello \"World\""; // output: Hello "World"
echo "Welcome to $string_1"; // output: Welcome to bithub.ir
اگر دقت کرده باشید، فقط خط 8 و 9 در حالت single quote و double quote با یکدیگر، متفاوت هستند.
5. نوع Array:
یک آرایه، گروهی از مقادیر را در خود نگه میدارد.
برای مثال اگر 5 مقدار داشته باشیم و بخواهیم در یک آرایه بریزیم، متغیر آرایه، 5 خانه برای آن 5 مقدار، داخل حافظه در نظر میگیرد.(مثل این میمونه که 5 متغیر را در 1 متغیر ریخته ایم.)
هر خانه از آرایه، از دوبخش index(یا key) و value تشکیل شده است. value مقداریست که در آن تکه از آرایه ریخته ایم. اما برای دسترسی به مقدار آن خانه (یا تکه)، کافیست که اندیس آن تکه از آرایه را صدا بزنیم.
فرم کلی برای تعریف یک آرایه، به شکل زیر است:
$variable_name = array(
key1 => value1,
key2 => value2,
key3 => value3,
);
حالا با توجه به فرم بالا، یک آرایه تعریف میکنیم:
<?php
$test = array(
1 => 'first value',
2 => 'second value',
3 => 'third value',
);
همانطور که در مثال میبینید، آرایه ای تعریف کردیم که 3 مقدار را در خود ذخیره کرده است.
برای چاپ اندیس های آرایه، به شکل زیر عمل میکنیم:
<?php
echo $test[1]; // first value
echo $test[2]; // second value
echo $test[3]; // third value
همانطور که میبینید، کافیست اندیس هر تکه از آرایه را ذکر کنیم.
حالا اگر خود متغیر $test
را echo
کنید چه اتفاقی می افتد؟
<?php
$test = array(
1 => 'first value',
2 => 'second value',
3 => 'third value',
);
echo $test; // Notice: Array to string conversion
با اجرای دستور echo $test;
خطای Notice: Array to string conversion
را دریافت میکنید.
علت: دستور echo
برای تولید خروجی، مقدار string میگیرد، اما در دستور بالا یک آرایه داده اید که دستور echo
نمیتواند آنرا به string تبدیل کند.
راهکار: برای چاپ کل مقادیر یک آرایه میتوانید از تابع print_r()
استفاده کنید.
<?php
$test = array(
1 => 'first value',
2 => 'second value',
3 => 'third value',
);
print_r($test);
خروجی کد بالا به شکل زیر است:
Array
(
[1] => first value
[2] => second value
[3] => third value
)
var_dump()
استفاده کنید: var_dump($test);
میتوانید به آرایه، اندیس رشته ای بدهید:
<?php
$arr = array(
'mohsen' => 'first value',
'ali' => 'second value',
'hasan' => 'third value',
20 => 'fourth value',
);
print_r($arr);
// Output:
/*
Array
(
[mohsen] => first value
[ali] => second value
[hasan] => third value
[20] => fourth value
)
*/
حالا اگر بخواهیم، اندیس mohsen را صدا بزنیم: $arr['mohsen']
نکته: اگر خانه های آرایه را اندیس گذاری نکنید، آرایه بطور خودکار از 0 شماره گذاری میشود:
<?php
$arr = array(
'first value',
'second value',
'third value',
'fourth value',
);
print_r($arr);
// Output:
/*
Array
(
[0] => first value
[1] => second value
[2] => third value
[3] => fourth value
)
*/
6. نوع NULL:
متغیری از نوع NULL، فقط یک مقدار دارد و آن هم مقدار NULL
میباشد.
<?php
$my_var = NULL;
var_dump($my_var); // null
ثابت NULL
به حروف بزرگ و کوچک، حساس نمیباشد و اصطلاحاً case-insensitive میباشد:
$var1 = NULL;
$var2 = null;
null
را با حروف کوچک بنویسید.unset()
حذف شده باشد، مقدارش null
است.
7. نوع Object:
یک شیء ساخته شده از کلاس را object میگویند. (جلسات آینده صبحت خواهیم کرد.)
برای ساخت شیء جدید، از دستورnew
استفاده میشود:
<?php
class Test
{
function sayHello()
{
echo 'Hello World';
}
}
$obj = new Test;
$obj->sayHello();
8. نوع Resource:
متغیر resource، منبعی است که خروجیِ توابعی مانند باز کردن فایل، اتصال از طریق ftp، اتصال به دیتابیس، اجرای کوئری و ... را در خود نگه میدارد.
مثال زیر را در نظر بگیرید:
<?php
$file = fopen('filename.txt', 'w');
var_dump($file); // resource
در مثال بالا، با استفاده از دستور fopen
فایلی را در حالت Write (نوشتن) باز کرده ایم. خروجی این تابع، یک resource است. (در این لینک لیست توابعی که resource تولید میکنند، قرار دارد.)
به این resource نمیتوان بصورت مستقیم، دسترسی داشت بلکه باید از توابع آن استفاده کرد.
برای مثال اگر بخواهم، داخل فایل چیزی بنویسم و فایل را ببندم:
<?php
$rs = fopen('filename.txt', 'w');
fwrite($rs, 'بیت هاب');
fclose($rs);
در جلسات بعدی با توابعی که خروجی resource تولید میکنند، بیشتر آشنا میشویم.
9. نوع Callback / Callable:
وقتی نام تابعی را بعنوان یک آرگومان به توابع دیگر ارسال میکنید، تا در پشت آن توابع، صدا زده شود و نهایتاً کدهایش اجرا شود، عمل callback انجام شده است.
پس تابعی که نامش بعنوان پارامتر ارسال میشود، تابع callback است و آن تابعی که تابع callback را صدا میزند، اصطلاحاً callback executer میگوئیم.
برای درک موضوع، به مثال زیر توجه کنید:
<?php
// The callback function
function myCallback()
{
echo 'Hello World!';
}
// The callback executer
function executeCallback($callback)
{
// call the callback
$callback();
}
executeCallback('myCallback'); // Hello World!
اگر به مثال توجه کنید میبینید، این نوع از داده مفهوم ساده ای دارد. البته مبانی توابع را هنوز نگفته ایم و فقط هدفمان، معرفی انواع داده ها بوده است.
در مثال زیر، callback در یکی از توابع خود PHP اتفاق می افتد:
<?php
// The callback function
function myCallback()
{
echo 'Hello World!';
}
// Simple callback
call_user_func('myCallback'); // Hello World!
تابع call_user_func()
توابع callback ای که ساخته اید را بعنوان پارامتر دریافت کرده و اجرا میکند.
نتیجه ی اجرای این کد، مانند مثال قبلی میباشد.
همچنین برای کسب اطلاعات بیشتر میتوانید، سایت مرجع را مطالعه کنید.
مطالب سایت را بدون ذکر منبع (http://bithub.ir) در جایی منتشر نکنید. با تیشکر.