ÊÞÑíÑ : ÔÑÍ ÇáÝÑÞ Èíä PHP 5.6 vs PHP7 ãä ããíÒÇÊ æ ÊÛííÑÇÊ æ ÊÍÓíäÇÊ
ÞÇã ÝÑíÞ ÊØæíÑ PHP ÈÊÍÓíäÇÊ ÌÈÇÑÉ Ýí PHP 7 ÍíË Êã ÒíÇÏÉ ÓÑÚÊåÇ Åáì ÇáÖÚÝ ÊÎíá ãÚí Ãä PHP 7 ÓÑÚÊåÇ ÇáÂä ÖÚÝ ÓÑÚÉ PHP 5.6 æÇáÝÖá íÚæÏ Åáì ÇáãÍÑß ÇáãÓÊÎÏã áÊØæíÑ PHP ÍíË Çä äÓÎÉ PHP 7 Êã ÈäÇÆåÇ Úáì Zend Engine ÌÏíÏ ßáíÇ ßÇä ÇáåÏÝ ÇáÃÓÇÓí ÇáÞæÉ æÇáãÑæäÉ æÇáÓÑÚÉ æÇíÖÇ ÏÚã ÃÝÖá áÜ64-bit æáíÓ åÐÇ ÝÞØ ãÇÊÞÏãå PHP 7 ÍíË Êã ÃíÖÇ ÅÖÇÝÉ ããíÒÇÊ ÌÏíÏÉ ãä ÏæÇá æ ßáÇÓÇÊ ÞíãÉ ÊÓÑÚ ãä ÃÚãÇáß ÇáÈÑãÌíÉ æÊÓåáåÇ æ ÊÍÓíä Úãá æÙÇÆÝ ÓÇÈÞÉ æÊØæíÑåÇ ááÃÝÖá æãä Ãåã ÇáÊØæÑÇÊ ÈåÐå ÇáäÓÎÉ Ãäå Êã ÅÒÇáÉ ÇáÚÏíÏ ãä ÇáãßÊÈÇÊ æÇáÅÖÇÝÇÊ ÇáÞÏíãÉ ÇáÛíÑ ãÓÊÎÏãÉ ÓäÓÊÚÑÖ ÌãíÚ ÇáããíÒÇÊ ÇáÌÏíÏÉ æÇåã ÌæÇäÈåÇ ÈÃãËáÉ ãíÓÑÉ æÈÓíØÉ áÝåãåÇ ãä ÇáäÇÍíÉ ÇáÈÑãÌíÉ
ÞÈá Ãä äÈÏà ÞãÊ ÈÊËÈíÊ PHP 7 Úáì ÌåÇÒí ÈÅÓÊÎÏÇã åÐå ÇáãßÊÈÉ php7dev æåí ÊÚÊãÏ ÈÚãáåÇ Úáì vagrant æ VirtualBox æÌãíÚåã ãÌÇäíÉ æÓåá ÇáÊÑßíÈ ãÇÒÇáÊ PHP7 ÈãÑÇÍá ÇáÊØæíÑ æÞÑíÈÇ ÈåÐÇ ÇáÔåÑ ÓæÝ íÊã ÅÕÏÇÑ ÇáäÓÎÉ ÇáäåÇÆíÉ ãÇáã íßä åäÇáß ØÇÑÆ íãäÚ Ðáß
ÊÍÏíÏ äæÚ ÇáãÊÛíÑÇÊ ÇáãÏÎáÉ Úáì Ãí ÏÇáÉ Scalar type declarations
ÇÕÈÍ ãä Çáããßä Ýí PHP7 ÊÍÏíÏ äæÚ ÇáãÊÛíÑÇÊ ÚäÏ ÇÏÎÇáåÇ ÈÃí ÏÇáÉ áÏíß áíÊã ãÚÇáÌÊåÇ ÈÔßá ÕÍíÍ áäÝÑÖ Çä áÏíß ÏÇáÉ ÊÞæã ÈÚãáíÉ ÍÓÇÈíÉ ãËáÇ ÌãÚ æÊÑÛÈ Çä Êßæä ÌãíÚ ÇáãÏÎáÇÊ ÚÈÇÑÉ Úä ÇÑÞÇã áÊÚãá ÇáÏÇáÉ ÈÔßá Óáíã ÈÏæä Ãí ãÔÇßá ãÚ PHP7 ÇÕÈÍ ÓåáÇ ÊÍÏíÏ ÇáäæÚ ÇáãØáæÈ ÅÏÎÇáå ááÏÇáÉ áÊÚãá Çæ ÓæÝ íäÊÌ ÎØÃ ÚäÏ Úãá ÇáßæÏ íÈáÛ ÇáãÓÊÎÏã Çäß áã ÊÞã ÈÅÏÎÇá ÇáäæÚ ÇáÕÍíÍ ááÏÇáÉ áÊÚãá ÈÏæä ãÔÇßá ØÈÚÇ áÊÓåá Úáíß ÃßËÑ ÓÇÈÞÇ Ýí PHP5 ßÇäÊ íØáÞ Úáì åÐå ÇáãíÒÉ
Type Hints æáßä ÚíÈåÇ ÇäåÇ ßÇäÊ ãÍÏæÏÉ Úáì ÇäæÇÚ ÞáíáÉ ãä ÇáÈíÇäÇÊ ãËá class æ array æ callable æ self æ interface Êã ÊØæíÑåÇ Ýí PHP7 áÊÏÚã ÇäæÇÚ ÇßËÑ ãËá string æ boolean æ integer æ float
íæÌÏ ØÑíÞÊíä áÚãá åÐå ÇáÎÇÕíÉ ÇáÃæáì coercive æåí ÇáÅÝÊÑÇÖíÉ æ ÇáØÑíÞÉ ÇáËÇäíÉ strict
ÈÇáäÓÈÉ ááØÑíÞÉ ÇáÃæáì
coercive æåí ÇáÅÝÊÑÇÖíÉ ÝÇä PHP ÓÊÍÇæá Çä Êßæä ãÑäÉ æÊÞæã ÈÊÍæíá ÇáäæÚ ÇáãÏÎá Çáì ÇáäæÚ ÇáÐí ÞãÊ ÈÊÍÏíÏå ÚäÏ ÊÚÑíÝß ááÏÇáÉ ÝÅä Êã ÇáÊÍæíá ÈäÌÇÍ ÓæÝ ÊÚãá ÇáÏÇáÉ ÈÏæä ãÔÇßá æÇä áã íÊã ÇáÊÍæíá ÓæÝ íäÊÌ ÎØÃ ãä äæÚ TypeError
ãËÇá ÈÓíØ áÊæÖÍ ÇáÕæÑÉ áåÐå ÇáãíÒÉ
<?php
// Coercive mode
function sumOfInts(int ...$ints)
{
return array_sum($ints);
}
var_dump(sumOfInts(2, '3', 4.1)); Ýí åÐÇ ÇáãËÇá Óíßæä ÇáäÇÊÌ ßÇáÊÇáí
áÇÍÙ ÈåÐÇ ÇáãËÇá ØáÈäÇ Çä íßæä ÇáäæÚ ÇáãÏÎá ÇÑÞÇã ÕÍíÍÉ ÈÇÓÊÎÏÇã ÇáãÝÊÇÍ int æáßä ÚäÏ ÅÓÊÎÏÇã ÇáÏÇáÉ ÒæÏäÇåÇ ÈÇÑÞÇã ÕÍíÍÉ æÇÑÞÇã ÚÔÑíÉ æäÕ ÈÇáÑÞã Ù£ ØÈÚÇ PHP7 ÓÊÞæã ÈÊÍæíá åÐå ÇáÃäæÇÚ Çáì ÃÚÏÇÏ ÕÍíÍÉ Ëã ÇÓÊÎÏÇãåÇ ÏÇÎá ÇáÏÇáÉ áÊÚãá ÈÔßá Óáíã æáßä
ÚäÏ ÅÓÊÎÏÇã ÇáØÑíÞÉ ÇáËÇäíÉ strict æíÊã ÊÚÑíÝåÇ ÏÇÎá ÇáãáÝ ÈÇÓÊÎÏÇã ÇáÏÇáÉ declare ÝÅä ÇáÊÍÞÞ Óíßæä ÕÇÑã æÛíÑ ãÑä ÈÍíË íÌÈ Çä Êßæä ÌãíÚ ÇáãÊÛíÑÇÊ ÇáãÏÎáÉ Úáì ÇáÏÇáÉ ÈäÝÓ ÇáäæÚ ÇáãÍÏÏ Çæ Ãäå ÓíäÊÌ ÎØÃ ÚäÏ Úãá ÇáßæÏ íÎÈÑß Çä ÇáäæÚ ÇáãÏÎá ÎØÃ
äÝÓ ÇáãËÇá ÇáÓÇÈÞ æáßä ÈÊÝÚíá ÇáÎÇÕíÉ strict
<?php
// Strict mode
declare(strict_types=1);
function sumOfInts(int ...$ints)
{
return array_sum($ints);
}
var_dump(sumOfInts(2, '3', 4.1)); Ýí åÐÇ ÇáãËÇá Óíßæä ÇáäÇÊÌ ßÇáÊÇáí
ãáÇÍÙÉ: ÚäÏ ÇÓÊÎÏÇã strict ÏÇÎá ÇáãáÝ ÝÅäå ÓíÄËÑ Úáì ÌãíÚ ÇáÚãáíÇÊ Ýí PHP ÏÇÎá ÇáãáÝ ÚäÏ ãÚÇáÌÊåÇ áÊßæä ÇßËÑ ÕÑÇãÉ æÈÏæä ãÑæäÉ Ýáä ÊÞæã PHP ÈÇáÊÍæíá Èíä ÇáÃäæÇÚ áÅÓÊÎÏÇãåÇ æáßä ÓíäÊÌ ÎØÃ ãÈÇÔÑÉ ÚäÏ ÅÏÎÇá Ãí äæÚ ÎÇØÆ
ÊÍÏíÏ äæÚ ÇáÞíã ÇáãÑÌÚÉ ÚäÏ ÅÓÊÎÏÇã Ãí ÏÇáÉ Return type declarations
Ýí PHP7 Êã ÊØæíÑ åÐå ÇáãíÒÉ áÊÓãÍ áß ÈÊÍÏíÏ äæÚ ÇáãÎÑÌÇÊ Çæ ÇáÞíã ÇáãÑÌÚÉ ÈÚÏ ãÚÇáÌÊåÇ ÏÇÎá ÇáÏÇáÉ ãËáÇ áÏíß ÏÇáÉ æÊÑÛÈ Çä íßæä ÇáäÇÊÌ ÏÇÆãÇ ÑÞã ÕÍíÍ ÍÊì áæ ÞãÊ ÈÅÏÎÇá ÃÑÞÇã ÚÔÑíÉ ÝÅä åÐå ÇáãíÒÉ ÊÓãÍ áß ÈÊÍÏíÏ äæÚ ÇáäÇÊÌ Èßá ÓåæáÉ
ãáÇÍÙÉ: åÐå ÇáãíÒå ÔÈíå ÈÚãáåÇ ãËá Scalar type declarations ÝÇäåÇ ÓÊÚãá ÇÝÊÑÇÖíåÇ ÊÍÊ coercive mode Çí ÓÊßæä ãÑäÉ Çæ ÊÍÊ strict mode ÚäÏ ÊÚÑíÝåÇ ÈÇáãáÝ æÊßæä ÕÇÑãÉ ÈÇáÊÍÞÞ ãä ÃäæÇÚ ÇáÈíÇäÇÊ
ãËÇá ÈÓíØ áÊæÖÍ ÇáÝßÑÉ ÃßËÑ
<?php
// Coercive mode
function sum($a, $b): int {
return $a + $b;
}
// Note that an int will be returned.
var_dump(sum(1, 2.5));
ÇáäÇÊÌ Óíßæä ßÇáÊÇáí ÚäÏ Úãá ÇáßæÏ
áæ
ÊáÇÍÙ ÈÇáãËÇá ÇÏÎáäÇ ÇÍÏ ÇáÞíã ÚÔÑíÉ æãÚ Ðáß äÇÊÌ ÇáÌãÚ ßÇä ÚÏÏ ÕÍíÍ æÇáÓÈÈ ÇääÇ ÞãäÇ ÈÊÍÏíÏ äæÚ ÇáÞíãÉ ÇáãÑÌÚÉ ÈÚÏ ãÚÇáÌÊåÇ Çä Êßæä ãä äæÚ ÚÏÏ ÕÍíÍ ÈÇÓÊÎÏÇã ÇáãÝÊÇÍ int
æáßä ÚäÏ ÊÝÚíá strict mode
<?php
//Strict mode
declare(strict_types=1);
function sum($a, $b): int {
return $a + $b;
}
// Note that an Error will be returned.
var_dump(sum(1, 2.5)); ÝÅä ÇáäÇÊÌ Óíßæä ßÇáÊÇáí
ÚÇãá Null coalesce operator (??)
Ýí ÇáÈÑãÌÉ ÇÕÈÍ ÔÇÆÚÇ ÇÓÊÎÏÇã ÚÇãá ternary ãÚ ÏÇáÉ isset æÐáß ááÊÍÞÞ ãä ÞíãÉ Ãí ãÊÛíÑ ÅÐÇ ßÇäÊ ãæÌæÏÉ æáíÓÊ NULL ÝÅäå ÓæÝ íÊã ÅÑÌÇÚ ÇáÞíãÉ ÇáãæÌæÏÉ Çæ äÞæã ÈÅÑÌÇÚ ÞíãÉ ÃÎÑì
ãËÇá Úáì ÇÓÊÎÏÇã isset ãÚ ÚÇãá ternary æåãÇ ÎÇÕíÉ ÞÏíãÉ Ýí PHP ãÝíÏ Úä ÇáÊÚÇãá ãÚ ÇáäãÇÐÌ æãÚÇáÌÊåÇ
<?php
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody'; åÐÇ ÇáãËÇá ÓæÝ íÊÍÞÞ ãä æÌæÏ
$_GET['user']
Åä ßÇä ÞíãÊå ãæÌæÏÉ æáíÓÊ ãä ÇáäæÚ NULL ÓíÊã ÇÓÊÎÏÇã ÇáÞíãÉ ÇáãÏÎáÉ ááãÊÛíÑ username æÅä ßÇäÊ ÇáÞíãÉ NULL Çæ ÛíÑ ãæÌæÏÉ ÓíÊã ÊÚííä ÞíãÉ username Çáì nobody
ÇÕÈÍ Ýí PHP7 ÊäÝíÐ åÐÇ ÇáÃãÑ Èßá ÓåæáÉ ÈÅÓÊÎÏÇã ÚÇãá Null coalesce (??)
äÝÓ ÇáãËÇá ÇáÓÇÈÞ ããßä ÊäÝíÐå ÈÇáÊÇáí
<?php
// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody'; æÃíÖÇ ÊÓÊØíÚ ÇáÊÍÞÞ ãä Þíã ãÊÚÏÏÉ æÅÑÌÇÚ ÇáÞíãÉ ÇáãæÌæÏÉ æÇáÊí áÇíßæä ãÍÊæÇåÇ NULL ßÇáÊÇáí
<?php
// Coalesces can be chained: this will return the first
// defined value out of $_GET['user'], $_POST['user'], and
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody'; Ýí åÐÇ ÇáãËÇá ÓæÝ ÊÞæã PHP7 ÈÇáÊÍÞÞ ãä Þíã ÇáãÊÛíÑÇÊ ÈÇáÊÑÊíÈ æÚäÏãÇ íÊÍÞÞ ÇáÔÑØ Ãí Çä ÇáÞíãÉ ãæÌæÏÉ æáíÓÊ NULL ÓæÝ íÊã ÇÓÊÎÏÇãåÇ ãÈÇÔÑÉ
ãËáÇ áæ ÞíãÉ
$_GET['user'] ãÚÑÝÉ æáíÓÊ NULL ÝÇäå ÓíÊã ÊÚííäå ßÞíãÉ ááãÊÛíÑ username æÝí ÍÇá ÚÏã ÊÍÞÞ ÇáÔÑØ ÓíÊã ÇáÊÍÞÞ ãä
$_POST['user'] ÝÅä ßÇä ãÚÑÝ æáíÓ NULL ÓíÊã ÊÚííäå ßÞíãÉ ááãÊÛíÑ username ÈÇáÃÎíÑ Åä áã íÊÍÞÞ ÇáÔÑØ ÝÅäå ÓíÊã ÊÚííä ÞíãÉ username Åáì nobody
ÚÇãá Spaceship operator <=>
ÚÇãá ãÞÇÑäÉ ÌÏíÏ Ýí PHP7 æÙíÝÊå ÇáãÞÇÑäÉ Èíä (ÊÚÈíÑíä expressions) Óíßæä äÇÊÌ åÐå ÇáãÞÇÑäÉ ÅãÇ -1 Çæ 0 Çæ 1
ãËáÇ ÚäÏ ÇáãÞÇÑäÉ Èíä ãÊÛíÑíä ÇáãÊÛíÑ a æÇáãÊÛíÑ b Óíßæä äÇÊÌ ÇáãÞÇÑäÉ ÈÇáÅÚÊãÇÏ Úáì Þíã ÇáãÊÛíÑíä ßÇáÊÇáí
- Óíßæä ÇáäÇÊÌ -1 Åä ßÇä ÇáãÊÛíÑ a ÇÕÛÑ ãä b
Óíßæä ÇáäÇÊÌ 0 Åä ßÇä ÇáãÊÛíÑ a íÓÇæí b
- Óíßæä ÇáäÇÊÌ 1 Åä ßÇä ÇáãÊÛíÑ a ÇßÈÑ ãä b
ãËÇá ÈÓíØ áÊæÖÍ ÇáÕæÑÉ ÃßËÑ
<?php
// Integers
echo 1 <=> 1; // 0 equal
echo 1 <=> 2; // -1 less than
echo 2 <=> 1; // 1 greater than
// Floats
echo 1.5 <=> 1.5; // 0 equal
echo 1.5 <=> 2.5; // -1 less than
echo 2.5 <=> 1.5; // 1 greater than
// Strings
echo "a" <=> "a"; // 0 equal
echo "a" <=> "b"; // -1 less than
echo "b" <=> "a"; // 1 greater than
ÊÚÑíÝ ãÕÝæÝÉ ßËÇÈÊ Constant arrays ÈÅÓÊÎÏÇã ÇáÏÇáÉ define
ÇÕÈÍ ÈÅãßÇäß ÊÚÑíÝ ãÕÝæÝÉ ÈßËÇÈÊ Çí Çä ÌãíÚ Þíã ÇáãÕÝæÝÉ íÊßæä ãÊÛíÑÇÊ ãä äæÚ constatnt ÈÇÓÊÎÏÇã ÇáÏÇáÉ define Ýí PHP 5.6 ßÇä ãä Çáããßä ÊÚÑíÝ ÇáãÕÝæÝÉ Úáì ÇäåÇ constatnt ÈÇÓÊÎÏÇã ÇáãÝÊÇÍ const ÝÞØ æáßä Ýí PHP7 ÇÕÈÍ ãä Çáããßä ÇÓÊÎÏÇã ÇáÏÇáÉ define
ãËÇá ÈÓíØ
<?php
define('ANIMALS', [
'dog',
'cat',
'bird'
]);
echo ANIMALS[1]; // outputs "cat" äÇÊÌ Úãá ÇáßæÏ ßÇáÊÇáí
ÊÚÑíÝ ßáÇÓÇÊ ãÌåæáÉ Anonymous classes
ÇáÂä ÃÕÈÍ ÈÅãßÇäß ÊÚÑíÝ ßáÇÓÇÊ ãÌåæáÉ Ãí áã íÓÈÞ Çä Êã ÊÚÑíÝåÇ ãä ÞÈá ÈÅÓÊÎÏÇã new class ãÝíÏÉ ÅÐÇ ßäÊ ÊÑÛÈ ÈÅÓÊÎÏÇã ßáÇÓ áãÑÉ æÇÍÏÉ ÏÇÎá ãÔÑæÚß æáÇÊÑÛÈ ÈßÊÇÈÉ ãáÝ ÌÏíÏ æÊÚÑÝ ÇáßáÇÓ ÈÏÇÎáå ÊÍÊ ãÓãì ãÚíä Ëã ÅÓÊÏÚÇÆå áíÊã ÅÓÊÎÏÇãå ÇáÂä ÊÓÊØíÚ ãÈÇÔÑÉ ÊÚÑíÝ ÇáßáÇÓ ÈÔßá ãÌåæá Ýí PHP7
ãËÇá ÈÓíØ áÊæÖÍ ÇáÕæÑÉ
<?php
// new Anonymous class and assigne it to $newClass
$newClass = new class(10) {
private $num;
public function __construct($num)
{
$this->num = $num;
}
};
var_dump($newClass); äÇÊÌ Úãá ÇáßæÏ ßÇáÊÇáí
Ýí ÇáÓÇÈÞ ßÇä íÌÈ Çä äÞæã ÈÊÚÑíÝ ÇáßáÇÓ Ëã Úãá äÓÎå ãä åÐÇ ÇáßáÇÓ ÈÇÓÊÎÏÇã ÇáããÝÊÇÍ new æÊÚííäå ßÞíãÉ áãÊÛíÑ áíäÊÌ áÏíäÇ ßÇÆä äÊÚÇãá ãÚå Èßá ÓåæáÉ íæÌÏ ÈÇáãæÞÚ ÓáÓáÉ ãÞÇáÇÊ ÊæÖÍ ÇáÈÑãÌÉ ÇáßÇÆäíÉ ááÝÇÆÏÉ æãÚÑÝÊåÇ ÈÔßá ÃÝÖá
ÇáÈÑãÌÉ ÇáßÇÆäíÉ PHP OOP
ÏÚã ØÈÇÚÉ ÑãæÒ Unicode ÈÇáäÕæÕ
Ýí PHP7 ÃÕÈÍ ÈÅãßÇäß ØÈÇÚÉ Unicode codepoint Èßá ÓåæáÉ ÈÅÓÊÎÏÇã Unicode codepoint escape syntax
ãËÇá ÈÓíØ áÊæÖÍ ÇáÕæÑÉ
<?php
echo "\u{aa}";
echo "\u{0000aa}"; //(same as before but with optional leading 0's)
echo "\u{9999}";
ØÈÚÇ ÓíÊã ØÈÇÚÉ Ãí Unicode codepoint ÕÍíÍ ãÚ ÅãßÇäíÉ ÊÌÇåá ÇáÃÕÝÇÑ ÇáÊí ÊÃÊí ÈÇáÈÏÇíÉ
ÇáäÇÊÌ Óíßæä ßÇáÊÇáí
ÑÈØ ÏÇáÉ ÈßÇÆä ÈÅÓÊÎÏÇã Closure::call
åí ØÑíÞÉ ãÎÊÕÑÉ áÑÈØ Úãá ÏÇáÉ ÈÇÓÊÏÚÇÁ ßÇÆä Object ÏÇÎáåÇ æÊäÝíÐ ãÍÊæÇåÇ Ýí ÇáÓÇÈÞ ßäÇ äÓÊÎÏã bindTo áÑÈØ ÇáßáÇÓ ÇáãÑÇÏ ÊÖãíäå ÏÇÎá ÇáÏÇáÉ áÊäÝíÐ ÂæÇãÑ ÇáÏÇáÉ ÈÇáÔßá ÇáãÑÛæÈ
ãËÇá ÈÓíØ
<?php
class A {private $x = 1;}
// Pre PHP 7 code
$getXCB = function() {return $this->x;};
$getX = $getXCB->bindTo(new A, 'A'); // intermediate closure
echo $getX();
Ýí åÐÇ ÇáãËÇá ÞãäÇ ÈÅäÔÇÁ ßáÇÓ ÈÇÓã A Ëã ÃäÔÇÆäÇ ãÊÛíÑ getXCB æÈÏÇÎáå ÏÇáÉ ÈÓíØÉ ÓÊÞæã ÈÅÑÌÇÚ ÞíãÉ x æåÐÇ ÇáãÊÛíÑ ÚÈÇÑå Úä porperty áßÇÆä áÊÚãá åÐå ÇáÏÇáÉ ÈÔßá Óáíã íÌÈ Çä äÞæã ÈÑÈØ Ãí ßÇÆä íÍÊæí Úáì property ÈãÓãì x áÊÞæã ÇáÏÇáÉ ÈÅÑÌÇÚ ÇáÞíãÉ ÇáãØáæÈÉ æÈÅÓÊÎÏÇã bindTo äÓØíÚ ÑÈØ ÇáßÇÆä ÇáÕÍíÍ ÈåÐå ÇáÏÇáÉ áÊÚãá ÈÏæä ãÔÇßá
ÇáããíÒ Ýí PHP7 ÇÕÈÍÊ åÐå ÇáÚãáíÉ ÇÈÓØ æ ÃæÖÍ ÈÇÓÊÎÏÇã call áÅäÔÇÁ ÇáÑÈØ ãËÇá ÈÓíØ áÔßá ÇáßæÏ Ýí PHP7
<?php
class A {private $x = 1;}
// PHP 7+ code
$getX = function() {return $this->x;};
echo $getX->call(new A); ÇáäÊíÌÉ áÚãá ÇáãËÇáíä ÓÊßæä ãÊÔÇÈåÉ ßÇáÊÇáí
ÝáÊÑÉ ááßÇÆäÇÊ ÚäÏ ÇÓÊÎÏÇã ÇáÏÇáÉ unserialize
Êã ÅÖÇÝÉ åÐå ÇáãíÒÉ Ýí PHP7 áÒíÇÏÉ ÇáÃãÇä ÚäÏ ÅÓÊÎÏÇã ÇáÏÇáÉ unserialize ÚäÏãÇ ÊÓÊÎÏã Úáì ßÇÆäÇÊ objects ãä ãÕÇÏÑ ÛíÑ ãæËæÞÉ Ýåí ÊãäÚ ÇãßÇäíÉ ÍÞä Ãí ÃßæÇÏ ÛíÑ ãÑÛæÈ ÝíåÇ ÍíË íÍÏÏ ÇáãØæÑ ãÇåí ÇáßáÇÓÇÊ ÇáÊí íÑÛÈ ÈÚãá ÏÇáÉ unserialize ÚáíåÇ
ãËÇá ÈÓíØ áÊæÖÍ ÇáÕæÑÉ
<?php
//Clasess
class MyClass
{
public $name = 'ali';
};
class MyClass2{};
class MyClass3{};
//instantiate the class and Serilize it into String
$foo = serialize(new MyClass);
//Print the serialized String
echo $foo;
echo "<br>"; //HTML tag
// converts all objects into __PHP_Incomplete_Class object
$data = unserialize($foo, ["allowed_classes" => false]);
//Print the unserialized string
var_dump($data); Ýí åÐÇ ÇáãËÇá ÞãäÇ ÈÅäÔÇÁ ãÌãæÚÉ ãä ÇáßáÇÓÇÊ Ëã ÈÚÏ Ðáß ÃäÔÇÆäÇ ãÊÛíÑ ÈÅÓã foo æÈÏÇÎáå ÞãäÇ ÈÚãá serialize ááßáÇÓ MyClass ÈÚÏåÇ ØÈÚäÇ ÞíãÉ ÇáãÊÛíÑ Óíßæä ÞíãÊå
O:7:"MyClass":1:{s:4:"name";s:3:"ali";} Ëã ÈÚÏ Ðáß ÚÑÝäÇ ãÊÛíÑ ÌÏíÏ ÈÅÓã data æÞãäÇ ÈÏÇÎáå Úãá unserialize ááãÊÛíÑ foo ãÚ Úãá ÝáÊÑ ÈÚÏã Úãá ÇáÏÇáÉ æÝß Ãí ßÇÆä íÍãá ÇáßáÇÓ MyClass ßãÇ ÊáÇÍÙ ÃÕÈÍÊ ÇáÏÇáÉ unserialize ÊÞÈá ãÏÎáíä ÇáÃæá ÇáãÊÛíÑ ÇáãÑÇÏ Úãá ÇáÏÇáÉ Úáíå æÇáËÇäí ÇáÝáÊÑ ÇáãÑÇÏ ÊØÈíÞÉ ÚäÏ Úãá ÇáÏÇáÉ
äÇÊÌ Úãá ÇáßæÏ ÇáÓÇÈÞ Óíßæä ßÇáÊÇáí
æÇáÓÈÈ Çäå áã äÓãÍ ÈÚãá ÇáÏÇáÉ unserialize Úáì MyClass æáÐáß ÓíÊã ÅÏÑÇÌåÇ ÊÍÊ object(__PHP_Incomplete_Class) æáä íÊã ÊäÝíÐ ãÍÊæÇåÇ
ÊÓÊØíÚ ÅÓÊÎÏÇã ÃßËÑ ãä ÝáÊÑ ãËáÇ ÅÐÇ ßäÊ ÊÑÛÈ ÈÇáÓãÇÍ ÈÌãíÚ ÇäæÇÚ ÇáßÇÆäÇÊ æ ÇáßáÇÓÇÊ ßá ãÇÚáíß åæ ÊÛííÑ ÞíãÉ allowed_classes ãä false Åáì true
æÊÓØíÚ ÃíÖÇ ÅÏÎÇá ãÌãæÚÉ ãä ÇáßáÇÓÇÊ ÇáÊí ÊÑÛÈ ÈÚãá ÏÇáÉ unserialize Úáíåã ÏÝÚÉ æÇÍÏ ÈÊÛíÑ ÞíãÉ allowed_classes Çáì ãÕÝæÝÉ ÊÍãá ãÓãíÇÊ ÇáßáÇÓÇÊ
ãËÇá áÊæÖíÍ ÇäæÇÚ ÇáÝáÇÊÑ Çáããßä ÅÓÊÎÏÇãåÇ
<?php
//Clasess
class MyClass
{
public $name = 'ali';
};
class MyClass2{};
class MyClass3{};
//instantiate the class and Serilize it into String
$foo = serialize(new MyClass);
//Print the serialized String
echo $foo;
echo "<br>"; //HTML tag
// converts all objects into __PHP_Incomplete_Class object
$data = unserialize($foo, ["allowed_classes" => false]);
//Print the unserialized string
var_dump($data);
echo "<br>"; //HTML tag
// converts all objects into __PHP_Incomplete_Class object except those of MyClass and MyClass2
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]]);
//Print the unserialized string
var_dump($data);
echo "<br>"; //HTML tag
// default behaviour (same as omitting the second argument) that accepts all classes
$data = unserialize($foo, ["allowed_classes" => true]);
//Print the unserialized string
var_dump($data); ÈÇáãËÇá ÇáÃæá áã ÊÚãá ÇáÏÇáÉ æÊã ÍÝÙ ÇáßÇÆä ÏÇÎá __PHP_Incomplete_Class æáßä ÈÇáãËÇáíä ÇáÂÎÑíä ÚãáÊ ÈÏæä ãÔÇßá æÊã Úãá unserialize áåã áíÑÌÚæÇ áÔßáåã ÇáØÈíÚí
äÇÊÌ Úãá ÇáßæÏ ßÇáÊÇáí
ßáÇÓ IntlChar
ÚÈÇÑÉ Úä ßáÇÓ ÌÏíÏ Ýí PHP7 ááÊÚÇãá ãÚ Unicode æíÍÊæí Úáì ÚÏÏ ãä Methods ÇáÃÝÚÇá Çáããßä ÊØÈíÞåÇ Úáì Ãí Unicode
ãËÇá ÈÓíØ áÊæÖÍ ÇáÕæÑÉ
<?php
printf('%x', IntlChar::CODEPOINT_MAX);
echo '<br>'; // HTML tag
echo IntlChar::charName('@');
echo '<br>'; // HTML tag
var_dump(IntlChar::ispunct('!'));
echo '<br>'; // HTML tag
äÇÊÌ Úãá ÇáßæÏ ßÇáÊÇáí
ãáÇÍÙÉ: áÚãá åÐÇ ÇáßæÏ ÈÏæä ãÔßá íÌÈ Çä Êßæä åÐå ÇáãßÊÈÉ Intl ãËÈÊÉ
ÒíÇÏÉ ãÑæäÉ ÇáÏÇáÉ assert ÈÅÖÇÝÉ Expectations
Êã ÒíÇÏÉ ãÑæäÉ ÏÇáÉ ÇáÅÎÊÈÇÑ assert æÅÖÇÝÉ Expectations áåÇ ããÇ íÓãÍ áß ÈÅÏÎÇá ßÇÆä áÊÚÑíÝ äæÚ ÇáÎØÃ æÑÓÇáÉ ÇáÎØÃ ÇáÊí íÊã ÚÑÖåÇ Ýí ÇáÓÇÈÞ ßÇä ÇáãÏÎá ÇáËÇäí áåÐå ÇáÏÇáÉ íÌÈ Çä íßæä äÕ áÚÑÖ ÑÓÇáÉ ÇáÎØÃ ÇãÇ ÇáÂä ÃÕÈÍ ÈÅãßÇäß ÅÏÑÇÌ ßÇÆä Object áíÞæã ÈÏæÑå ÈÚÑÖ ÇáÎØÃ Throwable ÚäÏ ÝÔá ÇáÅÎÊÈÇÑ
ãËÇá ÈÓíØ áÊæÖÍ ÇáÕæÑÉ
<?php
ini_set('assert.exception', 1);
class CustomError extends AssertionError {}
assert(false, new CustomError('Some error message')); äÇÊÌ Úãá åÐÇ ÇáßæÏ ßÇáÊÇáí
ÃíÖÇ Êã ÒíÇÏÉ ãÑæäÉ åÐå ÇáÏÇáÉ æÃÕÈÍ ÈÅãßÇäß ÅÏÎÇá ãÞÇÑÇäÇÊ ÈíäãÇ Ýí ÇáÓÇÈÞ ßäÇ äÓÊØíÚ ÇÏÎÇá ÇáäÕæÕ Ãæ Þíã boolean áæÍÏåÇ ÝÞØ
ãËÇá áãÞÇÑäÉ Èíä true æ flase äÝÓ Úãá ÇáãËÇá ÇáÓÇÈÞ æáßä ÛíÑäÇ ÞíãÉ Çæá ãÏÎá Ýí ÇáÏÇáÉ
<?php
ini_set('assert.exception', 1);
class CustomError extends AssertionError {}
assert(true == false, new CustomError('True is not false!')); ÊÓÊØíÚ ãÔÇåÏÉ ÇáãÒíÏ Úä åÐå ÇáÏÇáÉ ãä åäÇ assert
ÅÓÊÏÚÇÁ ãÌãæÚÉ ßáÇÓÇÊ Ãæ ÏæÇá Ãæ ËæÇÈÊ ÈÅÓÊÎÏÇã Group use declarations
áæ ßÇä áÏíäÇ ãÌãæÚÉ ßáÇÓÇÊ Ãæ ÏæÇá Ãæ ËæÇÈÊ ãÚÑÝÉ ÏÇÎá namespace ãÚíä Ýí ÇáÓÇÈÞ ßäÇ äÓÊÏÚíåÇ ßá æÇÍÏ ÈÇãÑ ÈÅÓÊÎÏÇã ÇáãÝÊÇÍ use æáßä Ýí PHP7 Êã ÊØæíÑ ÇáãÝÊÇÍ use áíÞÈá ãÌãæÚÉ ãä ÇáãÓãíÇÊ áíÞæã ÈÅÓÊÏÚÇÆåã ÏÝÚÉ æÇÍÏÉ
ÞÈá PHP7 ßäÇ äÓÊÏÚí ÌãíÚ ÇáãáÝÇÊ ÇáÊí äÑíÏ ÈåÐå ÇáØÑíÞÉ
<?php
// Pre PHP 7 code
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; æáßä Ýí PHP7 äÞæã ÈÅÓÊÏÚÇÁ äÝÓ ÇáãáÝÇÊ ÈåÐå ÇáØÑíÞÉ
<?php
// PHP 7+ code
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};
Generator Return Expressions
Êã ÊØæíÑ Generator Ýí PHP5.5 æßÇäÊ ãä Ãåã ÇáÊØæÑÇÊ Ýí PHP æáßä áÇíãßä ÅÓÊÎÏÇã ÇáãÝÊÇÍ return ÏÇÎáåÇ ÝÊã ÊØæíÑåÇ Ýí PHP7 æÅÏÑÇÌ ÅãßÇäíÉ ÅÓÊÏÚÇÁ ÂÎÑ ÞíãÉ ãÑÌÚÉ ÈæÇÓØÉ ÇáãÝÊÇÍ return ßäÊíÌÉ äåÇÆíÉ ÈÚÏ ÅäÊåÇÁ Úãá ÇáßæÏ ÈÅÓÊÎÏÇã getReturn ÚäÏ ÇáÍÇÌÉ
ãËÇá ÈÓíØ
<?php
$gen = (function() {
yield 1;
yield 2;
return 3;
})();
foreach ($gen as $val) {
echo $val, PHP_EOL;
} äÇÊÌ åÐÇ ÇáßæÏ ßÇáÊÇáí ÓíÊã ÊÌÇåá ÇáãÝÊÇÍ return Úä ÇáÊÚÇãá ãÚ Generator
æáßä ÈÅÓÊÎÏÇã getReturn äÓÊØíÚ ØÈÇÚÉ ÂÎÑ ÞíãÉ ãÑÌÚÉ ÈæÇÓØÉ ÇáãÝÊÇÍ return æÇáÊí áÇíãßä ÅÓÊÎÏÇãåÇ ÅáÇ ÚäÏ ÅäÊåÇÁ Úãá Generator
ãËÇá áÊæÖÍ ÇáÕæÑÉ ÃßËÑ
<?php
$gen = (function() {
yield 1;
yield 2;
return 3;
})();
foreach ($gen as $val) {
echo $val, PHP_EOL;
}
echo $gen->getReturn(), PHP_EOL; ÚäÏ Úãá åÐÇ ÇáßæÏ ÝÅäå ÓíÊã ØÈÇÚÉ ÌãíÚ ÇáÃÑÞÇã ÍÊì Ù£
æåäÇ ÊÃÊí ÃåãíÉ åÐÇ ÇáÃãÑ ÍíË ÃÍíÇäÇ ÊÑÛÈ ÈÊäÝíÐ ÚãáíÉ ÃÎíÑÉ íÊã ÅäÊÇÌåÇ ÝÞØ ÚäÏ ÅäÊåÇÁ Úãá Generator æÚÑÖ äÇÊÌ ÇáÚãáíÉ ÈÔßá Óåá æãÑä Ýí ÇáÓÇÈÞ ßÇä íÊã ÇáÊÍÞÞ ÅÐÇ æÕá Generator ááÎØæÉ ÇáÃÎíÑÉ Þã ÈÊäÝíÐ åÐÇ ÇáßæÏ æÅÏÑÇÌå Öãä ÇáäÊÇÆÌ ÇáÂä ÃÕÈÍ ÃÓåá æ ÃæÖÍ Ýí PHP7
Generator delegation
ÚäÏ ÇáÚãá ãÚ 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;
} äÇÊÌ Úãá åÐÇ ÇáßæÏ ßÇáÊÇáí
ÞÓãÉ ÇáÃÚÏÇÏ ÇáÕÍíÍÉ ÈæÇÓØÉ ÇáÏÇáÉ intdiv
ÊÓØíÚ ÇáÂä ÊäÝíÐ ÇáÞÓãÉ Úáì ÇáÃÚÏÇÏ ÇáÕÍíÍÉ æÊßæä ÇáäÊíÌÉ ÇáãÑÌÚÉ ÚÏÏ ÕÍíÍ ÈæÇÓØÉ ÇáÏÇáÉ indiv
ãËÇá ÈÓíØ áÊæÖíÍ ÇáãíÒÉ
<?php
var_dump(intdiv(10, 3)); äÇÊÌ Úãá åÐÇ ÇáßæÏ Óíßæä ßÇáÊÇáí
ÅÚÏÇÏÇÊ ÇáÌáÓÇÊ Session options
ÇáÏÇáÉ session_start() ÃÕÈÍÊ ÇáÂä ÊÞÈá ãÕÝæÝÉ ãä ÇáÅÚÏÇÏÇÊ æÇáÊí ÈÏæÑåÇ ÊÞæã ÈÊÚÏíá ÇáÅÚÏÇÏÇÊ ÇáÊí ßÇäÊ ÈÇáÓÇÈÞ íÌÈ Çä ÊÚÏá Ýí php.ini æÇáÊí ÊÎÕ ÇáÌáÓÇÊ ØÈÚÇ ÇáÊÚÏíá íÄËÑ ÝÞØ Úáì ÇáãáÝ ÇáãÓÊÎÏã Ýíå ÇáÌáÓÉ æÊÓÊØíÚ ÇÓÊÎÏÇã read_and_close Öãä åÐå ÇáÅÚÏÇÏÇÊ áÊÎÈÑ PHP ÈÃä åÐå ÇáÅÚÏÇÏÇÊ íÌÈ Ãä ÊÞÑà ÝÞØ æÊÛáÞ ÇáÌáÓÉ ãÈÇÔÑÉ ÈÏæä ÊÚÏíá ÅÚÏÇÏÇÊ ÇáÌáÓÇÊ
ãËÇá ÈÓíØ áÊÛíÑ ÃÍÏ ÇáÅÚÏÇÏÇÊ
<?php
session_start([
'cache_limiter' => 'private',
'read_and_close' => true,
]); áãÚÑÝÉ ÇáãÒíÏ ãä ÇáÅÚÏÇÏÇÊ Çáããßä ÊÛííÑåÇ ãä åäÇ session configuration directives
ÏÇáÉ preg_replace_callback_array
Êã ÅÖÇÝÉ åÐå ÇáÏÇáÉ áÊÓåíá ÚãáíÉ ÇáÈÍË Úä ÃßËÑ ãä regular expression Ýí äÕ æÇÍÏ Èßá ÓåæáÉ æãÑæäÉ ÚßÓ ÓÇÈÞÇ ßäÇ äÓÊÎÏã preg_replace_callback() æßÇä ÇáÈÍË íßæä Úä regular expression æÇÍÏ Úä ØÑíÞ callback íÊÝÑÚ áÇÞÓÇã ãÊÚÏÏÉ ããÇíÌÚá ÇáÃßæÇÏ ÛíÑ ãÞÑÄÉ æÕÚÈÉ ÇáÝåã ÊÎíá Çäß ÊÑíÏ ÇáÈÍË Úä ÃßËÑ ãä ÊÚÈíÑ ÏÇÎá äÕ ßã ßæÏ ÊÍÊÇÌ áßÊÇÈÊå ááÍÕæá Úáì ÇáäÊíÌÉ
ãËÇá ÈÓíØ áÊæÖíÍ ÇáÕæÑÉ
<?php
$subject = 'Aaaaaa Bbb';
preg_replace_callback_array(
[
'~[a]+~i' => function ($match) {
echo strlen($match[0]), ' matches for "a" found <br>';
},
'~[b]+~i' => function ($match) {
echo strlen($match[0]), ' matches for "b" found';
}
],
$subject
); ßãÇ
ÊáÇÍÙ ÝÅä åÐå ÇáÏÇáÉ ÊÞÈá ãÏÎáíä ÇáÃæá ãÕÝæÝÉ ãä regular expression æÇáãÏÎá ÇáËÇäí ÃÓã ÇáãÊÛíÑ ÇáãÑÇÏ ÇáÈÍË ÈÏÇÎáå ÇáããíÒ Çäå ÈÅãßÇäß ÅÏÎÇá ãÇÊÑÛÈ ãä regular expression áíÊã ÇáÈÍË Úäåã ÏÇÎá ÇáäÕ Ïæä Çä ÊÞæã ÈÅÚÇÏÉ ßÊÇÈÉ ÏÇáÉ ÃÎÑì áäÝÓ ÇáåÏÝ
ÏæÇá ÊÔÝíÑ ÌÏíÏÉ CSPRNG Functions
Êã ÊØæíÑ ÏÇáÊíä ÌÏíÏÉ ááãÓÇÚÏÉ ÈÅäÊÇÌ ÃÑÞÇã ÚÔæÇÆíÉ Ãæ äÕæÕ æ ÃÑÞÇã ÚÔæÇÆíÉ áÅÓÊÎÏÇãåÇ ÈÇáÊÔÝíÑ æåãÇ
random_bytes() áÅäÊÇÌ äÕæÕ æÃÑÞÇã ÚÔæÇÆíÉ æÏÇáÉ random_int() áÅäÊÇÌ ÃÑÞÇã ÚÔæÇÆíÉ Èßá ÓåæáÉ æãÑæäÉ
ÊØæíÑ list
Êã ÊØæíÑ åÐå ÇáãíÒÉ ÍíË Çäå ßÇä Ýí ÇáÓÇÈÞ áÇÊÚãá ÈÔßá Óáíã ãÚ ÇáßÇÆäÇÊ ÇáÊí ÊÚÊãÏ Úáì ArrayAccess ÇáÊí ÊÓãÍ áß ÇáÊÚÇãá ãÚ ÇáßÇÆä ßÃäå ãÕÝæÝÉ ÍíË Ýí PHP7 Êã Íá åÐå ÇáãÔßáÉ äåÇÆíåÇ æÃíÖÇ ÚäÏ ÊÚÑíÝ ÇáãÊÛíÑÇÊ æÊÚíä Þíãåã ãä ÇáãÕÝæÝÉ ÝÅäå ÓÇÈÞÇ ÇáÞíã ÇáãÑÌÚÉ Êßæä ÈÊÑÊíÈ ãÞáæÈ ÇáÂä Êã Íá åÐå ÇáãÔßáÉ æÃÕÈÍ ÇáÊÑÊíÈ ÕÍíÍ Úáì ÍÓÈ ÊÚÑíÝß ááãÊÛíÑÇÊ æÊÑÊíÈß áåã æáÇÊÚãÏ Úáí ÂáíÉ ÇáÊÑÊíÈ ßËíÑÇ íãßä Çä ÊÊÛíÑ ÈÇáãÓÊÞÈá
ÇáãÝÖáÇÊ