PHP 7.2 المرجع
PHP 7.1 المرجع
تم إصدار PHP 7 في 3 ديسمبر 2015. ويأتي مزودًا بعدد من الميزات الجديدة والتغييرات وأعطال التوافق مع الإصدارات السابقة الموضحة أدناه.
أداء
سمات
عامل المقارنة المجمعة
عامل اندماج فارغ
إعلانات النوع العددي
تصريحات نوع العودة
فئات مجهولة
Unicode Codepoint الهروب بناء الجملة
طريقة إغلاق call()
تمت تصفيته unserialize()
فئة IntlChar
التوقعات
تصريحات use
المجموعة
تعبيرات إرجاع المولد
وفد المولدات
قسمة الأعداد الصحيحة باستخدام intdiv()
خيارات session_start()
وظيفة preg_replace_callback_array()
وظائف CSPRNG
دعم ثوابت المصفوفة في define()
إضافات الانعكاس
التغييرات
تخفيف قيود الكلمات المحجوزة
بناء جملة متغير موحد
الاستثناءات في المحرك
واجهة قابلة للرمي
دلالات عدد صحيح
تم استبدال ملحق JSON بـ JSOND
فشل ZPP عند تجاوز السعة
إصلاحات لسلوك foreach()
تغييرات على سلوك list()
التغييرات في القسمة بواسطة Zero Semantics
إصلاحات لقيم إرجاع معالج الجلسة المخصصة
إهمال مُنشئات PHP 4-Style
إزالة تحذير date.timezone
إزالة علامات PHP البديلة
إزالة الكتل الافتراضية المتعددة في بيانات التبديل
إزالة إعادة تعريف المعلمات ذات الأسماء المكررة
إزالة واجهات برمجة التطبيقات للخادم الميت
إزالة الدعم السداسي في السلاسل العددية
إزالة الوظيفة المهملة
إعادة تصنيف وإزالة إشعارات E_STRICT
إهمال خيار الملح لـ password_hash()
خطأ في القيم الحرفية الثمانية غير الصالحة
substr()
تغيير قيمة الإرجاع
التعليمات
ماذا حدث ل PHP 6؟
مما لا شك فيه أن الجزء الأكبر في PHP 7 هو تعزيز الأداء المذهل الذي يوفره للتطبيقات. وهذا نتيجة لإعادة هيكلة محرك Zend لاستخدام هياكل بيانات أكثر إحكاما وتخصيصات/إلغاء تخصيصات أقل للكومة.
ستختلف مكاسب الأداء في تطبيقات العالم الحقيقي، على الرغم من أن العديد من التطبيقات تبدو وكأنها تتلقى تعزيزًا في الأداء بنسبة 100% تقريبًا - مع استهلاك أقل للذاكرة أيضًا!
توفر قاعدة التعليمات البرمجية المُعاد هيكلتها المزيد من الفرص للتحسينات المستقبلية أيضًا (مثل تجميع JIT). لذلك يبدو أن إصدارات PHP المستقبلية ستستمر في رؤية تحسينات في الأداء أيضًا.
مقارنات مخططات أداء PHP 7:
شحن الويب باستخدام PHP 7
معايير من راسموس سيدني توك
عامل المقارنة المدمج (أو مشغل سفينة الفضاء) هو تدوين مختصر لإجراء مقارنات ثلاثية من معاملين. يحتوي على قيمة إرجاع عددية يمكن أن تكون إما:
عدد صحيح موجب (إذا كان المعامل الأيسر أكبر من المعامل الأيمن)
0 (إذا كان كلا المعاملين متساويين)
عدد صحيح سالب (إذا كان المعامل الأيمن أكبر من المعامل الأيسر)
يتمتع العامل بنفس الأسبقية مثل عوامل المساواة ( ==
, !=
, ===
, !==
) وله نفس السلوك تمامًا مثل عوامل المقارنة غير الدقيقة الأخرى ( <
, >=
, إلخ). كما أنها غير ترابطية مثلهم أيضًا، لذا فإن تسلسل المعاملات (مثل 1 <=> 2 <=> 3
) غير مسموح به.
// يقارن السلاسل بشكل معجمي var_dump('PHP' <=> 'Node'); // int(1)// مقارنة الأرقام حسب الحجمvar_dump(123 <=> 456); // int(-1)// يقارن عناصر المصفوفة المقابلة بعنصر آخر var_dump(['a', 'b'] <=> ['a', 'b']); // كثافة العمليات (0)
الكائنات غير قابلة للمقارنة، وبالتالي فإن استخدامها كمعاملات مع هذا العامل سيؤدي إلى سلوك غير محدد.
RFC: عامل المقارنة المشترك
عامل التجميع الفارغ (أو عامل التشغيل الثلاثي isset) هو تدوين مختصر لإجراء عمليات التحقق isset()
في المشغل الثلاثي. يعد هذا أمرًا شائعًا في التطبيقات، ولذلك تم تقديم بناء جملة جديد لهذا الغرض بالتحديد.
// ما قبل PHP 7 code$route = isset($_GET['route']) ? $_GET['route'] : 'index';// PHP 7+ code$route = $_GET['route'] ?? 'فِهرِس'؛
RFC: مشغل الدمج الفارغ
إعلانات النوع العددي تأتي في نسختين: القسرية (الافتراضية) والصارمة . يمكن الآن فرض الأنواع التالية من المعلمات (إما قسرا أو بشكل صارم): السلاسل ( string
) والأعداد الصحيحة ( int
) وأرقام الفاصلة العائمة ( float
) والقيم المنطقية ( bool
). إنها تزيد من الأنواع الأخرى المقدمة في إصدارات PHP 5.x: أسماء الفئات، والواجهات، array
، والقابلة callable
.
// وظيفة الوضع القسري sumOfInts(int ...$ints) {إرجاع array_sum($ints); }var_dump(sumOfInts(2, '3', 4.1)); // كثافة العمليات (9)
لتمكين الوضع الصارم، يجب وضع توجيه declare()
واحد في أعلى الملف. هذا يعني أن دقة كتابة الكميات القياسية يتم ضبطها على أساس كل ملف. لا يؤثر هذا التوجيه فقط على تعريفات نوع المعلمات، بل يؤثر أيضًا على نوع إرجاع الوظيفة (راجع تعريفات نوع الإرجاع)، ووظائف PHP المضمنة، والوظائف من الامتدادات المحملة.
إذا فشل التحقق من النوع، فسيتم طرح استثناء TypeError
(راجع الاستثناءات في المحرك). التساهل الوحيد الموجود في الكتابة الصارمة هو التحويل التلقائي للأعداد الصحيحة إلى أعداد عائمة (ولكن ليس العكس) عندما يتم توفير عدد صحيح في سياق عائم.
أعلن (strict_types = 1)؛ وظيفة تتضاعف (تعويم $x، تعويم $y) { إرجاع $x * $y؛ }إضافة وظيفة (int $x، int $y) { إرجاع $x + $y; }var_dump(multiply(2, 3.5)); // float(7)var_dump(add('2', 3)); // خطأ فادح: خطأ TypeError لم يتم اكتشافه: يجب أن تكون الوسيطة 1 التي تم تمريرها إلى add() من النوع الصحيح، والسلسلة المعطاة...
لاحظ أن سياق الاستدعاء فقط هو الذي ينطبق عند إجراء فحص النوع. وهذا يعني أن الكتابة الصارمة تنطبق فقط على استدعاءات الوظيفة/الأسلوب، وليس على تعريفات الوظيفة/الأسلوب. في المثال أعلاه، كان من الممكن الإعلان عن الوظيفتين في ملف صارم أو قسري، ولكن طالما تم استدعاؤهما في ملف صارم، فسيتم تطبيق قواعد الكتابة الصارمة.
فواصل قبل الميلاد
أصبحت الفئات ذات الأسماء int
و string
و float
و bool
محظورة الآن.
RFC: إعلانات النوع العددي
تتيح إعلانات نوع الإرجاع إمكانية تحديد نوع الإرجاع للدالة أو الطريقة أو الإغلاق. يتم دعم أنواع الإرجاع التالية: string
و int
و float
و bool
و array
و callable
و self
(الطرق فقط) و parent
(الطرق فقط) و Closure
و اسم الفئة و اسم الواجهة.
مصفوفات الدالةSum(array ...$arrays): array{ return array_map(function(array $array): int { return array_sum($array); }, المصفوفات $); }print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));/* OutputArray( [0] => 6 [1] => 15 [2] => 24)*/
فيما يتعلق بالتصنيف الفرعي، تم اختيار الثبات لأنواع الإرجاع. هذا يعني ببساطة أنه عندما يتم تجاوز طريقة ما في فئة فرعية أو تنفيذها على النحو المحدد في العقد، يجب أن يتطابق نوع الإرجاع الخاص بها تمامًا مع الطريقة التي يتم (إعادة) تنفيذها.
الفئة أ {} الفئة ب تمتد أ {} الفئة ج {اختبار الوظيفة العامة (): أ { إرجاع أ جديد؛ } }الفئة D تمتد C { // طريقة التجاوز C::test() : اختبار الوظيفة العامة (): B // خطأ فادح بسبب عدم تطابق التباين {إرجاع ب جديد؛ } }
تؤدي طريقة التجاوز D::test() : B
إلى حدوث خطأ E_COMPILE_ERROR
لأن التباين المشترك غير مسموح به. لكي ينجح هذا، يجب أن يكون للأسلوب D::test()
نوع إرجاع A
.
واجهة الفئة أ {} SomeInterface { اختبار الوظيفة العامة (): أ؛ }الفئة B تنفذ SomeInterface { اختبار الوظيفة العامة (): أ // كل شيء جيد! {إرجاع فارغ؛ // خطأ فادح: خطأ TypeError لم يتم اكتشافه: يجب أن تكون القيمة المرجعة لـ B::test() نسخة من A، وتم إرجاع قيمة فارغة... } }
هذه المرة، تتسبب الطريقة المطبقة في ظهور استثناء TypeError
(راجع الاستثناءات في المحرك) عند تنفيذها. وذلك لأن null
ليست نوع إرجاع صالحًا - حيث يمكن إرجاع مثيل للفئة A
فقط.
RFC: تصريحات نوع الإرجاع
تكون الفئات المجهولة مفيدة عند الحاجة إلى إنشاء كائنات بسيطة لمرة واحدة.
// Pre PHP 7 codeclass Logger { سجل الوظائف العامة ($msg) { صدى $msg؛ } }$util->setLogger(new Logger());// PHP 7+ code$util->setLogger(new class { public function log($msg) { صدى $msg؛ } });
يمكنهم تمرير الوسائط إلى منشئيهم، وتوسيع الفئات الأخرى، وتنفيذ الواجهات، واستخدام السمات تمامًا كما يمكن للفئة العادية:
فئة SomeClass {}interface SomeInterface {}trait SomeTrait {}var_dump(new class(10) Extends SomeClass Implements SomeInterface { Private $num; public function __construct($num) { $this->num = $num; } استخدم SomeTrait؛ });/** Output:object(class@anonymous)#1 (1) { ["رمز سطر الأوامر0x104c5b612":":class@anonymous":private]=> int(10)}*/
إن تداخل فئة مجهولة داخل فئة أخرى لا يمنحها إمكانية الوصول إلى أي أساليب أو خصائص خاصة أو محمية لتلك الفئة الخارجية. من أجل استخدام الخصائص أو الأساليب المحمية للطبقة الخارجية، يمكن للفئة المجهولة توسيع الطبقة الخارجية. لاستخدام الخصائص الخاصة أو المحمية للفئة الخارجية في الفئة المجهولة، يجب تمريرها من خلال مُنشئها:
<?phpclass خارجي { خاص $ الدعامة = 1؛ محمي $prop2 = 2; وظيفة محمية func1() { عودة 3؛ } الوظيفة العامة func2() { إرجاع فئة جديدة($this->prop) يمتد الخارجي { خاص $prop3; الوظيفة العامة __construct($prop) { $this->prop3 = $prop; } الوظيفة العامة func3() { إرجاع $this->prop2 + $this->prop3 + $this->func1(); } }; } }echo (خارجي جديد)->func2()->func3(); // 6
RFC: فئات مجهولة
يتيح ذلك إخراج نقطة ترميز Unicode المشفرة UTF-8 إما في سلسلة ذات علامتي اقتباس مزدوجتين أو في مستند متوارث. يتم قبول أي نقطة تشفير صالحة، مع كون 0
البادئ اختياريًا.
صدى "u{aa}"; // ªecho "u{0000aa}"; // ª (كما كان من قبل ولكن مع وجود أصفار بادئة اختيارية)echo "u{9999}"; // 香
RFC: بناء جملة Unicode Codepoint Escape
يتم استخدام طريقة call()
الجديدة لعمليات الإغلاق كطريقة مختصرة لاستدعاء الإغلاق أثناء ربط نطاق الكائن به. يؤدي هذا إلى إنشاء تعليمات برمجية أكثر أداءً وضغطًا عن طريق إزالة الحاجة إلى إنشاء إغلاق وسيط قبل استدعاءه.
class A {private $x = 1;}// كود ما قبل PHP 7$getXCB = function() {return $this->x;};$getX = $getXCB->bindTo(new A, 'A'); // صدى الإغلاق المتوسط $getX(); // 1// PHP 7+ code$getX = function() {return $this->x;};echo $getX->call(new A); // 1
RFC: الإغلاق::call
unserialize()
تسعى هذه الميزة إلى توفير أمان أفضل عند إلغاء تسلسل الكائنات الموجودة على بيانات غير موثوقة. فهو يمنع عمليات حقن التعليمات البرمجية المحتملة عن طريق تمكين المطور من إدراج الفئات التي يمكن إلغاء تسلسلها في القائمة البيضاء.
// يحول جميع الكائنات إلى كائن __PHP_Incomplete_Class$data = unserialize($foo, ["allowed_classes" => false]);// يحول جميع الكائنات إلى كائن __PHP_Incomplete_Class باستثناء كائنات MyClass وMyClass2$data = unserialize($foo, [" allow_classes" => ["MyClass"، "MyClass2"]])؛// السلوك الافتراضي (مثل حذف الوسيطة الثانية) الذي يقبل جميع الفئات$data = unserialize($foo, ["allowed_classes" => true]);
RFC: إلغاء التسلسل الذي تمت تصفيته ()
IntlChar
تسعى فئة IntlChar
الجديدة إلى الكشف عن وظائف ICU الإضافية. تحدد الفئة نفسها عددًا من الأساليب والثوابت الثابتة التي يمكن استخدامها لمعالجة أحرف Unicode.
printf('%x', IntlChar::CODEPOINT_MAX); // 10ffffecho IntlChar::charName('@'); // التجاري ATvar_dump(IntlChar::ispunct('!')); // منطقي (صحيح)
لاستخدام هذه الفئة، يجب تثبيت الملحق Intl
.
فواصل قبل الميلاد
لا يجب تسمية الفئات الموجودة في مساحة الاسم العمومية IntlChar
.
RFC: فئة IntlChar
التوقعات هي عبارة عن تحسينات متوافقة مع الإصدارات السابقة للدالة assert()
الأقدم. إنها تتيح التأكيدات ذات التكلفة الصفرية في كود الإنتاج، وتوفر القدرة على طرح استثناءات مخصصة عند حدوث خطأ.
النموذج الأولي لوظيفة assert()
هو كما يلي:
void assert (mixed $expression [, mixed $message]);
كما هو الحال مع واجهة برمجة التطبيقات القديمة، إذا كان $expression
عبارة عن سلسلة، فسيتم تقييمها. إذا كانت الوسيطة الأولى خاطئة، فسيفشل التأكيد. يمكن أن تكون الوسيطة الثانية إما سلسلة عادية (تؤدي إلى تشغيل AssertionError)، أو كائن استثناء مخصص يحتوي على رسالة خطأ.
ini_set('assert.exception', 1);class CustomError يمتد AssertionError {}assert(false, new CustomError('بعض رسائل الخطأ'));
مع هذه الميزة يأتي إعدادان لـ PHP.ini (مع قيمهما الافتراضية):
تأكيدات زيند = 1
تأكيد.الاستثناء = 0
لدى Zend.assertions ثلاث قيم:
1 = إنشاء وتنفيذ التعليمات البرمجية (وضع التطوير)
0 = قم بإنشاء التعليمات البرمجية والقفز إليها في وقت التشغيل
-1 = عدم إنشاء أي تعليمات برمجية (تكلفة صفرية، وضع الإنتاج)
Assurer.exception يعني أنه يتم طرح استثناء عند فشل التأكيد. يتم إيقاف تشغيل هذا افتراضيًا ليظل متوافقًا مع وظيفة assert()
القديمة.
RFC: التوقعات
use
المجموعة وهذا يعطي القدرة على تجميع إعلانات use
المتعددة وفقًا لمساحة الاسم الأصلية. يسعى هذا إلى إزالة الإسهاب في التعليمات البرمجية عند استيراد فئات أو وظائف أو ثوابت متعددة تقع ضمن نفس مساحة الاسم.
// ما قبل PHP 7 استخدم الكود somenamespaceClassA;use somenamespaceClassB;use somenamespaceClassC كـ C;use function somenamespacefn_a;use function somenamespacefn_b;use function somenamespace fn_c;استخدام const somenamespaceConstA;استخدام const somenamespaceConstB;استخدام const somenamespaceConstC;// PHP 7+ codeuse somenamespace{ClassA, ClassB, ClassC as C};استخدم الوظيفة somenamespace{fn_a, fn_b, fn_c};use const somenamespace{ConstA, ConstB, ConstC};
RFC: تصريحات استخدام المجموعة
تعتمد هذه الميزة على وظيفة المولد المقدمة في PHP 5.5. إنه يتيح استخدام عبارة return
داخل المولد لتمكين إرجاع التعبير النهائي (الإرجاع حسب المرجع غير مسموح به). يمكن جلب هذه القيمة باستخدام طريقة Generator::getReturn()
الجديدة، والتي لا يمكن استخدامها إلا بعد انتهاء المولد من قيم الإنتاج.
// أصبح بناء جملة IIFE ممكنًا الآن - راجع القسم الفرعي "بناء الجملة المتغير الموحد" في قسم التغييرات$gen = (function() { الإنتاجية 1; العائد 2; العودة 3; })();foreach ($gen as $val) { echo $val, PHP_EOL; }echo $gen->getReturn(), PHP_EOL;// الإخراج:// 1// 2// 3
إن القدرة على إرجاع قيمة نهائية بشكل صريح من المولد هي قدرة سهلة الاستخدام. وذلك لأنه يمكّن من إرجاع القيمة النهائية بواسطة المولد (ربما من أحد أشكال حساب coroutine) التي يمكن معالجتها على وجه التحديد بواسطة كود العميل الذي ينفذ المولد. وهذا أبسط بكثير من إجبار كود العميل على التحقق أولاً مما إذا كانت القيمة النهائية قد تم الحصول عليها، ثم إذا كان الأمر كذلك، التعامل مع هذه القيمة على وجه التحديد.
RFC: تعبيرات إرجاع المولد
يعتمد تفويض المولد على القدرة على إرجاع التعبيرات من المولدات. يقوم بذلك عن طريق استخدام بناء جملة جديد yield from <expr>
، حيث يمكن أن يكون أي كائن أو مصفوفة Traversable
. سيتم تقديم هذا حتى يصبح غير صالح، ثم سيستمر التنفيذ في مولد الاستدعاء. تتيح هذه الميزة تقسيم بيانات yield
إلى عمليات أصغر، وبالتالي تعزيز التعليمات البرمجية الأنظف التي تتمتع بقابلية أكبر لإعادة الاستخدام.
وظيفة الجنرال () { العائد 1؛ العائد 2؛ عائد الإرجاع من gen2(); }وظيفة جين2() { العائد 3؛ العودة 4؛ }$gen = gen();foreach ($gen كـ $val) { صدى $val، PHP_EOL؛ }echo $gen->getReturn();// الإخراج// 1// 2// 3// 4
RFC: وفد المولدات
intdiv()
تم تقديم الدالة intdiv()
للتعامل مع القسمة حيث سيتم إرجاع عدد صحيح.
var_dump(intdiv(10, 3)); // كثافة العمليات (3)
فواصل قبل الميلاد
لا يجب تسمية الوظائف الموجودة في مساحة الاسم العامة intdiv
.
RFC: إنتديف ()
session_start()
تمنح هذه الميزة القدرة على تمرير مجموعة من الخيارات إلى الدالة session_start()
. يُستخدم هذا لتعيين خيارات php.ini المستندة إلى الجلسة:
session_start(['cache_limiter' => 'خاص']); // يضبط خيار session.cache_limiter على خاص
تقدم هذه الميزة أيضًا إعداد php.ini جديد ( session.lazy_write
) والذي يتم ضبطه افتراضيًا على true ويعني أنه لا تتم إعادة كتابة بيانات الجلسة إلا إذا تغيرت.
RFC: تقديم خيارات session_start()
preg_replace_callback_array()
تتيح هذه الوظيفة الجديدة كتابة التعليمات البرمجية بشكل أكثر نظافة عند استخدام وظيفة preg_replace_callback()
. قبل PHP 7، كانت عمليات الاسترجاعات التي يلزم تنفيذها لكل تعبير عادي تتطلب أن تكون وظيفة رد الاتصال (المعلمة الثانية لـ preg_replace_callback()
) ملوثة بالكثير من التفرع (طريقة مخترقة في أحسن الأحوال).
الآن، يمكن تسجيل عمليات الاسترجاعات لكل تعبير عادي باستخدام مصفوفة ترابطية، حيث يكون المفتاح تعبيرًا عاديًا والقيمة عبارة عن رد اتصال.
توقيع الوظيفة:
string preg_replace_callback_array(array $regexesAndCallbacks, string $input);
$tokenStream = []; // [tokenName, lexeme] أزواج$input = <<<'end'$a = 3; // نهاية التهيئة المتغيرة؛// ما قبل PHP 7 codepreg_replace_callback( [ '~$[a-z_][azd_]*~i', '~=~', '~[d]+~', '~;~', '~//.*~' ]، الوظيفة ($match) استخدم (&$tokenStream) { if (strpos($match[0], '$') === 0) { $tokenStream[] = ['T_VARIABLE', $match[0]] ; } elseif (strpos($match[0], '=') === 0) { $tokenStream[] = ['T_ASSIGN', $match[0]]; } elseif (ctype_digit($match[0])) { $tokenStream[] = ['T_NUM', $match[0]]; } elseif (strpos($match[0], ';') === 0) { $tokenStream[] = ['T_TERMINATE_STMT', $match[0]]; } elseif (strpos($match[0], '//') === 0) { $tokenStream[] = ['T_COMMENT', $match[0]]; } }, $input);// PHP 7+ codepreg_replace_callback_array( [ '~$[a-z_][azd_]*~i' => الدالة ($match) use (&$tokenStream) { $tokenStream[] = ['T_VARIABLE', $match[0]]; }, '~=~' => الدالة ($match) use (&$tokenStream) { $tokenStream[] = ['T_ASSIGN', $match[0]]; }, '~[d]+~' => الدالة ($match) use (&$tokenStream) { $tokenStream[] = ['T_NUM', $match[0]]; }, '~;~' => الدالة ($match) use (&$tokenStream) { $tokenStream[] = ['T_TERMINATE_STMT', $match[0]]; }, '~//.*~' => الدالة ($match) use (&$tokenStream) { $tokenStream[] = ['T_COMMENT', $match[0]]; } ]، $الإدخال)؛
فواصل قبل الميلاد
يجب ألا تسمى الوظائف الموجودة في مساحة الاسم العامة preg_replace_callback_array
.
RFC: إضافة وظيفة preg_replace_callback_array
تقدم هذه الميزة وظيفتين جديدتين لإنشاء أعداد صحيحة وسلاسل آمنة تشفيريًا. إنها تعرض واجهات برمجة التطبيقات البسيطة وهي مستقلة عن النظام الأساسي.
التوقيعات الوظيفية:
string random_bytes(int length); int random_int(int min, int max);
ستُصدر كلتا الدالتين استثناء Error
إذا تعذر العثور على مصدر عشوائي كافٍ.
فواصل قبل الميلاد
يجب ألا تسمى الوظائف الموجودة في مساحة الاسم العامة random_int
أو random_bytes
.
RFC: CSPRNG سهل الاستخدام للأرض
define()
تم تقديم القدرة على تعريف ثوابت المصفوفة في PHP 5.6 باستخدام الكلمة الأساسية const
. تم الآن تطبيق هذه القدرة على وظيفة define()
أيضًا:
تعريف('ALLOWED_IMAGE_EXTENSIONS', ['jpg', 'jpeg', 'gif', 'png']);
RFC: لا يوجد RFC متاح
تم تقديم فئتين جديدتين من الانعكاسات في PHP 7. الأول هو ReflectionGenerator
، والذي يُستخدم للاستبطان في المولدات:
مولد انعكاس الطبقة { public __construct(Generator $gen) المصفوفة العامة getTrace($options = DEBUG_BACKTRACE_PROVIDE_OBJECT) int public getExecutingLine(باطل) سلسلة getExecutingFile العامة (باطلة) public ReflectionFunctionAbstract getFunction(باطل) الكائن العام getThis (باطل) getExecutingGenerator للمولد العام (باطل) }
والثاني هو ReflectionType
لدعم ميزات تعريف النوع العددي ونوع الإرجاع بشكل أفضل:
نوع انعكاس الطبقة { المنطق العام يسمحNull (باطل) المنطق العام isBuiltin (باطل) السلسلة العامة __toString (باطل) }
أيضًا، تم إدخال طريقتين جديدتين في ReflectionParameter
:
معلمة انعكاس الطبقة { // ... public bool hasType(void) public ReflectionType getType(void) }
بالإضافة إلى طريقتين جديدتين في ReflectionFunctionAbstract
:
فئة ReflectionFunctionAbstract { // ... public bool hasReturnType(void) public ReflectionType getReturnType(void) }
فواصل قبل الميلاد
لا يجب تسمية الفئات الموجودة في مساحة الاسم العامة باسم ReflectionGenerator
أو ReflectionType
.
RFC: لا يوجد RFC متاح
يُسمح الآن بالكلمات المحجوزة عالميًا مثل أسماء الممتلكات والثوابت والطرق داخل الفئات والواجهات والسمات. يؤدي هذا إلى تقليل سطح فواصل BC عند تقديم كلمات رئيسية جديدة وتجنب قيود التسمية على واجهات برمجة التطبيقات.
يعد هذا مفيدًا بشكل خاص عند إنشاء خطوط DSL داخلية ذات واجهات سلسة:
// "جديد" و"خاص" و"من أجل" لم تكن قابلة للاستخدام سابقًاProject::new('اسم المشروع')->private()->for('الغرض هنا')->with('اسم المستخدم هنا');
القيد الوحيد هو أنه لا يزال من غير الممكن استخدام الكلمة الأساسية class
كاسم ثابت، وإلا فإنها قد تتعارض مع بناء جملة تحليل اسم الفئة ( ClassName::class
).
RFC: Lexer حساس للسياق
يجلب هذا التغيير تعامدًا أكبر بكثير لعوامل التشغيل المتغيرة في PHP. فهو يتيح عددًا من المجموعات الجديدة من المشغلين التي كانت غير مسموح بها سابقًا، وبالتالي يقدم طرقًا جديدة لتحقيق العمليات القديمة في كود مختصر.
// التداخل ::$foo::$bar::$baz // الوصول إلى الخاصية $baz الخاصة بـ $foo::$bar property// التداخل ()foo()() // استدعاء عودة foo() // عوامل التشغيل في التعبيرات المضمنة في ()(function () {})() // بناء جملة IIFE من JS
جاءت القدرة على الجمع بين العوامل المتغيرة بشكل تعسفي من عكس دلالات التقييم للمتغير غير المباشر، والخصائص، ومراجع الطريقة. يعد السلوك الجديد أكثر سهولة ويتبع دائمًا ترتيب التقييم من اليسار إلى اليمين:
// المعنى القديم // المعنى الجديد$$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz' ]$foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz']$foo->$bar['baz']( ) $foo->{$bar['baz']}() ($foo->$bar)['baz']() Foo::$bar['baz']() Foo::{$bar['baz']}() (Foo::$bar)['baz']()
فواصل قبل الميلاد
يجب إعادة كتابة التعليمات البرمجية التي تعتمد على أمر التقييم القديم لاستخدام أمر التقييم هذا بشكل صريح مع الأقواس المتعرجة (انظر العمود الأوسط مما سبق). سيؤدي هذا إلى جعل الكود متوافقًا للأمام مع PHP 7.x والعكس متوافقًا مع PHP 5.x
RFC: بناء الجملة المتغير الموحد
تعمل الاستثناءات الموجودة في المحرك على تحويل العديد من الأخطاء الفادحة والقابلة للاسترداد إلى استثناءات. يتيح ذلك إمكانية التدهور السلس للتطبيقات من خلال إجراءات معالجة الأخطاء المخصصة. ويعني ذلك أيضًا أنه سيتم الآن تنفيذ الميزات التي تعتمد على التنظيف مثل الجملة finally
ومدمرات الكائنات. علاوة على ذلك، باستخدام استثناءات أخطاء التطبيق، سيتم إنتاج تتبعات المكدس للحصول على معلومات تصحيح إضافية.
مجموع الدالة (تعويم ...$numbers) : float{ return array_sum($numbers); }حاول { $total = sum(3, 4, null); } قبض على (TypeError $typeErr) { // التعامل مع خطأ النوع هنا}
التسلسل الهرمي للاستثناء الجديد هو كما يلي:
interface Throwable |- Exception implements Throwable |- ... |- Error implements Throwable |- TypeError extends Error |- ParseError extends Error |- AssertionError extends Error |- ArithmeticError extends Error |- DivisionByZeroError extends ArithmeticError
راجع القسم الفرعي "الواجهة القابلة للرمي" في قسم "التغييرات" للحصول على مزيد من المعلومات حول هذا التسلسل الهرمي الجديد للاستثناءات.
فواصل قبل الميلاد
معالجات الأخطاء المخصصة المستخدمة لمعالجة (وتجاهل عادةً) الأخطاء الفادحة القابلة للاسترداد لن تعمل بعد الآن حيث سيتم الآن طرح الاستثناءات
ستصبح الآن أخطاء التحليل التي تحدث في كود eval()
ed استثناءات، مما يتطلب تغليفها في كتلة try...catch
RFC: الاستثناءات في المحرك
يؤثر هذا التغيير على التسلسل الهرمي للاستثناءات في PHP بسبب إدخال الاستثناءات في المحرك. بدلاً من وضع أخطاء فادحة وقابلة للاسترداد ضمن التسلسل الهرمي لفئة Exception
الموجود مسبقًا، تقرر تنفيذ تسلسل هرمي جديد للاستثناءات لمنع كود PHP 5.x من التقاط هذه الاستثناءات الجديدة باستخدام أداة التقاط الكل ( catch (Exception $e)
) الشروط.
التسلسل الهرمي للاستثناء الجديد هو كما يلي:
interface Throwable |- Exception implements Throwable |- ... |- Error implements Throwable |- TypeError extends Error |- ParseError extends Error |- AssertionError extends Error |- ArithmeticError extends Error |- DivisionByZeroError extends ArithmeticError
يتم تنفيذ واجهة Throwable
بواسطة كل من التسلسلات الهرمية للفئة الأساسية Exception
Error
وتحدد العقد التالي:
interface Throwable { final public string getMessage ( void ) final public mixed getCode ( void ) final public string getFile ( void ) final public int getLine ( void ) final public array getTrace ( void ) final public string getTraceAsString ( void ) public string __toString ( void ) }
لا يمكن تنفيذ Throwable
بواسطة فئات محددة من قبل المستخدم - بدلاً من ذلك، يجب أن تقوم فئة الاستثناءات المخصصة بتوسيع إحدى فئات الاستثناءات الموجودة مسبقًا في PHP.
RFC: واجهة قابلة للرمي
لقد تغيرت دلالات بعض السلوكيات القائمة على الأعداد الصحيحة في محاولة لجعلها أكثر سهولة واستقلالية عن النظام الأساسي. وفيما يلي قائمة بهذه التغييرات:
سيؤدي إرسال NAN
و INF
إلى عدد صحيح دائمًا إلى 0
أصبح الآن تغيير اتجاه البت بعدد سالب من البتات غير مسموح به (يؤدي إلى إرجاع منطقي (خطأ) وإصدار تحذير E_WARNING)
إن إزاحة اتجاه البت إلى اليسار بعدد من البتات خارج عرض البت لعدد صحيح سيؤدي دائمًا إلى 0
ستؤدي إزاحة اتجاه البت إلى اليمين بعدد من البتات خارج عرض البت لعدد صحيح دائمًا إلى 0 أو -1 (يعتمد على الإشارة)
فواصل قبل الميلاد
إن أي اعتماد على الدلالات القديمة لما ورد أعلاه لن ينجح بعد الآن
RFC: دلالات عدد صحيح
تم اعتبار ترخيص امتداد JSON القديم غير مجاني، مما تسبب في مشكلات للعديد من التوزيعات المستندة إلى Linux. تم استبدال الامتداد منذ ذلك الحين بـ JSOND ويأتي مع بعض مكاسب الأداء وانقطاعات التوافق مع الإصدارات السابقة.
فواصل قبل الميلاد
يجب ألا ينتهي الرقم بفاصلة عشرية (أي 34.
يجب تغييره إلى 34.0
أو 34
فقط)
يجب ألا يتبع الأس e
مباشرة العلامة العشرية (أي يجب تغيير 3.e3
إلى 3.0e3
أو 3e3
فقط)
RFC: استبدل ملحق json الحالي بـ jsond
يمكن أن يحدث الإكراه بين العوامات على الأعداد الصحيحة عندما يتم تمرير تعويم إلى دالة داخلية تتوقع عددًا صحيحًا. إذا كان العدد العائم كبيرًا جدًا بحيث لا يمكن تمثيله كعدد صحيح، فسيتم اقتطاع القيمة بصمت (مما قد يؤدي إلى فقدان الحجم والعلامة). يمكن أن يؤدي هذا إلى ظهور أخطاء يصعب العثور عليها. ولذلك يسعى هذا التغيير إلى إعلام المطور عند حدوث تحويل ضمني من عدد عائم إلى عدد صحيح وفشل عن طريق إرجاع null
وإصدار E_WARNING.
فواصل قبل الميلاد
التعليمات البرمجية التي كانت تعمل بصمت ستصدر الآن تحذيرًا E_WARNING وقد تفشل إذا تم تمرير نتيجة استدعاء الوظيفة مباشرة إلى وظيفة أخرى (حيث سيتم الآن تمرير null
).
RFC: فشل ZPP عند تجاوز السعة
foreach()
تحتوي حلقة foreach()
الخاصة بـ PHP على عدد من حالات الحافة الغريبة. كانت جميعها مدفوعة بالتنفيذ وتسببت في الكثير من السلوكيات غير المحددة وغير المتسقة عند التكرار بين النسخ والمراجع للمصفوفة، عند استخدام معالجات التكرار مثل current()
و reset()
، عند تعديل المصفوفة التي يتم تكرارها حاليًا، وما إلى ذلك.
يزيل هذا التغيير السلوك غير المحدد لحالات الحافة هذه ويجعل الدلالات أكثر قابلية للتنبؤ بها وبديهية.
foreach()
من حيث القيمة على المصفوفات
$array = [1,2,3];$array2 = &$array;foreach($array كـ $val) { unset($array[1]); // تعديل المصفوفة الجاري تكرارها عبر echo "{$val} - ", current($array), PHP_EOL; }// ما قبل PHP 7 result1 - 33 - // PHP 7+ result1 - 12 - 13 - 1
عند استخدام دلالات القيمة الثانوية، لا يتم تعديل المصفوفة التي يتم تكرارها في مكانها. أصبح لدى current()
الآن أيضًا سلوك محدد، حيث سيبدأ دائمًا في بداية المصفوفة.
foreach()
بالرجوع إلى المصفوفات والكائنات وحسب القيمة على الكائنات
$array = [1,2,3];foreach($array as &$val) { echo "{$val} - ", current($array), PHP_EOL; }// ما قبل PHP 7 result1 - 22 - 33 - // PHP 7+ result1 - 12 - 13 - 1
لم تعد الدالة current()
متأثرة بتكرار foreach()
على المصفوفة. أيضًا، تعمل دالات foreach()
المتداخلة التي تستخدم دلالات المرجع بشكل مستقل عن بعضها البعض الآن:
$array = [1,2,3];foreach($array as &$val) { echo $val, PHP_EOL; foreach ($صفيف كـ &$val2) { unset($array[1]); صدى $val، PHP_EOL؛ } }// ما قبل PHP 7 result111// PHP 7+ result111333
فواصل قبل الميلاد
إن أي اعتماد على الدلالات القديمة (الغريبة وغير الموثقة) لن ينجح بعد الآن.
RFC: إصلاح سلوك "foreach".
list()
تم توثيق وظيفة list()
على أنها لا تدعم السلاسل، ولكن في حالات قليلة كان من الممكن استخدام السلاسل:
// إلغاء مرجعية المصفوفة$str[0] = 'ab';list($a, $b) = $str[0];echo $a; // صدى $b; // b// إلغاء مرجعية الكائن$obj = new StdClass();$obj->prop = 'ab';list($a, $b) = $obj->prop;echo $a; // صدى $b; // ب // وظيفة العودة وظيفة func () { إرجاع "أب"؛ }list($a, $b) = func();var_dump($a, $b);echo $a; // صدى $b; // ب
لقد تم تغيير هذا الآن مما يجعل استخدام السلسلة مع list()
محظورًا في جميع الحالات.
أيضًا، أصبحت list()
الآن خطأً فادحًا، وتم تغيير ترتيب تعيين المتغيرات إلى من اليسار إلى اليمين:
$a = [1, 2];list($a, $b) = $a;// OLD: $a = 1, $b = 2// جديد: $a = 1, $b = null + "غير محدد الفهرس 1"$b = [1, 2];list($a, $b) = $b;// OLD: $a = null + "غير محدد فهرس 0"، $b = 2// NEW: $a = 1, $ب = 2
فواصل قبل الميلاد
لم يعد من الممكن جعل list()
مساوية لأي قيمة سلسلة غير مباشرة. ستصبح null
الآن هي قيمة المتغير $a
و $b
في الأمثلة المذكورة أعلاه
سيؤدي استدعاء list()
بدون أي متغيرات إلى حدوث خطأ فادح
إن الاعتماد على أمر التعيين القديم من اليمين إلى اليسار لن ينجح بعد الآن
RFC: إصلاح عدم تناسق سلوك القائمة ().
RFC: شجرة بناء الجملة المجردة
قبل PHP 7، عندما كان المقسوم عليه 0 لمشغلي القسمة (/) أو المعامل (%)، كان سيتم إصدار E_WARNING وإرجاع false
. كان هذا غير منطقي بالنسبة لعملية حسابية لإرجاع قيمة منطقية في بعض الحالات، ولذلك تم تصحيح السلوك في PHP 7.
يؤدي السلوك الجديد إلى قيام عامل القسمة بإرجاع قيمة عائمة إما +INF أو -INF أو NAN. تمت إزالة عامل التشغيل E_WARNING وسيقوم (بجانب وظيفة intdiv()
الجديدة) بطرح استثناء DivisionByZeroError
. بالإضافة إلى ذلك، قد تؤدي الدالة intdiv()
أيضًا إلى ظهور الخطأ ArithmeticError
عند توفير وسائط عددية صالحة تؤدي إلى نتيجة غير صحيحة (بسبب تجاوز عدد صحيح).
var_dump(3/0); // float(INF) + E_WARNINGvar_dump(0/0); // float(NAN) + E_WARNINGvar_dump(0%0); // DivisionByZeroErrorintdiv(PHP_INT_MIN, -1); // خطأ حسابي
فواصل قبل الميلاد
لن يقوم عامل القسمة بإرجاع false
بعد الآن (والذي كان من الممكن إجباره بصمت على 0 في عملية حسابية)
سيقوم عامل المعامل الآن بطرح استثناء بمقسوم عليه 0 بدلاً من إرجاع false
RFC: لا يوجد RFC متاح
عند تنفيذ معالجات الجلسة المخصصة، فإن الوظائف الأصلية من SessionHandlerInterface
التي تتوقع قيمة إرجاع true
أو false
لم تتصرف كما هو متوقع. نظرًا لحدوث خطأ في التنفيذ السابق، تم اعتبار القيمة المرجعة -1
فقط خطأ - مما يعني أنه حتى لو تم استخدام القيمة المنطقية false
للإشارة إلى الفشل، فسيتم اعتبارها نجاحًا:
<?phpclass FileSessionHandler يقوم بتطبيق SessionHandlerInterface { خاص $savePath؛ وظيفة مفتوحة ($savePath، $sessionName) {إرجاع كاذب؛ // تفشل دائمًا } وظيفة إغلاق () {return true؛} وظيفة قراءة ($id) {} وظيفة الكتابة ($id، $data) {} وظيفة تدمير ($id) {} وظيفة gc($maxlifetime){} }session_set_save_handler(new FileSessionHandler());session_start(); // لا يسبب خطأ في كود ما قبل PHP 7
الآن، سوف يفشل ما ورد أعلاه مع وجود خطأ فادح. إن الحصول على قيمة إرجاع -1
سيستمر أيضًا في الفشل، بينما سيظل 0
true
يعني النجاح. أي قيمة أخرى يتم إرجاعها ستتسبب الآن في حدوث فشل وتصدر تحذيرًا E_WARNING.
فواصل قبل الميلاد
إذا تم إرجاع false
منطقي، فسوف يفشل بالفعل الآن
إذا تم إرجاع أي شيء آخر غير القيمة المنطقية أو 0
أو -1
، فسوف يفشل ويتسبب في إصدار تحذير
RFC: إصلاح التعامل مع قيم إرجاع معالج الجلسة المخصصة
تم الحفاظ على مُنشئات PHP 4 في PHP 5 إلى جانب __construct()
الجديد. الآن، تم إهمال مُنشئات PHP ذات النمط الرابع لصالح وجود طريقة واحدة فقط ( __construct()
) ليتم استدعاؤها عند إنشاء الكائن. وذلك لأن الشروط المتعلقة باستدعاء مُنشئ النمط PHP 4 تسببت في زيادة العبء المعرفي للمطورين، الأمر الذي قد يكون أيضًا مربكًا لعديمي الخبرة.
على سبيل المثال ، إذا تم تعريف الفئة داخل مساحة الاسم أو في حالة وجود طريقة __construct()
، فقد تم التعرف على مُنشئ من طراز PHP 4 كطريقة عادي. إذا تم تعريفها أعلاه طريقة __construct()
، فسيتم تنبعث إشعار E_strict ، ولكن لا يزال يتم التعرف عليه كطريقة عادي.
الآن في PHP 7 ، إذا لم يكن الفصل في مساحة الاسم ولم يكن هناك طريقة __construct()
، فسيتم استخدام مُنشئ من طراز PHP 4 كمُنشئ ولكن سيتم تنشيط E_Deprecated. في PHP 8 ، سيتم دائمًا التعرف على مُنشئ PHP 4 على شكل طريقة واضحة وسيختفي الإشعار E_Deprecated.
BC Breaks
قد تتأثر معالجات الأخطاء المخصصة برفع تحذيرات E_Deprecated. لإصلاح هذا ، ما عليك سوى تحديث اسم مُنشئ الفصل إلى __construct
.
RFC: قم بإزالة منشئي PHP 4
عندما تم استدعاء أي وظائف قائمة على التاريخ أو الوقت ولم يتم تحديد المنطقة الزمنية الافتراضية ، تم تنبعث تحذير. كان الإصلاح هو تعيين إعداد date.timezone
INI ببساطة إلى منطقة زمنية صالحة ، ولكن هذا أجبر المستخدمين على الحصول على ملف php.ini وتكوينه مسبقًا. نظرًا لأن هذا كان الإعداد الوحيد الذي كان لديه تحذير مرتبط به ، وقد تم التخلف عن سداده على UTC على أي حال ، فقد تمت إزالة التحذير الآن.
RFC: قم بإزالة Date.TimeZone تحذير
تم الآن إزالة علامات PHP البديلة <%
(و <%=
) ، %>
، <script language="php">
، و </script>
.
BC Breaks
يجب تحديث التعليمات البرمجية التي تعتمد على هذه العلامات البديلة إما إلى علامات الفتح والإغلاق القصيرة أو القصيرة. يمكن أن يتم ذلك إما يدويًا أو آليًا باستخدام هذا البرنامج النصي للنقل.
RFC: إزالة علامات PHP البديلة
في السابق ، كان من الممكن تحديد عبارات كتلة default
متعددة ضمن عبارة التبديل (حيث تم تنفيذ الكتلة default
الأخيرة فقط). تمت الآن إزالة هذه القدرة (عديمة الفائدة) وتسبب خطأً قاتلاً.
BC Breaks
أي رمز مكتوب (أو على الأرجح يتم إنشاؤه) الذي أنشأ عبارات التبديل مع كتل default
متعددة ستصبح الآن خطأ فادح.
RFC: قم بتعريف الحالات الافتراضية المتعددة في مفتاح خطأ في بناء الجملة
في السابق ، كان من الممكن تحديد المعلمات بأسماء مكررة ضمن تعريف الوظيفة. تمت إزالة هذه القدرة الآن وتسبب خطأ فادح.
وظيفة FOO (إصدار $ ، إصدار $) {return $ version ؛ } echo foo (5 ، 7) ؛ // pre php 7 result7 // php 7+ resultfatal error: repinition of parameter $ $ in/redefinition- of parameters.php
BC Breaks
ستصبح معلمات الوظيفة ذات الاسم المكرر الآن خطأً قاتلاً.
تمت إزالة SAPIs التالية من النواة (تم نقل معظمها إلى PECL):
SAPI/Aolserver
SAPI/Apache
SAPI/APACHE_HOOKS
SAPI/APACHE2FILTER
SAPI/CAUDIUM
SAPI/الاستمرارية
SAPI/ISAPI
SAPI/milter
SAPI/NSAPI
SAPI/PHTTPD
SAPI/PI3WEB
SAPI/Roxen
SAPI/THTTPD
SAPI/TUX
SAPI/WebJames
تحويلة/MSSQL
تحويلة/mysql
تحويلة/sybase_ct
تحويلة/ereg
RFC: إزالة الميت أو لم يتم بعد PHP7 SAPIs و extensions
لم يعد التعرف على رقم سداسي عشري من العددي.
var_dump (is_numeric ('0x123'))) ؛ var_dump ('0x123' == '291') ؛ echo '0x123' + '0x123' ؛ resultbool (false) bool (false) 0
السبب في هذا التغيير هو تعزيز الاتساق الأفضل بين التعامل مع أرقام سداسية عرافة عبر اللغة. على سبيل المثال ، لا تتعرف القوالب الصريحة على أرقام سداسية سدارية:
var_dump ((int) '0x123') ؛ // int (0)
بدلاً من ذلك ، يجب التحقق من صحة أرقام سداسي سداسية الوترات باستخدام وظيفة filter_var()
:
var_dump (filter_var ('0x123' ، filter_validate_int ، filter_flag_allow_hex)) ؛ // int (291)
BC Breaks
يؤثر هذا التغيير على وظيفة is_numeric()
ومختلف المشغلين ، بما في ذلك ==
، +
، -
، *
، /
، %
، **
، ++
، و --
RFC: قم بإزالة دعم Hex في الأوتار الرقمية
تمت إزالة جميع الوظائف التي تم إهمالها ، وأبرزها:
امتداد MySQL الأصلي (Ext/MySQL)
امتداد EREG (EXT/EREG)
تعيين new
بالرجوع
نداءات مخططة للطرق غير الستنية من $this
السياق (مثل Foo::bar()
من خارج الفصل ، حيث لا يعد bar()
طريقة ثابتة)
قبل الميلاد
لن يعمل أي رمز تم تشغيله مع تحذيرات إهمال في PHP 5 (تم تحذيرك!)
RFC: قم بإزالة الوظائف المنخفضة في PHP 7
كانت إشعارات E_strict دائمًا بعضًا من منطقة رمادية في معناها. يزيل هذا التغييرات فئة الخطأ هذه تمامًا وإما: يزيل إشعار E_strict ، ويغيره إلى E_Deprecated إذا تمت إزالة الوظيفة في المستقبل ، أو تغييرها إلى E_Notice ، أو تروج لها إلى e_warning.
BC Breaks
نظرًا لأن E_strict في أدنى فئة خطأ في الشدة ، فإن أي عروض ترويجية إلى E_Warning قد تكسر معالجات الأخطاء المخصصة
RFC: إعادة تصنيف إشعارات E_Strict
password_hash()
مع إدخال كلمة المرور الجديدة API في PHP 5.5 ، بدأ الكثيرون في تنفيذها وإنشاء أملاحهم الخاصة. لسوء الحظ ، تم إنشاء العديد من هذه الأملاح من وظائف غير آمنة تشفيرًا مثل MT_Rand () ، مما يجعل الملح أضعف بكثير مما كان يمكن أن يتم إنشاؤه افتراضيًا. (نعم ، يتم استخدام الملح دائمًا عند تجزئة كلمات المرور باستخدام واجهة برمجة التطبيقات الجديدة هذه!) تم إهمال خيار إنشاء الأملاح لمنع المطورين من إنشاء أملاح غير آمنة.
RFC: لا RFC متاح
سوف تسبب الحرفيات الأوكتال غير الصالحة الآن خطأ في التحليل بدلاً من اقتطاعها وتجاهلها بصمت.
Echo 0678 ؛ // خطأ تحليل: حرفي رقمي غير صالح في ...
BC Breaks
أي حرفي أوكتال غير صالح في الكود سوف يتسبب الآن في أخطاء التحليل
RFC: لا RFC متاح
substr()
ستعيد substr()
الآن سلسلة فارغة بدلاً من false
عندما يكون موضع بدء الاقتطاع مساوياً لطول السلسلة:
var_dump (sentstr ('a' ، 1)) ؛ // pre php 7 resultbool (false) // php 7+ resultstring (0) ""
قد لا يزال substr()
يعود false
في حالات أخرى.
BC Breaks
قد تكون الكود الذي تم فحصه بصرامة للحصول على قيمة إرجاع bool(false)
غير صالح بشكل دلالي
RFC: لا RFC متاح
كان PHP 6 هو إصدار PHP الرئيسي الذي لم يسبق له مثيل. كان من المفترض أن تتميز بدعم كامل لـ Unicode في قلبها ، لكن هذا الجهد كان طموحًا للغاية مع وجود الكثير من المضاعفات. الأسباب السائدة التي تجعل الإصدار 6 تم تخطيه لهذا الإصدار الرئيسي الجديد هي كما يلي:
لمنع الارتباك . تمت كتابة العديد من الموارد حول PHP 6 وعرف الكثير من المجتمع ما ظهر فيه. PHP 7 هو وحش مختلف تمامًا مع التركيزات المختلفة تمامًا (خاصة على الأداء) ومجموعات الميزات المختلفة تمامًا. وبالتالي ، تم تخطي نسخة لمنع أي ارتباك أو مفاهيم خاطئة تحيط بماهية PHP 7.
للسماح للكلاب النائمة بالكذب . كان ينظر إلى PHP 6 على أنه فشل ولا يزال هناك كمية كبيرة من رمز PHP 6 في مستودع PHP. لذلك كان من الأفضل تحريك الإصدار 6 وبدء من جديد في الإصدار الرئيسي التالي ، الإصدار
RFC: اسم الإصدار التالي من PHP