مهدی عادلی فر
بنیانگذار توسینسو و برنامه نویس

معرفی ویژگی های جدید PHP ( پی اچ پی ) نسخه 7

تا چند سال پیش از نسخه 5 زبان PHP استفاده می شد. ولی از سال 2015 نسخه 7 این زبان ارائه شد که نسبت به ورژن قبل خود از سرعت و کارایی بسیار بالاتری برخوردار است. در این مطلب چند ویژگی برنام نویسی که در نسخه 7 افزوده شده است را معرفی می کنیم.

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

مشخص کردن نوع داده‌ ها

تا قبل از نسخه 7 امکان اینکه در PHP نوع ورودی توابع را تعریف کنیم وجود نداشت. مفسر PHP با توجه به مقداری که داخل متغیر ریخته می‌شد نوع داده را انتخاب می‌کرد. و وقتی که آن مقدار عوض می‌شد نوع داده نیز با توجه به داده جدید تغییر داده می‌شد. در نسخه 7 می‌توان نوع داده را در ورودی توابع و نوع بازگشتی توابع را مشخص نمود. انواع داده‌ای که در این زبان وجود دارد عبارتند از:

  • رشته‌ها (string)
  • عدد صحیح (int)
  • اعداد اعشاری (float)
  • مقادیر منطقی (bool)

البته باید دقت کرد که این تعیین نوع مقادیر فقط در توابع وجود دارد و در تعریف متغیرها این امکان وجود ندارد. برای مثال به کد زیر دقت کنید :

function returnsum(float $x, int $y)
{
    return $x + $y;
}
echo returnsum(6, "8.3");
//output float(14)
echo "<br/>";
echo returnsum(4.1, "4.2");
//output float(8.3)

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

declare(strict_types=1);
function returnsum(float $x, int $y)
{
    return $x + $y;
}
echo returnsum(6, 2.5);
//Fatal error
echo "<br/>";
echo returnsum(4.1, "4.2");
// Fatal error

اضافه کردن خط اول در کد بالا باعث می‌شود که مقادیری را که برای ورودی y مشخص کرده‌ایم خطا بدهد. دلیل این خطا هم این است که در فراخوانی اول مقدار 2.5 به y داده شده است در حالی که نوع داده y از نوع عدد صحیح تعریف شده است و در فراخوانی دوم دلیل خطا این است که یک رشته به مقدار عدد صحیح داده شده است. پس دیدیم که اگر بخواهیم قید سخت‌گیری برای انواع داده داشته باشیم باید خط اول را ابتدای برنامه اضافه کنیم. همچنین برای تعیین نوع مقدار بازگشتی هم می‌توان به شکل زیر عمل کرد.

function add($a, $b): int {
    return $a + $b;
}
var_dump(add(1, 2.5));
// output int(3)

همانطور که در کد آورده شده است نوع خروجی را می‌توان هنگام تعریف تابع مشخص کرد. در تعیین نوع خروجی هم می‌توان از کد

declare(strict_types=1);

برای اینکه با نوع داده خروجی به سخت‌گیری رفتار شود استفاده نمود.

چک کردن مقادیر null

قبل از PHP7 برای این که مشخص شود که یک متغیر مقدار دارد یا خیر از تابع isset استفاده می شد. اما در این نسخه یک عملگر به شکل ?? تعریف شده است که می توان با استفاده از آن مشخص کرد که آیا یک متغیر تعریف شده است یا خیر و اگر تعریف نشده است مقدار پیشفرضی را برای آن مشخص نمود. نحوه استفاده از این عملگر مانند کد زیر است:

$username = $_GET['username'] ?? 'not define';

در کد بالا اگر مقدار username در متغیر get وجود داشته باشد همان مقدار در متغیر username ریخته می شود و در غیر این صورت مقدار not defined در داخل متغیر username قرار می گیرد. این کد معادل کد زیر است

$username = isset($_GET['username']) ? $_GET['username'] : 'not define';

دقت داشته باشید که عملگر ?? را می توان به صورت زنجیره ای و چندتایی نیز به کار برد.

عملگر spaceship

این عملگر برای مقایسه دو متغیر به کار می روند. نتیجه این عملگر همیشه یا 0 یا 1 و یا -1 است به این صورت که اگر متغیر اول از دومی بزرگتر باشد نتیجه 1 و اگر کوچکتر باشد -1 و اگر مساوی باشند نتیجه 0 خواهد بود. این عملگر بر روی انواع داده مختلف کار می کند نحوه کار کردن با این عملگر به شکل زیر است:

echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
 
// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1

ثابت های آرایه ای

