سلام به php 7 | بررسی امکانات و تغییرات جذاب نسخه 7 پی اچ پی | تولک

سلام به php 7 | بررسی امکانات و تغییرات جذاب نسخه 7 پی اچ پی

1
  • mahsa yazdani
  • 0
  • 5 فروردین 1399
سلام به php 7 | بررسی امکانات و تغییرات جذاب نسخه 7 پی اچ پی

امکانات ورژن جدید PHP 7

امکانات ورژن جدید php 7 موضوع مورد بحث در این مقاله می‌باشد. مدت طولانی است که PHP، پرطرفدارترین زبان برنامه نویسی برای ساخت نرم افزارهای تحت وب می‌باشد. به گفته برنامه نویسان PHP، در این میان، نسخه شماره 7 نیز از تمام نسخه‌های دیگر محبوب‌تر بوده و ویژگی‌های جذاب و مفیدی برای توسعه دهندگان به همراه داشته.

البته انتظار میرفت نسخه 7 PHP به نام “6 PHP” منتشر شود، دلیل این نام گذاری این است که نسخه‌های متعددی بعد از نسخه 5 PHP منتشر شده است. عموما در میان توسعه دهنگان و برنامه نویس‌ها آپدیت‌های نسخه 5.3 به نسخه 6 معروف بود. از این رو، آخرین نسخه PHP را نام PHP 7 نام گذاری کردند.

در ادامه، به بیان امکانات ورژن جدید PHP 7 می‌پردازیم. در این مقاله تغییرات PHP 7 به گونه‌ای بیان می‌شود که برای برنامه نویسانی که با زبان برنامه نویسی PHP آشنایی ندارند، قابل درک باشد.

  • امکان تعریف نوع داده عددی

این ویژگی به برنامه نویس امکان می‌دهد تا اجبارا ورودی‌ها از نوع عدد باشند. در این شرایط برنامه با هر نوع ورودی، اعم از String, Boolean, Floating points همانند عدد رفتار می‌کند. برای آشنایی و درک این موضوع به مثال زیر توجه کنید:


<?php
function sumIt(int ...$ints)
{
    return array_sum($ints);
}
var_dump(sumIt (2, '3', 4.1)); 

خروجی:


int (9)

 

ممکن است برای برنامه نویسان مبتدی این سوال ایجاد شود که چرا اضافه شدن نوع عددی یک مزیت حساب می‌شود؟ پاسخ این است که چنین ساختاری به نظم و دقت برنامه کمک می‌کند. وقتی بحث محاسبه اعداد در میان است، بایستی همیشه ورودی‌ها عدد باشند تا آنچه از برنامه و توابع انتظار می‌رود، رخ دهد. همچنین، مزیت مهم دیگر این ویژگی، مدیریت حافظه و کاهش پردازش است. وقتی کامپایلر مطمئن است که داده مورد نظر از نوع عدد می‌باشد، به اندازه کافی حافظه در اختیار متغیرها قرارداده و برای بررسی حجم جدید متغیر نیاز به پردازش اضافی نخواهد داشت.

  • امکان تعریف نوع خروجی

از دیگر تغییرات PHP 7 امکان تعریف کردن نوع خروجی برای تابع‌ها است. برای تعریف نوع خروجی همانند مثال زیر، بایستی پس از پرانتز ورودی‌ها با کاراکتر دونقطه نوع خروجی را مشخص کرد. نوع خروجی تابع، دقیقا همانند نوع داده‌ها برای تعریف متغییر و object است.


<?php

function  _array_sum(array ...$arrayItems): array
{
return array_map(function(array $ arrayItem): int {
return array_sum($arrayItem);
}, $arrayItems);
}
print_r(_array_sum ([1,2], [3,4], [4,5] , [6,7,8,9]));

خروجی این مثال به این صورت خواهد بود:


Array(    [0] => 3    [1] => 7    [2] => 9    [3] => 30)

این امکان باعث می‌شود کامپایلر همیشه  بداند نوع خروجی تابع چیست. این قابلیت، مزیت‌های امکان تعریف داده را نیز به دنبال دارد. مشخص بودن نوع خروجی تابع باعث بهینه شدن سرعت و دقت برنامه در زمان اجرا و همچنین، باعث بهبود نظم و دقت کدها برای برنامه نویس می‌شود.

  • اپراتور مقدار null

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

برای درک بهتر این موضوع به مثال زیر دقت کنید.


<?php
// مقدار این متغییر برابر است با کلید مورد نظر
// اگر کلید مورد نظر وجود نداشت با مقدار نداشت، مقدار بعدی در نظر گرفته می‌شود
$username = $_GET['user'] ?? 'nobody';
// این عبارت مشابه خط بالا است
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
// همیشه این عملگر در صورت خالی بودن مقدار، عبارت بعدی را بر‌میگرداند.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>
  • عملگر سفینه (Spaceship operator)

