<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Zahra Delbari</title>
        <link>https://virgool.io/feed/@z.delbari</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-07 03:13:12</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/184756/avatar/b3xid9.png?height=120&amp;width=120</url>
            <title>Zahra Delbari</title>
            <link>https://virgool.io/@z.delbari</link>
        </image>

                    <item>
                <title>انقلاب پنج به هفت؛ داستان PHP (قسمت دوم)</title>
                <link>https://virgool.io/Quera-Mag/evolution-of-php-v5-to-v7-gzy4zwxokbi0</link>
                <description>در قسمت اولِ داستان PHP، درباره تغییرات چشم‌گیر و اساسی نسخه‌های اولیه PHP v7 نسبت به نسل قبل از آن صحبت کردیم. در قسمت دوم این مطلب، ادامه تغییرات این نسل را تا آخرین ورژن آن یعنی نسخه ۷.۴ مرور می‌کنیم و در مطلب آینده هم نهایتا به سراغ آپدیت‌های مورد انتظار برای PHP v8 خواهیم رفت.اگر قصد یادگیری و تمرین زبان PHP را دارید، کافی است کمی پشتکار داشته باشید و سری به دوره «آموزش پروژه‌محور برنامه‌نویسی وب با PHP» در کوئراکالج بزنید. در این دوره با پروژه‌های واقعی از شرکت دیجی‌کالا و تمرین‌های مختلف سر و کار خواهید داشت.شیب ملایم؛ PHP v7.2دومین آپدیت سری هفتم PHP در تاریخ ۹ آذر ۱۳۹۶ منتشر شد که در ادامه برخی از ویژگی‌های جدید آن را بررسی خواهیم کرد.- گسترش type پارامتر‌در این نسخه می‌توان type مشخص شده برای پارامتر‌های ورودی را در Subclassها حذف کرد. مثلا اگر فرزندی بخواهد یک تابع از پدرش را Override کند، می‌تواند type پارامتر‌های ورودی آن را کلا حذف و تابع جدید را بر روی متغیر با هر typeای فراخوانی کند.interface FooInterface{
        public function bar(string $str);
}

class FooClass implements FooInterface{
        public function bar($str)
        {
                return $str;
        }
}

$a = new FooClass();
var_dump( $a-&gt; bar(12)); \\ int(12)
var_dump( $a-&gt; bar(“12”)); \\ string(2) &amp;quot12&amp;quotتوجه داشته باشید که type پارامتر‌ها را می‌توان حذف کرد؛ ولی نمی‌توان type جدیدی برای آن‌ها مشخص کرد. هم‌چنین این قانون فقط برای پارامترهای تابع است و type خروجی (اگر مشخص شده باشد) امکان حذف ندارد.- شمارش اشیاء غیر قابل شمارشتا قبل از این، فراخوانی تابع ()count بر روی اسکالر‌ها و اشیایی که واسط Countable را پیاده‌سازی نکرده بودند خروجی ۱ می‌داد. اما در این نسخه فراخوانی تابع ()count بر روی موارد بالا و همچنین null باعث ایجاد یک Warning می‌شود.var_dump(count(12)) \\ PHP Warning: count(): Parameter must be an array or an object that implements Countable- ویرگول دنباله‌دار در لیست فضای اسمی گروهیصرفا اضافه کردن مورد جدید راحت تر می‌شود =).use Foo\Bar\{ Foo, Bar, Baz, };- دیباگ کردن PDOبا استفاده از تابع جدید activeQueryString می‌توان Queryای را که به پایگاه داده ارسال می‌شود، پس از اجرا به صورت کامل دید. البته این تابع فقط زمانی کارایی دارد که از حالت Emulated Prepared Statements استفاده کنیم. چون در حالت Real Prepared واقعا هیچ‌گاه Query کامل به پایگاه داده ارسال نمی‌شود و دیدن آن به صورت کامل امکان‌پذیر نیست.$db = new PDO(...);