در php5 و قبل از آن ثابت های آرایه ای را فقط می توانستیم با استفاده از کلمه کلیدی const تعریف کنیم. در Php7 می توان ثابت های آرایه ای را با استفاده از کلمه کلیدی define نیز تعریف نمود. کد زیر یک مثال از تعریف ثابت های آرایه ای می باشد.

define('ANIMALS', [
    'dog',
    'cat',
    'bird'
]);

echo ANIMALS[1]; // outputs "cat"

کلاس های بی نام (anonymous)

در Php7 شما می توانید یک کلاس را بدون نام و هر جا که لازم داشتید تعریف کنید. برای مثال شاید لازم باشد که یک بار یک کلاس تعریف کنید و آن را در یک شی قرار دهید. در این وضعیت می توانید از کلاس های بی نام استفاده کنید. نحوه تعریف این کلاس ها به شکل زیر است:

$m=new class{
  public $sdf=54;
  public function add($a,$b){
      return $a+$b;
  }
};

echo $m->add(45,65);
// output 110

تابع intdiv

این تابع عمل تقسیم صحیح را انجام می دهد. به شکلی که در کد زیر مشاهده می کنید 10 بر 3 تقسیم می شود و نتیجه آن 3 برمیگردد و کاری به باقیمانده و مقدار اعشاری آن ندارد:

var_dump(intdiv(10, 3));

موارد دیگری نیز به این نسخه اضافه شده است که در مطالب دیگر معرفی خواهد شد. در قسمت قبلی در مورد قابلیت های جدیدی که در PHP نسخه 7 ارائه شده بود صحبت کردیم. این مطلب هم به ادامه مطلب قبلی در مورد این قابلیت ها می پردازد. در ادامه بخش هایی را که در PHP 7 ارائه شده است می پردازیم.

قابلیت Closure::call()

قابلیت Closure::call() برای bind کردن فراخوانی یک تابع به یک کلاس یا شی است. به شکلی که از بیرون یک تابع تعریف می شود و می تواند با اعضای کلاس کار کند. این قابلیت در ورژن های قبل از 7 به شکل زیر پیاده سازی می شد.

class A {private $x = 1;}
$getX = function() {return $this->x;};
$getXCB = $getX->bindTo(new A, 'A');
echo $getXCB();

اما این قابلیت در نسخه 7 بهبود داده شده است و آن را می توان به شکل زیر پیاده سازی کرد.

$getX = function() {return $this->x;};
echo $getX->call(new A);

دقت شود که کدهای بالا معادل هم هستند و خروجی هرکدام 1 می باشد.

تولید خروجی چندتایی

این قابلیت به شکلی است که می توان توسط آن کاری کرد که یک تابع بتواند در چند زمان خروجی تولید کند. یعنی بدون این که یک آرایه بسازید و آن را به عنوان خروجی برگردانید می توانی نتایج را هر زمان که تولید شدند به عنوان خروجی برگرداند. این قابلیت برای زمانی که تولید شدن خروجی ها زمان معینی ندارند و یا با شبکه کار می کنیم می تواند مفید باشد. در کد زیر یک مثال از این قابلیت آورده شده است.

$gen = (function() {
    yield 1;
    yield 2;

    return 3;
})();

foreach ($gen as $val) {
    echo $val, PHP_EOL;
}

echo $gen->getReturn(), PHP_EOL;
//output: 1
//output: 2
//output: 3

در این قابلیت همانطور که می بینید به جای استفاده از return از کلمه کلیدی yield استفاده شده است. اما برای این که مقدار return تابع را دریافت کنیم باید از متد getReturn استفاده نماییم. همچنین می توان این قابلیت را به چند تابع گسترش داد. به شکلی که چند تابع مسئول تولید نتایج باشند. برای این کار باید کدی شبیه به کد زیر نوشت

function gen()
{
    yield 1;
    yield 2;
    yield from gen2();
}

function gen2()
{
    yield 3;
    yield 4;
}

foreach (gen() as $val)
{
    echo $val, PHP_EOL;
}

//output 1
//output 2
//output 3
//output 4

گزینه های session

در PHP7 می توان تنظیماتی را که برای session ها در فایل php.ini قرار داده شده است را هنگام استارت شدن session تغییر داد. برای مثال به کد زیر توجه کنید:

session_start([
    'cache_limiter' => 'private',
    'read_and_close' => true,
]);

در کد بالا وقتی مقدار cacheLimiter را private قرار دهیم کش مربوط به session ها به محض این که خوانده شد پاک می شود.


مهدی عادلی فر
مهدی عادلی فر

بنیانگذار توسینسو و برنامه نویس

مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.

28 اردیبهشت 1398 این مطلب را ارسال کرده

نظرات