این عملگر به صورت <=> نوشته می‌شود و برای مقایسه دو عبارت استفاده می‌شود. این عملگر بر اساس نوع خروجی مشخص می‌کند که مقدار اول (سمت چپ عملگر)، بزرگتر، مساوی یا کوچک‌تر از مقدار دوم (سمت راست عملگر) است. مقدارهای مشخص‌کننده این مقایسه عبارتند از:

عدد -1 به معنی کوچکتر، عدد 0 به معنای مساوی بودن مقدارها و عدد 1 به معنای بزرگتر بودن عبارت اول.

برای درک بهتر این عملگر به مثال زیر دقت کنید:


<?php
// Integers
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
?>

آرایه‌های ثابت (Constant) با استفاده از تابع define

امکان تعریف آرایه ثابت یکی از مهمترین امکانات ورژن جدید PHP 7 است؛ چرا که آرایه‌های ثابت از سرعت پردازش بالاتری برخوردار هستند و برنامه برای نگهداری آنها پردازش کمتری به سیستم تحمیل می‌کند. یکی دیگر از مزیت‌های مهم این نوع آرایه این است که در طول عمر اجرای برنامه می‌توان مطمئن بود که طول و مقادیر آرایه، ثابت است و تغییری نمی‌کند. بنابراین، بدون نیاز به نوشتن کدهای اضافه، برای بررسی و اعتبارسنجی مقدار داده‌های آرایه، می‌توان از آن استفاده کرد.

 


<?php
define('STUDENTS', [
'علی',
'مهدی',

'حسن',
'سروش'
]);
echo STUDENTS [3]; // => "سروش"
?>
  • کلاس‌های مستعار (Anonymous classes)

امکان تعریف کلاس‌های مستعار یکی از امکانات ورژن جدید PHP 7 است که امنیت کدهای PHP کمک می‌کند. مزیت استفاده از این قابلیت این است که ادغام کردن یک کلاس anonymous در یک کلاس دیگر باعث می‌شود تا از محتویات غیر عمومی شامل توابع و مقدارها و خصوصیات کلاس حفاظت شود. بدین صورت که بدون دخالت در کلاس بیرونی، بتوان ویژگی‌ها و عملکرد کلاس بیرونی را ویرایش کرد یا توسعه داد.

برای درک بهتر کلاس مستعار در امکانات ورژن جدید PHP 7 به مثال زیر دقت کنید:


<?php
interface Logger {
public function log(string $msg);
}
class Application {
private $logger;
public function getLogger(): Logger {
return $this->logger;
}

public function setLogger(Logger $logger) {
$this->logger = $logger;
}
}
$app = new Application;
$app->setLogger(new class implements Logger {
public function log(string $msg) {
echo $msg;
}
});
?>

 

در این مثال، کلاس Application دارای یک کلاس داخلی به نام logger می‌باشد. در ادامه، بدون تغییر در کدهای کلاس بیرونی (Application)، کلاس logger که درون آن قرار دارد، ویرایش شد.

لایه بندی و کپسول کردن کدها، یکی از تکنیک‌های مهم برای توسعه نرم افزار است. مادامی که تعداد خطهای یک برنامه بالا می‌رود، این تکنیک از اهمیت بیشتری برخوردار می‌شود. نگه داشتن کدها به صورت دست نخورده به ثبات عملکرد برنامه کمک می‌کند. برای ارتقاء یا ویرایش کدهایی که توسط برنامه ‌نویس دیگری نوشته شده یا برای کاربرد خاصی نوشته شده است می‌توان به این صورت عمل کرد تا بدون دخالت در کدهای قبلی به هدف مورد نظر دست یافت.

  • نحوه کدگذاری برای نوشتن و نمایش یونیکدها (Unicode escape)

یکی دیگر از تغییرات PHP 7، نحوه نوشتن متن به صورت hexadecimal است که به صورت UTF-8 نمایش داده می‌شود. در این امکان هر نوع متن کدگذاری شده به همراه کارکترهای 0 راهنما، مورد تایید است.


echo "\u{aa}";
echo "\u{0000aa}";
echo "\u {9999}";

خروجی کدهای بالا به صورت زیر خواهد بود:


ªª (مشابه قبل ولی به همراه کاراکترهای 0 راهنما)香
  • فراخوان بسته (Closure::call)