// works with statements without bound values
$stmt = $db-&gt;query(&#039;SELECT 1&#039;);
var_dump($stmt-&gt;activeQueryString()); // =&gt; string(8) &amp;quotSELECT 1&amp;quot

$stmt = $db-&gt;prepare(&#039;SELECT :string&#039;);
$stmt-&gt;bindValue(&#039;:string&#039;, &#039;foo&#039;);

// returns unparsed query before execution
var_dump($stmt-&gt;activeQueryString()); // =&gt; string(14) &amp;quotSELECT :string&amp;quot

// returns parsed query after execution
$stmt-&gt;execute();
var_dump($stmt-&gt;activeQueryString()); // =&gt; string(11) &amp;quotSELECT &#039;foo&#039;&amp;quotستاره دنباله‌دار؛ PHP v7.3این نسخه از سری هفت در تاریخ ۱۵ آذر ۱۳۹۷ و باز هم با ویژگی‌های جدید بسیاری ارائه شد که برخی از آن‌ها را در ادامه خواهید دید.- بهبود کنترل خطا در توابع json_encode و json_decodeنداشتن روشی مناسب برای کنترل کردن خطاها هنگام استفاده از JSON برای مدت‌ها مشکلی غیر قابل حل بود؛ به طوری که از نظر توسعه‌دهندگان وب، این مسئله یک نقطه ضعف بزرگ در PHP به شمار می‌رفت.مشکل اینجا بود که تابع ()json_decode در صورت بروز خطا مقدار null را برمی‌گرداند. در حالی که برخی اوقات null ممکن است واقعا مقداری معتبر برای یک JSON باشد.تا قبل از PHP v7.2 برای دریافت خطایی از JSON از یک‌سری راه حل‌ها استفاده می‌شد که آن‌ها هم خیلی قابل اعتماد و کارآمد نبودند.به عنوان مثال:json_decode(&amp;quot{&amp;quot);
json_last_error() === JSON_ERROR_NONE // the result is false
json_last_error_msg() // The result is &amp;quotSyntax error&amp;quotاما در این نسخه می‌توان به این ترتیب عمل کرد:use JsonException;

try {
        $json = json_encode(&amp;quot{&amp;quot, JSON_THROW_ON_ERROR);
        return base64_encode($json);
} catch (JsonException $e) {
        throw new EncryptException(&#039;Could not encrypt the data.&#039;, 0, $e);
}در واقع با افزوده شدن flag جدید JSON_THROW_ON_ERROR به این توابع، از این پس می‌توانید با استفاده از آن هنگام کار با توابع JSON برای خود Exception Message تعریف کنید.- اضافه شدن تابع is_countableدر نسخه قبلی این قابلیت اضافه شد که اگر تابع ()count بر روی متغیر غیر قابل شمارشی فراخوانی شد، یک Warning ایجاد شود. در این نسخه با اضافه شدن تابع is_countable می‌توان از قبل مطمئن شد که متغیر، قابل شمارش هست یا نه.$count = is_countable($variable) ? count($variable) : null;- اضافه شدن توابع array_key_first و array_key_lastهمان‌طور که از نام‌شان پیدا است این دو تابع کلید اولین و آخرین خانه آرایه را برمی‌گردانند.$array = [
        &#039;a&#039; =&gt; &#039;sth1&#039;,
        &#039;b&#039; =&gt; &#039;sth2&#039;,
        &#039;c&#039; =&gt; &#039;sth3&#039;,
];

array_key_first($array); // &#039;a&#039;
array_key_last($array); // &#039;c&#039;- ویرگول دنباله‌دار در فراخوانی تابعunset(
        $foo,
        $bar,
        $baz,
);توجه داشته باشید که این کار در تعریف تابع مجاز نیست.- اضافه شدن قابلیت انتساب ارجاعی در ()listدر این نسخه می‌توان با استفاده از لیست علاوه بر مقادیر خانه‌های یک آرایه، رفرنس‌ آن‌ها را نیز به یک سری متغیر Assign کرد.$array = [1, 2];
list($a, &amp;$b) = $array;تکه کد بالا در واقع برابر است با:$array = [1, 2];
$a = $array[0];
$b =&amp; $array[1];- پشتیبانی ذاتی از کوکی‌های Same Siteدر دنیای امنیت از Same Site Flag برای جلوگیری از حملات CSRF استفاده می‌شود.کوکی‌های Same Site با اعمال این قانون که «کوکی فقط در صورتی ارسال می‌شود که درخواست‌کننده در همان دامنه کوکی باشد»، باعث می‌شوند خطر حمله CSRF و نشت اطلاعات در سرورها کاهش یابد. Frameworkهای اصلی PHP قبلاً این کار را از طریق فراخوانی یک Set-Cookie Header انجام ‌می‌دادند.در این نسخه با افزودن Flag جدید Same Site در تابع setcookie می‌توان به راحتی یک کوکی Same Site ساخت.setcookie ( string $name [, string $value = &quot;&quot; [, int $expire = 0 [, string $path = &quot;&quot; [, string $domain = &quot;&quot; [, bool $secure = false [, bool $httponly = false [, string $samesite = &quot;&quot; ]]]]]]] )- نمایش بهتر TypeErrorهاتا قبل از این در TypeError برای Integer و Boolean از اسم کامل‌شان استفاده می‌شد اما در این نسخه می‌توان نام کوتاه‌شده‌شان را به کار برد. این نام کوتاه، همان نامی است که در هنگام مشخص کردن type از آن استفاده می‌شود.// Pre PHP 7.3 code
Argument 1 passed to foo() must be of the type integer/boolean

// PHP 7.3+ code
Argument 1 passed to foo() must be of the type int/boolآخرین وارث؛ PHP v7.4جدیدترین نسخه منتشر شده تا به امروزِ سری هفت یعنی PHP v7.4 در تاریخ ۷ آذر ۱۳۹۸ ارائه شد. این نسخه آخرین نسخه سری ۷ نیز خواهد بود و قرار است بعد از آن PHP 8 میدان را به دست بگیرد. به هر حال تا آمدن سری هشت بیایید برخی از ویژگی‌های جدید آخرین وارث نسل هفتم را بررسی کنیم.- پشتیبانی از Arrow Functionهاتابع‌های Arrow در واقع نمایشی کوتاه شده از Anonymous Functionها هستند که دقیقا همان کارایی را دارند. البته با این تفاوت کوچک که استفاده از متغیر‌های محدوده Parent به صورت خودکار انجام می‌شود و دیگر نیازی به استفاده از کلیدواژه Use نیست. فرم کلی آن به شکل زیر است:fn (argument_list) =&gt; expr.$y = 1;
$fn1 = fn($x) =&gt; $x + $y;

// equivalent to using $y by value:
$fn2 = function ($x) use ($y) {
        return $x + $y;
};

$factor = 10;
$nums = array_map(fn($n) =&gt; $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);- اضافه شدن عملگر انتسابی ??در این نسخه می‌توان از عملگر ?? که در قسمت قبل توضیح داده شد، همانند عملگر‌های -، + و * به صورت انتسابی هم استفاده کرد. با این کار دیگر نیاز نیست اسم متغیر را در هر دو طرف تساوی بنویسیم و نوشتار کوتاه‌تری خواهیم داشت.// The following lines are doing the same
$this-&gt;request-&gt;data[&#039;comments&#039;][&#039;user_id&#039;] = $this-&gt;request-&gt;data[&#039;comments&#039;][&#039;user_id&#039;] ?? &#039;value&#039;;

// Instead of repeating variables with long names, the equal coalesce operator is used
$this-&gt;request-&gt;data[&#039;comments&#039;][&#039;user_id&#039;] ??= &#039;value&#039;;- قابلیت جدید Preloading (پیش‌بارگذاری)یکی از مهم‌ترین ویژگی‌های اضافه شده در این نسخه که سبب بهبود چشمگیری در سرعت و عملکرد برنامه‌های PHP می‌شود، پیش‌بارگذاری است.در آن اوایل، PHP برای اجرای هر Request همه فایل‌ها را یک‌بار تجزیه و کامپایل می‌کرد ولی نتیجه این کار که به آن Opcodes می‌گوییم جایی ذخیره نمی‌شد. بنابراین نمی‌شد در درخواست بعدی از آن استفاده کرد و به این ترتیب یک پروسه‌ی تکراری بارها و بارها به ازای هر Request تکرار می‌شد.برای حل این مشکل OPCache معرفی شد. OPCache که مخفف Opcodes Cache است با Cache کردن Opcodeهای تولید شده، سعی در افزایش سرعت اجرای درخواست‌ها دارد. فرض کنید دو Request به یک کد PHP برای اجرا شدن نیاز داشته باشند. در این صورت می‌توان از Opcodesای که Cache شده است استفاده کرد و عملیات تجزیه/کامپایل را دوباره انجام نداد. با این‌کار عملکرد برنامه‌ها در مجموع بین ۲ تا ۱۵ برابر بهبود پیدا خواهد کرد.این کار هنوز هم یک سری هزینه اجرایی را از بین نمی‌برد. قبل از این PHP مجبور بود چک کند که اگر Source File تغییر کرده باشد، قسمت تغییر یافته را از حافظه مشترک در حافظه Process کپی کند. علاوه بر آن، از آنجایی که هر فایل PHP کاملا مستقل و بدون در نظر گرفتن دیگر فایل‌ها کامپایل و Cache می‌شود، PHP نمی‌توانست وابستگی‌های بین کلاس‌هایی که در فایل‌های متفاوتی ذخیره شده‌اند را برطرف کند. به همین خاطر مجبور بود به ازای هر Request وابستگی‌های کلاس را در زمان اجرا مجدداً پیوند دهد.به لطف Preloading (پیش‌بارگذاری) PHP v7.4 می‌تواند بسیاری از این هزینه‌ها را از بین ببرد. در هنگام راه‌اندازی سرور و قبل از اجرای هر اپلیکیشنی، PHP می‌تواند مجموعه‌ای از فایل‌های PHP‌ را (که از قبل مشخص شده‌اند) در حافظه بارگذاری کند؛ به صورتی که محتوای آن‌ها به طور همیشگی توسط همه‌ Request‌های بعدی در دسترس باشند.در واقع با استفاده از این ویژگی علاوه بر کامپایل کردن فایل‌هایی که مشخص کرده‌ایم، فایل‌های مرتبط به هم را لینک می‌کند و کد حاصل را که قابل اجرا برای مفسر PHP است، در حافظه نگه می‌دارد.تمام توابع و کلاس‌های تعریف شده در این فایل‌ها که از قبل Load شده‌اند، برای همه Requestهای خارجی در دسترس خواهند بود. دقیقاً مانند Entitieyهای داخلی؛ مثل Strlen یا Exception. در حقیقت، PHP می‌تواند همه یا بخشی از Frameworkها مانند Symfony و حتی کل کتابخانه مورد نیاز برنامه را از قبل بارگذاری کند که این کار به وضوح باعث افزایش سرعت می‌شود.برای این که Preload کار کند باید فایل‌هایی که می‌خواهید از قبل بارگذاری شوند را برای سرور مشخص کنید. به این ترتیب که ابتدا با استفاده از تابع opcache_compile_file فایل‌هایی که می‌خواهید preload شوند را در یک فایل PHP مشخص و سپس در فایل PHP.ini در قسمت opcache.preload آدرس آن را ذکر کنید.آدرس دهی در فایل PHP.ini:opcache.preload=/path/to/project/preload.PHPیک پیاده‌سازی اولیه‌ برای فایل preload.php:$files = /* An array of files you want to preload */;
foreach ($files as $file) {
        opcache_compile_file&#40;$file&#41;;
}Typed Propertiesبا توجه به اضافه شدن ویژگی‌های جدیدی مثل تعیین type ورودی و خروجی در تابع در نسخه‌های پیشین، اینکه بگوییم PHP سعی دارد خودش را هر چه بیشتر به یک زبان Strong Type نزدیک کند خیلی هم گزاره اشتباهی نیست. بنابراین در راستای حرکت به سمت این هدف، قابلیت تعیین type برای Propertyهای یک کلاس نیز در این نسخه اضافه شده است.class Example {

        // All types with the exception of &amp;quotvoid&amp;quot and &amp;quotcallable&amp;quot are supported
        public int $scalarType;
        protected ClassName $classType;
        private ?ClassName $nullableClassType;

        // Types are also legal on static properties
        public static iterable $staticProp;

        // Types can also be used with the &amp;quotvar&amp;quot notation
        var bool $flag;

        // Typed properties may have default values (more below)
        public string $str = &amp;quotfoo&amp;quot
        public ?string $nullableStr = null;

        // The type applies to all properties in one declaration
        public float $x, $y;
        // equivalent to:
        public float $x;
        public float $y;
}اضافه شدن عملگر Spread به آرایه‌هادر نسخه ۵.۶ PHP قابلیتی به نام Argument Unpacking معرفی شد که به کمک آن می‌شد اعضای یک آرایه را بدون اشاره به تک‌تک عضو‌ها و به عنوان آرگومان‌های ورودی یک تابع معرفی کرد. این کار با افزودن «…» قبل از نام آرایه در تعریف آرگومان‌های تابع قابل انجام است.function test(...$args) { var_dump($args); }
test(1, 2, 3);اما این کار فقط در همین تعریف تابع امکان‌پذیر بود. حالا در این نسخه PHP می‌توان از این عملگر جهت تعریف آرایه‌ها نیز استفاده کرد.$parts = [&#039;apple&#039;, &#039;pear&#039;];
$fruits = [&#039;banana&#039;, &#039;orange&#039;, ...$parts, &#039;watermelon&#039;];
// [&#039;banana&#039;, &#039;orange&#039;, &#039;apple&#039;, &#039;pear&#039;, &#039;watermelon&#039;];تا قبل از معرفی این ویژگی، برای انجام عملیات بالا مجبور بودیم از تابع array_merge استفاده کنیم که این راه حل جدید به مراتب سریع تر از فراخوانی تابع array_merge است.اما توجه داشته باشید این قابلیت فقط بر روی آرایه‌هایی که اندیس‌شان عدد است قابل اجرا است.Numeric Literal Separatorدر این نسخه برای بهتر خوانده شدن اعداد می‌توان از underline (_) برای جداسازی ارقام استفاده کرد. نگران نباشید؛ این کاراکتر به طور کامل توسط مفسر نادیده گرفته می‌شود!6.674_083e-11; // float
299_792_458;   // decimal
0xCAFE_F00D;   // hexadecimal
0b0101_1111;   // binaryبهبود تابع strip_tagsاز این تابع برای حذف تگ‌های HTML استفاده می‌شود. در این نسخه، PHP استفاده از این تابع را آسان‌تر کرده است. تا قبل از این، از این تابع به صورت زیر استفاده می‌شد:strip_tags($str, &#039;&lt;a&gt;&lt;p&gt;&#039;);از این به بعد می‌توان آرگومان دوم تابع را به صورت یک آرایه از تگ‌های مورد نظر نوشت:strip_tags($str, [&#039;a&#039;, &#039;p&#039;]);اضافه شدن تابع mb_str_split در این نسخه، PHP تابع جدید mb_str_split را معرفی کرده‌ است که دقیقا همان کاربرد تابع str_split را دارد. با این تفاوت که تابع str_split، رشته‌ را به آرایه‌ای از کاراکتر‌های یک بایتی تبدیل می‌کند؛ اما mb_str_split برای کار با Code Pointها ساخته شده است. یعنی لزومی ندارد طول کاراکتر‌ها حتما یک بایت باشند و طول کاراکتر را می‌توان در آن مشخص کرد.mb_str_split ( string $string [, int $split_length = 1 [, string $encoding = mb_internal_encoding() ]] ) : arrayمقایسه پرفورمنسبا استفاده از نسخه جدید موتور zend و بهبود‌های متعدد در نسخه‌های مختلف این سری، سعی شده حافظه مصرفی، سرعت و عملکرد برنامه‌هایی که با PHP نوشته شده‌اند بهبود یابد. با توجه به نتایج آزمایش زیر می‌توان گفت که PHP 7 در این رابطه بسیار موفق عمل‌ کرده است.نتایج زیر از اجرای یک کد ساده PHP بر روی یک Macbook Pro, 2.5 GHz Intel Core i7 بدست آمده است.PHP version : 5.6.40
--------------------------------------
test_math                 : 1.101 sec.
test_stringmanipulation   : 1.144 sec.
test_loops                : 1.736 sec.
test_ifelse               : 1.122 sec.
Mem: 429.4609375 kb Peak mem: 687.65625 kb
--------------------------------------
Total time:               : 5.103PHP version : 7.0.33
--------------------------------------
test_math                 : 0.344 sec.
test_stringmanipulation   : 0.516 sec.
test_loops                : 0.477 sec.
test_ifelse               : 0.373 sec.
Mem: 421.0859375 kb Peak mem: 422.2109375 kb
--------------------------------------
Total time:               : 1.71PHP version : 7.1.28
--------------------------------------
test_math                 : 0.389 sec.
test_stringmanipulation   : 0.514 sec.
test_loops                : 0.501 sec.
test_ifelse               : 0.464 sec.
Mem: 420.9375 kb Peak mem: 421.3828125 kb
--------------------------------------
Total time:               : 1.868PHP version : 7.2.17
--------------------------------------
test_math                 : 0.264 sec.
test_stringmanipulation   : 0.391 sec.
test_loops                : 0.182 sec.
test_ifelse               : 0.252 sec.
Mem: 456.578125 kb Peak mem: 457.0234375 kb
--------------------------------------
Total time:               : 1.089PHP version : 7.3.4
--------------------------------------
test_math                 : 0.233 sec.
test_stringmanipulation   : 0.317 sec.
test_loops                : 0.171 sec.
test_ifelse               : 0.263 sec.
Mem: 459.953125 kb Peak mem: 460.3984375 kb
--------------------------------------
Total time:               : 0.984PHP version : 7.4.0-dev
--------------------------------------
test_math                 : 0.212 sec.
test_stringmanipulation   : 0.358 sec.
test_loops                : 0.205 sec.
test_ifelse               : 0.228 sec.
Mem: 459.6640625 kb Peak mem: 460.109375 kb
--------------------------------------
Total time:               : 1.003انتظار برای نسل هشتمدر مجموع PHP در سری هفتم خود دست به تغییرات اساسی زده است؛ به طوری که از آن به عنوان نسل جدیدی از PHP یاد می‌کنند. با همه این تغییرات، برنامه‌نویسان PHP باز هم منتظر اتفاقات مهم در نسخه هشتم این زبان خواهند بود. در پست بعدی کوئرامگ، درباره این تغییرات صحبت می‌کنیم.ترجمه شده بر اساس:wiki.PHP.net/rfc&quot;Evolution of PHP — v5.6 to v8.0&quot;, by Martynas Eskis&quot;5 New Features In PHP 7 That You Should Have A Look At&quot; @ StarTutorial&quot;Throwable Exceptions and Errors in PHP 7&quot; @ Trowski&quot;New in Symfony 4.4: Preloading Symfony Applications in PHP 7.4&quot;کوئرامگ مجله‌ای تخصصی برای توسعه‌دهندگان است که هر هفته با مطلب‌هایی در زمینه تکنولوژی، رشد فردی و آینده برنامه‌نویسی به‌روزرسانی می‌شود. برای اطلاع از آخرین مطلب‌های ما، می‌توانید توئیتر یا کانال تلگرام کوئرا را دنبال کنید.</description>
                <category>Zahra Delbari</category>
                <author>Zahra Delbari</author>
                <pubDate>Tue, 16 Jun 2020 14:20:14 +0430</pubDate>
            </item>
                    <item>
                <title>انقلاب پنج به هفت؛ داستان PHP (قسمت اول)</title>
                <link>https://virgool.io/Quera-Mag/evolution-of-php-v5-to-v7-ndntjax5igff</link>
                <description>برای خیلی از برنامه‌نویس‌ها، PHP v7 احتمالا هیجان‌انگیزترین نسخه منتشر شده است. این نسل از PHP از همان اولین ریلیز، با ویژگی‌ها و قابلیت‌های جدیدی که داشت به سرعت جای خود را در دل برنامه‌نویس‌ها باز کرد. در قسمت اول این سری، تغییرات و بهبودهای نسخه‌های ۷.۰ و ۷.۱ را مرور می‌کنیم. در قسمت‌ دوم هم به سراغ تغییرات نسخه‌های بعدی PHP v7 رفتیم و به زودی آپدیت‌های مورد انتظار برای PHP v8 را بررسی خواهیم کرد.اگر قصد یادگیری و تمرین زبان PHP را دارید، کافی است کمی پشتکار داشته باشید و سری به دوره «آموزش پروژه‌محور برنامه‌نویسی وب با PHP» در کوئراکالج بزنید. در این دوره با پروژه‌های واقعی از شرکت دیجی‌کالا و تمرین‌های مختلف سر و کار خواهید داشت.گمشده‌ای به نام PHP v6همین اول کار ممکن است این سوال برای شما هم پیش بیاید که چرا تغییرات نسخه ۷ را نسبت به نسخه ۵ بررسی می‌کنیم، به خاطر این است که نسخه ۶ تغییر مهمی نداشته است؟نمی‌دانم تا به حال دقت کرده‌اید که گاهی شرکت‌ها در نام‌گذاری نسخه‌های محصولات خود از روی بعضی از اعداد می‌پرند. مثلا هیچ وقت Windows 9 ،Samsung Galaxy Note 6 ،iPhone 9 و IPv5 به بازار ارائه نشدند. به غیر از دلیل seven ate nine که برای پرش از «ورژن ۹ها» آورده می‌شود، دلایل بازاریابی هم گاهی اوقات در این پرش موثر است.درباره ورژن ششم PHP هم یکی از این پرش‌ها اتفاق افتاد. PHP v6 قرار بود تا سال ۲۰۰۵ عرضه شود و پشتیبانی ذاتی از Unicode اصلی‌ترین ویژگی‌ای بود که توسعه‌دهندگان نوید آن را در نسخه جدید می دادند.در واقع هرچند در PHP ارسال یا دریافت اطلاعات Unicode امکان‌پذیر است اما خود PHP درک درستی از آن‌ها ندارد. تعریف string در PHP رشته‌ای از کارکتر‌های یک بایتی است؛ بنابراین موقع اعمال توابعی مانند substring و strlen با رشته‌های حاوی کاراکترهای Unicode نباید انتظار خروجی‌‌های دلخواه را داشته باشیم.در نهایت تمامی تلاش‌ها در راستای پیاده‌سازی Unicode بی‌نتیجه ماند. البته بسیاری از ویژگی‌های ریز و درشتی که برای این نسخه در نظر گرفته شد بود به branch نسخه 5.3 منتقل و در آن‌جا پیاده‌سازی شد. همین حالا هم عده‌ای معتقدند که PHP v5.3 در واقع همان PHP v6 است؛ ولی به هر حال PHP نتوانست نسل ششم خود را عرضه کند.با اینکه PHP v6 شکست خورد و هرگز به نتیجه نرسید اما خوشبختانه PHP v7 دارای یک جدول زمانی مشخص و واضح است. در ۱۲ آذر ۱۳۹۴ حاصل تلاش‌های دو ساله تیم توسعه با نام PHP v7 ارائه شد که یکی از موفق‌ترین تجربیات این تیم بود. در واقع از نظر آن‌ها انتشار PHP v7 نه فقط منتشر شدن یک نسخه جدید، بلکه ظهور نسل جدیدی از PHP با پتانسیلی بالا بود.اولین ریلیز نسل؛ PHP v7.0ورژن هفتم PHP با نسخه جدید از موتور zend، بهبود‌های قابل توجه و تعداد زیادی ویژگی‌ جدید روی کار آمد که در ادامه به بررسی تعدادی از این ویژگی‌ها می‌پردازیم.- پشتیبانی از Anonymous Classکلاس‌های Anonymous همان‌طور که احتمالا حدس زدید، کلاس‌هایی هستند که نام ندارند و با کلیدواژه new class تعریف می‌شوند. از این کلاس‌ها زمانی استفاده می‌شود که در طول اجرای کد فقط یک‌بار به آن‌ها نیاز داریم به همین خاطر ثبت کردن آنها به عنوان کلاسی مستقل و جداگانه لزومی ندارد.// Pre PHP 7 code
class Logger{
        public function log($msg){
                echo $msg;
        }
}

$util-&gt;setLogger(new Logger());


// PHP 7+ code
$util-&gt;setLogger(new class {
        public function log($msg){
                echo $msg;
        }
});- اضافه شدن تابع تقسیم عدد صحیحتابع Intdiv یک راه امن برای تقسیم دو عدد صحیح است؛ حتی زمانی که تقسیم بر صفر داشته باشیم. این تابع ورودی اول را بر ورودی دوم تقسیم می‌کند و حاصل تقسیم را به صورت یک عدد صحیح برمی‌گرداند. در صورتی که مقسوم علیه صفر باشد، یک E_WARNING تولید می‌شود و مقدار خروجی False است.var_dump(intdiv(3, 2)); \\int(1)

var_dump(intdiv(-3, 2)); \\int(-1)

var_dump(intdiv(PHP_INT_MIN, -1));\\Fatal error: Uncaught ArithmeticError: Division of PHP_INT_MIN by -1 is not an integer

var_dump(intdiv(1, 0));\\Fatal error: Uncaught DivisionByZeroError: Division by zero in- اضافه شدن عمل‌گر ??این عمل‌گر در صورتی که اولین متغیرش null باشد مقدار دومین متغیر و در غیر این صورت مقدار همان اولین متغیر را بر می‌گرداند. اصولا از آن برای تعریف مقدار پیش‌فرض برای یک متغیر در صورتی که تعریف نشده باشد استفاده می‌شود. از این عمل‌گر به صورت زنجیره‌ای هم می‌توان استفاده کرد.// Pre PHP 7 code
$username = isset($_GET[&#039;user&#039;]) ? $_GET[&#039;user&#039;] : &#039;nobody&#039;;

// PHP 7+ cod
$username = $_GET[&#039;user&#039;] ?? &#039;nobody&#039;;
$x = NULL;
$y = NULL;
$z = 3;
var_dump($x ?? $y ?? $z); // int(3)- اضافه شدن عمل‌گر Spaceshipاز این عمل‌گر برای بهینه کردن و ساده‌سازی عملیات مقایسه استفاده می‌شود.// Pre PHP 7 code
order_func($a, $b) {
        return ($a &lt; $b) ? -1 : (($a &gt; $b) ? 1 : 0);
}

// PHP 7+ code
order_func($a, $b) {
        return $a &lt;=&gt; $b;
}- قابلیت تعیین کردن type اسکالردر PHP به داده‌های int ،float ،string و boolean اسکالر گفته می‌شود.در PHP برای متغیر‌ها TYPE تعریف نمی‌شود. به همین دلیل تا قبل از این، پارامتر‌های ورودی تابع به صورت خودکار و با توجه به مقداری که هنگام فراخوانی تابع در آن می‌ریختیم تعیین می‌شد. اما حالا می‌توان type این پارامتر‌ها را از قبل مشخص کرد. این کار باعث می‌شود کنترل بهتری روی کد داشته باشیم و کد آسان‌تر خوانده شود.برای انجام آن دو روش وجود دارد:دقیق:در این روش در صورتی که type داده‌های‌ ارجاع شده به تابع با آن چیزی که تابع انتظار دارد هم‌خوانی نداشته باشد، خطا رخ می‌دهد. البته در مورد داده int در صورت لزوم می‌تواند با اضافه کردن 0. به انتهای عدد، آن را float در نظر بگیرد. برای فعال کردن این حالت کافی است مقدار strict_types را ۱ کنید.declare(strict_types=1);

function getSum(float $a, float $b) {
        return $a + $b;
}

getSum(3, &amp;quot2 week&amp;quot);
// Fatal error: Uncaught TypeError: Argument 2 passed to getSum() must be of the type float, string given

getSum(1.8,  &amp;quot4.5&amp;quot);
// Fatal error: Uncaught TypeError: Argument 2 passed to getSum() must be of the type float, string given

getSum(3.1, 2);
// int(2) change to float(2.0)
//returns float(5.1)اجباری:در این روش که حالت پیش‌فرض هم هست، حتی اگر type داده ارجاعی همخوانی نداشته باشد PHP سعی می‌کند آن‌ را به داده مورد نظر تبدیل کند.function getSum(float $a, float $b) {
        return $a + $b;
}

getSum(6, &amp;quot7 week&amp;quot);
//Here int(6) changed to float(6.0) and string “7 week” changed to float(7.0)
//with a Notice: A non well formed numeric value encountered
//returns float(13)

getSum(1.1, &amp;quot2.2&amp;quot);
//Here string &amp;quot2.2&amp;quot is changed to float(2.2) without any notice
//returns float(3.3)

getSum(3.1, 2);
// changes int(2) to float(2.0)
// returns float(5.1)البته باید توجه داشت این ویژگی در این نسخه فقط برای پارامتر‌های تابع وجود دارد و در تعریف متغیرها نمی‌توان نوع آن‌ها را مشخص کرد.- قابلیت تعیین کردن type خروجی تابعبا استفاده از این قابلیت می‌توان type خروجی مورد انتظار را در تعریف تابع مشخص کرد. خوبی این کار این است که می‌دانیم type خروجی تابع دقیقا چه خواهد بود و بدون دغدغه از خطای احتمالی، از آن در ادامه برنامه استفاده می‌کنیم.مانند تعیین type ورودی، برای خروجی هم همان دو حالت دقیق و اجباری وجود دارد.دقیق:declare(strict_types=1);

function getSum(float $a, float $b) : int {
        return $a + $b;
}

getSum(3.1, 2); //Fatal error:  Uncaught TypeError: Return value of getSum() must be of the type integer, float returnedاجباری:function getSum(float $a, float $b) : int {
        return $a + $b;
}

getSum(3.1, 2); // changes int(2) to float(2.0) and returns int(5)
- قابلیت مشخص کردن use به صورت گروهیاین قابلیت زمانی به کار می‌آید که بخواهیم از یک فضای اسمی مشترک (یا حداقل تا قسمتی مشترک) چندین موجودی را import کنیم. به جای اینکه تک‌تک آن‌ها را در خط‌های جداگانه تایپ کنیم، می‌توانیم با استفاده از group use قسمت مشترک آن‌ها را فاکتور بگیریم و نسخه خلاصه‌تری از آن را بنویسیم.// Pre PHP 7
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\NullOutput;

//  PHP 7+
use Symfony\Component\Console\{ Helper\Table, Input\ArrayInput, Output\NullOutput,};- بهبود Performanceهمانطور که از دو نمودار زیر پیدا است PHP v7 در خصوص کارایی و میزان استفاده از حافظه بهبود قابل توجهی نسبت به نسخه قبل از خود پیدا کرده است؛ به طوری که عملکرد آن در خصوص صفحه‌ای شامل درخواست‌های متنوع از پایگاه داده، با opcمقاache فعال حدود ۳ برابر و بدون opcache حدود ۲.۷ برابر سریعتر از PHP v5.6 است. از منظر حافظه هم می‌توان دید که تفاوت معناداری بین این دو نسخه وجود دارد.مقایسه کارایی در نسخه ۵.۶ و ۷.۰ PHPمقایسه مصرف حافظه در نسخه ۵.۶ و ۷.۰  PHP- قابلیت کنترل کردن خطاهاکنترل کردن fatal errorها در نسخه‌های قبلی PHP غیرممکن بود. این دست خطاها هیچ‌گونه handlerای را فراخوانی نمی‌کنند و صرفا اجرای اسکریپت را متوقف می‌کنند.در PHP v7، هنگام رخ دادن خطاهای E_RECOVERABLE_ERROR و E_ERROR به جای متوقف کردن اجرای اسکریپت، یک Exception ایجاد می‌شود. اما fatal errorها هنوز هم برای شرایط خاص مانند run out of memory وجود دارند و مانند گذشته عمل می‌کنند. این قانون برای Exceptionای که catch نشده باشد هم برقرار است.علاوه بر این، Exceptionهای ایجاد شده توسط fatal errorها برخلاف دیگر Exceptionها به جای ارث‌بری از کلاس Exception، از کلاس Error ارث‌بری می‌کنند. بنابراین برای راحتی کار و یکی کردن دو شاخه استثنای Exception و Error، هر دو interface جدیدی به نام Throwable را پیاده‌سازی می‌کنند.به این ترتیب، سلسله مراتب Exception جدید در PHP v7 به شکل زیر است:interface Throwable
   | - Exception implements Throwable
           | - ...
   | - Error implements Throwable
           | - TypeError extends Error
           | - ParseError extends Error
           | - ArithmeticError extends Error
                   | - DivisionByZeroError extends Arithmet- ویژگی Unicode برای نقطه‌کد‌های Escape Syntaxدر Unicode به هر کاراکتر یک «نقطه‌کد» (Code Point) تخصیص داده می‌شود. برای نمونه A به نقطه‌کد U+0041 نگاشت می‌شود که هگزادسیمال‌شده‌ همان 65 در سیستم دَه‌دَهی است. تا قبل از PHP v7 استفاده از نقطه‌کدها در رشته‌ها کار آسانی نبود و باید از توابعی مانند mb_convert_encoding استفاده می‌شد؛ اما PHP v7 با معرفی یک Escape Character برای این نقطه‌کد‌ها، کار را بسیار راحت کرده است.echo &amp;quotHi \u{1f606}&amp;quot//Hi ?- مجاز بودن تعیین Keys در ()listتکنولوژی PHP از ساختاری زبانی برای مقدار‌دهی چندین متغیر توسط عناصر یک آرایه به نام ()list استفاده می‌کند.list($first, $second, $third) = $someArray;تا قبل این نسخه از ()list فقط به همین صورت می‌شد استفاده کرد؛ یعنی اولین متغیری که در آن قرار می‌گرفت برابر با مقدار اولین خانه آرایه و دومین متغیر دومین خانه آرایه و الی آخر.اما در این نسخه می‌توان با استفاده از کلید‌های آرایه، مشخص کرد هر متغیر مقدار کدام خانه از آرایه را می‌خواهد.class ElePHPant{
        private $name, $colour, $age, $cuteness;

        public function __construct(array $attributes) {

                // Pre PHP 7 code
                $this-&gt;name = $attributes[&amp;quotname&amp;quot];
                $this-&gt;colour = $attributes[&amp;quotcolour&amp;quot];
                $this-&gt;age = $attributes[&amp;quotage&amp;quot];
                $this-&gt;cuteness = $attributes[&amp;quotcuteness&amp;quot];

                // PHP 7+ code
                 list(
                        &amp;quotname&amp;quot =&gt; $this-&gt;name,
                        &amp;quotcolour&amp;quot =&gt; $this-&gt;colour,
                        &amp;quotage&amp;quot =&gt; $this-&gt;age,
                        &amp;quotcuteness&amp;quot =&gt; $this-&gt;cuteness
                ) = $attributes;
        }
}همچنان انقلابی؛ PHP v7.1نسخه جدید سری ۷ در ۱۱ آذر ۱۳۹۵ منتشر شد. این نسخه نیز شامل تعداد زیادی تغییر و تحول بود که سعی می‌کنیم بعضی از مهم‌ترین‌هایشان را بررسی کنیم.- اضافه شدن Nullable Typesدر بسیاری از زبان‌های برنامه نویسی از جمله PHP معمول است که به متغیر اجازه دهیم یک type داشته باشد یا تهی بماند. این تهی‌بودن غالباً حاکی از خطا یا نبود چیزی برای برگرداندن است. تا قبل از این، بدون مشخص کردن type متغیر و یا دادن مقدار پیشفرض null به پارامتر‌های ورودی، می‌شد اینکار را انجام داد. مشکل زمانی است که type خروجی تابع مشخص می‌شود؛ در این صورت دیگر اجازه نداریم null را به عنوان خروجی بدهیم. اما در این نسخه با اضافه کردن ? قبل از type متغیر می‌توان اجازه داد خروجی null هم باشد.function answer(): ?int  { 
        return null; //ok
}

function answer(): ?int  {
        return 42; // ok
}

function answer(): ?int  {} // error -- none returned

function answer(): ?int {
        return new stdclass(); // error
}

function say(?string $msg) {
        if ($msg) {
                echo $msg;
        }
}

say(&#039;hello&#039;); // ok -- prints hello
say(null); // ok -- does not print
say(); // error -- missing parameter
say(new stdclass); //error -- bad type- اضافه شدن خروجی Voidfunction should_return_nothing(): void {
        return 1; // Fatal error: A void function must not return a value
}

function lacks_return(): void {
        // valid
}

function returns_nothing(): void {
        return; // valid
}

function returns_null(): void {
        return null; // Fatal error: A void function must not return a value
}برخلاف دیگر typeهای خروجی که هنگام فراخوانی تابع چک می‌شوند، Void در زمان کامپایل بررسی می‌شود؛ به این معنی که بدون نیاز به فراخوانی تابع، خطا ایجاد می‌شود.- اضافه شدن شبهِ Type قابل تکرار (Pseudo Iterable Type) برای یک تابع در PHP این اتفاق معمول است که یک آرایه و یا یک شیء (که واسط Traversableرا پیاده‌سازی کرده است) به عنوان ورودی بپذیرد تا بتواد با استفاده از foreach اعضای آن را پیمایش کند. اما از آن‌جا که آرایه Primitive Type و Traversableیک واسط هستند، تا قبل از این نمی‌شد type ورودی یا خروجی را طوری تعیین کرد که نشان‌دهنده قابل تکرار (Iterable) بودنش باشد. PHP v7.1 با معرفی شبهِ type قابل تکرار (Iterable Pseudo-Type) این مشکل را حل کرده است.function foo(iterable $iterable) {
        foreach ($iterable as $value) {
                // ...
        }
}function bar(): iterable {
        return [1, 2, 3];
}مقدار پیش‌فرض Iterable می‌تواند یک آرایه و یا null باشد.function foo(iterable $iterable = [ ]) {
        // ...
}- قابلیت جدید Closure from Callableقابلیت Closure برای نمایش توابع anonymous به کار می‌رود. در واقع متغیر‌هایی که شامل این توابع هستند اشیای کلاس Closureاند.$a = function(){ echo “hi”;}; \\ a is a object of Closure classبه علاوه این، Callable شبهِ typeای است که با استفاده از آن می‌توان توابع را با استفاده از نام‌شان به صورت داینامیک در هر کجای برنامه فراخوانی کرد.در این نسخه یک Static Method به کلاس Closure اضافه شده است که با استفاده از آن می‌توان یک Callable را مستقیما به یک Closure در همان Scope تبدیل کرد.class Closure {
         ...
        public static function fromCallable(callable $callable) : Closure {...}
         ...
}این تابع بررسی می‌کند که آیا Callable ورودی، در Scope فعلی قابل فراخوانی هست یا خیر. اگر بود closure ساخته شده را بر می‌گرداند؛ در غیر این صورت یک TypeError خروجی می‌دهد. به عنوان مثال تلاش برای ایجاد Closure به Private Method یک شی، اگر در خارج از scope شی باشد غیرممکن است ولی از درون شی موفقیت‌آمیز خواهد بود.برای مثال تکه‌کد زیر مشکلی ندارد؛ چون از تابع fromCallable در درون شی استفاده شده است.class Validator {

        public function getValidatorCallback($validationType) {
                if ($validationType == &#039;email&#039;) {
                        return Closure::fromCallable([$this, &#039;emailValidation&#039;]);
                }
                return Closure::fromCallable([$this, &#039;genericValidation&#039;]);
        }

        private function emailValidation($userData) {...}
        private function genericValidation($userData) {...}
}

$validator = new Validator();
$callback = $validator-&gt;getValidatorCallback(&#039;email&#039;);
$callback($userData);- جایگزینی ()list با [ ]با افزوده شدن این قابلیت بدون استفاده از تابع ()list می‌توان خانه‌های یک آرایه را بین چندین متغیر پخش کرد (شبیه همان چیزی که در بخش تغییرات نسخه ۷ گفته شد).$array = [&amp;quota&amp;quot =&gt; 1, &amp;quotb&amp;quot =&gt; 2, &amp;quotc&amp;quot =&gt; 3];

// Assigns to $a, $b and $c the values of their respective array elements in $array with keys
numbered from zero
[$a, $b, $c] = $array;

// Assigns to $a, $b and $c the values of the array elements in $array with the keys &amp;quota&amp;quot, &amp;quotb&amp;quot and &amp;quotc&amp;quot, respectively
[&amp;quota&amp;quot =&gt; $a, &amp;quotb&amp;quot =&gt; $b, &amp;quotc&amp;quot =&gt; $c] = $array;- اضافه شدن قابلیت تعیین سطوح دسترسی برای Constantها‌ی یک کلاسclass Token {
        // Constants default to public
        const  PUBLIC_CONST = 0;

        // Constants then also can have a defined visibility
        private const  PRIVATE_CONST = 0;
        protected const  PROTECTED_CONST = 0;
        public const  PUBLIC_CONST_TWO = 0;

        //Constants can only have one visibility declaration list
        private const  FOO = 1, BAR = 2;
}- پشتیبانی از اندیس منفی در Stringvar_dump(&amp;quotabcdef&amp;quot[-2]); \\ string (1) &amp;quote&amp;quot
var_dump(strpos(&amp;quotaabbcc&amp;quot, &amp;quotb&amp;quot, -3)); \\ int(3)- چندین نوع استثناء، یک بلوک Catchتا قبل از این در شرایطی که چند نوع مختلف از Exceptionها مانند هم کنترل می شدند مجبور بودیم یک بلوک ثابت Catch را به ازای هر Exception تکرار کنیم؛ اما در این نسخه این مشکل حل شده است.try {
        // Some code...
} catch (ExceptionType1 | ExceptionType2 $e) {
        // Code to handle the exception
} catch (\Exception $e) {
        // ...
}تغییرات دنباله‌دارهمان‌طور که در شروع مطلب هم گفتیم، بهبودهای PHP در آپدیت‌های بعدی PHP v7 هم ادامه داشت. در قسمت دوم این سری تغییرات نسخه‌های ۷.۲، ۷.۳ و ۷.۴ را بررسی کردیم و در آینده درباره پیش‌بینی‌ها از PHP v8 خواهیم گفت.ترجمه شده بر اساس:wiki.PHP.net/rfc&quot;Evolution of PHP — v5.6 to v8.0&quot;, by Martynas Eskis&quot;5 New Features In PHP 7 That You Should Have A Look At&quot; @ StarTutorial&quot;Throwable Exceptions and Errors in PHP 7&quot; @ Trowskiکوئرامگ مجله‌ای تخصصی برای توسعه‌دهندگان است که هر هفته با مطلب‌هایی در زمینه تکنولوژی، رشد فردی و آینده برنامه‌نویسی به‌روزرسانی می‌شود. برای اطلاع از آخرین مطلب‌های ما، می‌توانید توئیتر یا کانال تلگرام کوئرا را دنبال کنید.</description>
                <category>Zahra Delbari</category>
                <author>Zahra Delbari</author>
                <pubDate>Sun, 07 Jun 2020 19:53:15 +0430</pubDate>
            </item>
            </channel>
</rss>