💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۰ محسن موحد
معرفی انواع داده‌ها در زبان PHP (مقاله)
جامعه پی اچ پی ایجاد شده در ۰۱ دی ۱۳۹۸

داده‌ها در زبان‌های برنامه نویسی، انواع مختلفی دارند، مثل نوع رشته ای، عددی، ...
در زبانی مانند 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 بصورت اتومات، خودش نوع متغیر را تشخیص میدهد.

در مثال بالا، سه متغیر تعریف کرده ایم که دارای سه نوع مختلف(بولین، رشته، عدد صحیح) میباشد.

 

زبان PHP از 9 نوع داده، پشتیبانی میکند. در ادامه، انواع داده‌ها را بررسی کرده ایم.

 

1. نوع Boolean:

ساده‌ترین نوع در متغیرهای PHP، متغیرهای بولی هستند. متغیر بولین، درست یا غلط بودن را بیان میکند. بنابراین یا میتوانند true باشند یا false

نکته: ثابت های TRUE و FALSE به حروف کوچک و بزرگ حساس نیستند و اصطلاحاً case-insensitive هستند.

<?php
$a = TrUe;
$b = falsE;
$c = true;
echo $a; // 1

استاندارد نویسی: بر اساس توصیه ی PSR-2، ثابت های true و false را با حروف کوچک بنویسید.

 

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 5.4.0، اضافه شده اند.

<?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;

توجه: تا قبل از PHP 7، اگر رقم غیر مجازی در عدد مبنای 8 بکار میبردید(رقم‌های 8 و 9)، از آن رقم غیر مجاز به بعد حذف میشد. مثلاً 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 مقدار دهی میشوند.

نکته: سرورهای ویندوزی (چه 32 بیتی باشند، چه 64 بیتی) در نسخه‌های قبل از PHP 7، سایز متغیرها 32 بیت(4 بایت) محاسبه میشود. یعنی اگر روی ویندوز 64 بیتی، نسخه ی PHP 5.6 را راه اندازی کرده اید، سایز متغیرهای integer برابر 4byte خواهد بود.

* ثابت 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 تفسیر خواهد شد.

نکته: در PHP تابعی به نام 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 را مشاهده میکنید.

نکته: در PHP نوع float و double و real هیچ تفاوتی باهم ندارند و یکی هستند.

 

4. نوع String:

به مجموعه ای از کاراکتر‌ها (از قبیل حرف، عدد، علامت)، یک string (رشته) میگویند.
در PHP، رشته‌ها در داخل '...' (single quotes) یا "..." (double quotes) قرار میگیرند.

در مثال زیر، رشته‌ها را داخل single quote تعریف میکنیم:

<?php
$string_1 = '7learn.com'; // var_dump: string '7learn.com' (length=10)
$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 = "7learn.com"; // var_dump: string '7learn.com' (length=10)
$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 7learn.com

اگر دقت کرده باشید، فقط خط 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;

استاندارد نویسی: بر اساس توصیه ی PSR-2، ثابت 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, '7learn.com');
fclose($rs);

 

 

9. نوع Callback / Callable:

وقتی نام تابعی را بعنوان یک آرگومان به توابع دیگر ارسال میکنید، تا در پشت آن توابع، صدا زده شود و نهایتاً کدهایش اجرا شود، عمل callback انجام شده است.
پس تابعی که نامش بعنوان پارامتر ارسال میشود، تابع callback است و آن تابعی که تابع callback را صدا میزند، اصطلاحاً callback executer میگوئیم.

callback به معنیه called at the back میباشد.

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

<?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 ای که ساخته اید را بعنوان پارامتر دریافت کرده و اجرا میکند.
نتیجه ی اجرای این کد، مانند مثال قبلی میباشد.

در بخش معرفی توابع و همچنین بخش شیء گرائی، درباره ی callback ها، بیشتر توضیح میدهیم.

 

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