فراخوان بسته از امکانات ورژن جدید PHP 7 است که برای کدنویسی خواناتر و کوتاه‌تر مفید است. کوتاه‌ شدن کدها از جمله ویژگی‌های برنامه نویسی مدرن است. این گرایش در تمامی زبان‌های برنامه نویسی جدید وجود دارد و در تغییرات PHP 7 نیز مشهود است.


<?php
class A {private $x = 1;}
// نسخه‌های پیش از 7
$getX = function() {return $this->x;};
$getXCB = $getX->bindTo(new A, 'A'); // intermediate closure

echo $getXCB();
// تغییرات PHP 7
$getX = function() {return $this->x;};
echo $getX->call(new A);

خروجی کدهای بالا به صورت زیر است:

11

همانطور که در کدهای بالا، به صورت کامنت توضیح داده شده است، در نسخه‌های پیشین PHP برای تغییر مقدارهای یک کلاس، پیش از فراخوان تابع داخل آن، نیاز به استفاده از تابع bindTo بوده است. اما با تغییرات PHP 7 می‌توان این کار را در یک خط در زمان فراخوان با تابع call انجام داد. در مثال بالا، تابع getX فراخوان شده، به طوری که property خصوصی $x در آن مقدار دهی شده است.

  • فیلتر برای unserialize

پیش از امکانات ورژن جدید PHP 7، تمام یک شئ unserialize می‌شد. فیلتر کردن propertyهایی که نیاز نیست unserialize بشوند به امنیت و دقت برنامه کمک شایانی میکند. و همچنین باعث می‌شود برنامه نویس برای فیلتر کردن فرایند serialize نیاز به نوشتن کدهای اضافه نداشته باشد.


<?php
// تبدیل کردن تمام شئ‌ها به جز کلاس‌ها
$data = unserialize($foo, ["allowed_classes" => false]);
// تبدیل کردن تمام شئ‌ها به جز کلاس‌های ذکر شده در براکت‌ها
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]]);
//  تبدیل کردن تمام شئ‌ها به همراه کلاس‌ها
$data = unserialize($foo, ["allowed_classes" => true]);

 

در مثال بالا، متغیر $data  به کلاسی از نوع __PHP_Incomplete_Class  تبدیل می‌شود. پارامتر دوم این تابع unserialize، آرایه‌ای از گزینه‌های تابع است. گزینه  “allowed_classes” => false به این معنا است که کلاس‌ها تبدیل نشوند.

  • کلاس IntlChar جدید در تغییرات PHP 7

کلاس IntlChar جدید، شامل توابعی برای تبدیل و دستکاری unicodeها است. به مثال زیر نمونه از کاربردهای این کلاس است:


printf('%x', IntlChar::CODEPOINT_MAX);
echo IntlChar::charName('@');
var_dump(IntlChar::ispunct('!'));

خروجی کدهای بالا چنین خواهد بود:

 


10ffffCOMMERCIAL ATbool(true)

برای استفاده از این کلاس لازم است کتابخانه intl نصب بشود.

  • تابع assert.exception در امکانات ورژن جدید PHP 7

Exceptionها نوع پیشرفته و تکامل یافته تابع assert هستند. این تابع اجازه می‌دهد در صورت بروز خطا، به یک استثنای سفارشی ارجاع داده شود.


<?php
ini_set('assert.exception', 1);
class CustomError extends AssertionError {}
assert(false, new CustomError('Some error message'));
?>

در مثال بالا، پارامتر اول تابع assert برابر با False است. بنابراین خطا صادر میشود اما بجای حالت پیش فرض سیستم از کلاس CustomError استفاده می‌شود.

  • اعلان‌های use به صورت گروهی

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


<?php
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;

use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;

use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;
?>

اما با تغییرات PHP 7 می‌توان مانند مثال زیر، کوتاه‌تر نوشت:


<?php

use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};
?>

همانطور که پیش‌تر بیان شد، کوتاه‌تر شدن کدها از نکاتی است که در موج جدید تغییرات زبان‌های برنامه نویسی به آن توجه می‌شود. این امکان جدید به کوتاه شدن کدهای PHP کمک می‌کند. بنا به تجربه، بسیاری از برنامه نویس‌ها به دلیل خواناتر بودن کدها، اقدام به فراخوانی کل namespaceها می‌کردند، در شرایطی که فقط به بخشی از آن نیاز بوده. این کار باعث می‌شود برنامه در زمان اجرا حافظه بیشتری اشغال کند.

  • عبارت Generator Return

داشتن خروجی‌های متعدد از امکانات ورژن جدید PHP 7 است. که البته این امکان از PHP نسخه 5.5 معرفی شد و در نسخه 7 کامل شد. برای درک کامل این امکان، با مثال زیر بررسی می‌کنیم:


<?php
$gen = (function() {
yield 1;
yield 2;
return 3;
})();
foreach ($gen as $val) {
echo $val, PHP_EOL;
}
echo $gen->getReturn(), PHP_EOL;

?>

خروجی کدهای بالا چنین خواهد بود:

123

در این مثال، $gen تابعی است که خروجی‌های مختلف تولید می‌کند. کلیدواژه yield  خروجی تابع را مشخص می‌کند اما به معنی پایان تابع نیست. در انتها Generator Return با فراخوان تابع getReturn() مقدارهای تولید شده را به صورت آرایه ارائه میدهد. این امکان باعث می‌شود در شرایطی که زیر روال‌ها(coroutines) در حال اجرا هستند نیاز به انتظار برای پایان یافتن تمام خروجی تابع نباشد.

همچنین همانند کدهای زیر، یک generator می‌تواند نماینده یک generator دیگر باشد.


<?php
function gen()
{
yield 1;
yield 2;
yield from gen2();
}
function gen2()
{
yield 3;
yield 4;
}
foreach (gen() as $val)
{
echo $val, PHP_EOL; }
?>

 

خروجی کدهای بالا چنین خواهد بود:

1234

  • گزینه‌های Session در تغییرات PHP 7

در نسخه جدید PHP 7، تابع (session_start) پذیرای آرایه‌ای از گزینه‌های Session است. این گزینه‌ها، تنظیمات موجود در فایل php.ini را بازنویسی میکند. این امکان تا جایی توسعه یافته از قابلیت session.lazy_write نیز پشتیبانی می‌کند. بنابراین، در هنگام تغییر گزینه‌ها تمام Sessionها را بازنویسی خواهد کرد. تابع دیگری در خدمت این قابلیت وجود دارد به نام read_and_close که پس از خواندن فایل session، بدون تغییر فایل را می‌بندد.

برای مثال، جهت تنظیم کردن گزینه cache_limiter و بستن session بلافاصله بعد از خواندن آن از این دستور استفاده می‌کنیم:


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

بنابراین، با این امکان با تغییرات PHP 7 همراه بوده، می‌توان در طول عمر اجرای برنامه به سادگی و سرعت، به طور پویا sessionها را مدیریت کرد.

  • تابع preg_replace_callback_array در تغییرات PHP 7

عملکرد جدید تابع preg_replace_callback_array این امکان را فراهم می کند که کدهای برنامه بسیار تمیزتر و خواناتر نوشته شوند. این کیفیت در مقایسه با استفاده از تابع preg_replace_callback که در نسخه‌های پیشین PHP استفاده می‌شده، مطرح می‌شود. قبل از PHP 7، فراخوان‌های برگشتی که نیاز به regular expression داشته‌اند، تابع برگشتی را بسیار بزرگ و پر شاخه می‌کردند. اکنون می‌توان با استفاده از یک آرایه، callback های برگشتی را به مجموعه‌ای از عبارت معمولی تبدیل کرد.

  • توابع CSPRNG

random_bytes و random_int، دو تابع جدید در PHP 7 که برای تولید اعداد صحیح و متن‌های رمزنگاری شده به صورت cross platform اضافه شده است.

  • با امکانات ورژن جدید PHP 7، تابع list() همیشه میتواند objectهای اجرا شده با ArrayAccess را باز کند

پیش از این، تابع list،  تضمینی برای عملکرد صحیح بر روی اشیا داخل آرایه ArrayAccess نداشت.

مهاجرت به PHP 7

اگر شما بر روی نرم افزاری بر پایه PHP قدیمی‌تر کار می‌کنید، با مهاجرت به نسخه 7 و استفاده از امکانات ورژن جدید php 7 برنامه نویسی  راحت‌تر و لذت بخش‌تری را تجربه خواهید کرد. شاید ابتدای امر به نظر برسد این کار وقت بیشتری از روند توسعه پروژه شما خواهد گرفت. اما در ادامه کارتان، متوجه خواهید شد که تغییرات php 7 حجم کدنویسی شما را کاهش داده و زمان بیشتری برای پروژه صرفه جویی کرده‌اید. بنابراین، توصیه می‌شود هرچه زودتر اقدام به این انتقال نمایید.

یکی از محبوب ترین فریم ورک های php لاراول است شما می توانید این فریم ورک را در آموزش لاراول بطور کامل یاد بگیرید و در آموزش لاراول 7 اطلاعات خود را در مورد این فریم ورک تکمیل کنید

no avatar
mahsa yazdani
دانشجوی کارشناسی ارشد شبکه نویسنده ,گرافیست و علاقه مند به فضای وب فارسی