
بناء الجملة
- تنعيم متطلبات بناء الجملة Heredoc و Nowdoc
- دعم الفواصل اللاحقة في استدعاءات الوظائف والأسلوب
- الروابط في
list()
ميزات موقوفة (مهجورة)
image2wbmp()
إيقاف وظيفة image2wbmp()
FILTER_FLAG_HOST_REQUIRED
FILTER_FLAG_SCHEME_REQUIRED
و FILTER_FLAG_HOST_REQUIRED
عند استخدام FILTER_VALIDATE_URL
- تسجيل الثوابت المستقلة المهملة
الميزات الجديدة
- استثناء اختياري اختياري للأخطاء في
json_decode
json_encode
و json_decode
- إضافة
is_countable()
- إضافة الدالتين
array_key_first()
و array_key_last()
التغييرات
- الانتقال من PCRE إلى PCRE2
تنعيم متطلبات بناء الجملة Heredoc و Nowdoc
طالب Heredoc و Nowdoc بوضع معرف الإغلاق أولاً في سطر جديد.
مثال:
$foo = <<<IDENTIFIER the crazy dog jumps over the lazy fox "foo" bar; IDENTIFIER
هنا ، يجب أن يكون IDENTIFIER
الإغلاق الحرف الأول في السطر الجديد حتى يعمل هذا. بالإضافة إلى ذلك ، يجب ألا يكون هناك أي أحرف أخرى بعد معرف الإغلاق (باستثناء ;
وهو اختياري).
يقترح RFC لـ PHP 7.3 إزالة هذه المتطلبات لتحسين إمكانية قراءة التعليمات البرمجية. بادئ heredoc/nowdoc
، لإضافة heredoc/nowdoc
بادئة عند استخدام heredoc/nowdoc
.
قائمة كاملة بالتغييرات في بناء الجملة heredoc/nowdoc
:
- لا يجب أن يكون معرف الإغلاق هو الحرف الأول في السلسلة.
- معرف مسافة الإغلاق مع مسافات أو علامات جدولة.
- يجب عدم خلط المسافة البادئة (المسافات أو علامات التبويب). إذا قمت بذلك ، فسوف تحصل على
Parse error: Invalid indentation - tabs and spaces cannot be mixed in .. on line ..
- ستتم إزالة العدد الدقيق للمسافات / علامات التبويب المستخدمة قبل معرف الإغلاق من كل سطر من تعبير
heredoc/nowdoc
. - إذا كان عدد الأحرف البادئة المستخدمة قبل معرف الإغلاق أكبر من أي من سطور التعبير ، فستحصل على
Parse error: Invalid body indentation level (expecting an indentation level of at least ..) in .. on line ..
- ستعمل عدة تعبيرات بعد معرف الإغلاق بدون أخطاء
فيما يلي مقتطف يستفيد من الميزات الجديدة دون كسر القواعد الجديدة:
$foo = ['foo', 'bar', <<<EOT baz - hello world! -- ahoy EOT, 'qux', 'quux' ]; var_dump($foo);
سيكون الناتج:
array(5) { [0]=> string(3) "foo" [1]=> string(3) "bar" [2]=> string(29) "baz - hello world! -- ahoy" [3]=> string(3) "qux" [4]=> string(4) "quux" } `
لاحظ أن المسافة البادئة المستخدمة في الإعلان باستخدام heredoc
لا يتم عرضها في إخراج var_dump()
، var_dump()
في سرد عناصر المصفوفة بعد معرف EOT
.
RFC ، مناقشة حول Externals.io ، التنفيذ
تأثير التوافق مع الإصدارات السابقة
حتى تستخدم مجموعة من heredox/nowdoc
الأحرف المتطابقة heredox/nowdoc
كبداية سطر ، فأنت على حصان.
$foo = <<<HELLO HELLO_WORLD <-- HELLOWORLD <-- HELLO WORLD <-- HELLO;
إذا كان لديك heredoc/nowdoc
مشابهة لتلك الموضحة أعلاه ، heredoc/nowdoc
أنه مع PHP 7.3 ، سيقبل PHP أول heredoc/nowdoc
خطأ في السطر التالي. في الإصدارات السابقة ، HELLO WORLD
يكن يُنظر إلى HELLO WORLD
كمعرف إغلاق للميراث. شكرًا / u / ImSuperObjective2 مع reddit للإشارة إلى ذلك
دعم الفواصل اللاحقة في استدعاءات الوظائف والأسلوب
هذا تغيير بسيط يسمح باستخدام الفواصل اللاحقة في استدعاءات الوظائف وأساليبها. هذا لا يؤثر على الإعلان.
على سبيل المثال ، سيصبح بناء الجملة التالي ممكنًا:
في إصدارات ما قبل PHP-7.3 ، يطرح المقتطف أعلاه PHP Parse error: syntax error, unexpected ')' in .. on line ..
لا يمكنك استخدام أكثر من فاصلة واحدة في النهاية أو استخدام الفواصل لتخطي الوسائط. هذا بشكل رئيسي تغيير لدالة ذات معلمات متغيرة. أيضًا مع التعديلات الجديدة ، سيبدو بناء المصفوفة أكثر اتساقًا.
لاحظ أنه لا يمكنك استخدام هذه الميزة في إعلانات الوظيفة / الطريقة ؛ هذا خطأ:
function foo($bar, $baz, ) {
RFC ، مناقشة حول Externals.io ، التنفيذ
تأثير التوافق مع الإصدارات السابقة
لا شيء. سيستمر الرمز الحالي في العمل. إذا كانت لديك استدعاءات وظيفية تقبل معلمات متغيرة ، فأضف فواصل زائدة إلى هذه الأماكن للراحة. ولكن من الواضح أن استخدامها في كل مكان أكثر من اللازم.
الروابط في list()
تعد الدالة list()
مفيدة لتعيين القيم بسرعة للمتغيرات من المصفوفة. قبل PHP 7.3 ، لم يكن من الممكن تحديد متغير حسب المرجع. قبل PHP 7.3 ، أدى المقتطف التالي إلى خطأ فادح:
$arr = ['apple', 'orange']; list($a, &$b) = $arr; $b = 'banana'; echo $arr[1];
من المستحيل الرجوع إلى المتغيرات non-referencable
: list($a, &$b) = [12, 14];
سيعطي Fatal error: Cannot assign reference to non referencable value in .. on line ..
RFC ، مناقشة حول Externals.io ، التنفيذ
تأثير التوافق مع الإصدارات السابقة
لا. بدلاً من استخدام list()
لملء العديد من المتغيرات ، أقترح عليك استخدام كائنات القيمة لجعل الأشياء أبسط. ستستمر تمريرها حسب المرجع ، ولكنها ستجعل الشفرة الخاصة بك أكثر نظافة.
image2wbmp()
إيقاف وظيفة image2wbmp()
image2wbmp()
وظيفة image2wbmp()
من امتداد GD لإخراج الصور بتنسيق WBMP (Wireless Bitmap). في PHP 7.3 ، تم إهماله لصالح الدالة imagewbmp()
.
إذا كنت تستخدم image2wbmp()
، imagewbmp
اسم الوظيفة بـ imagewbmp
وسيكون كل شيء على ما يرام! أكثر من 5,500 image2wbmp()
على github مقابل أكثر من 39,300 imagewbmp()
. يبدو أن فريق تطوير PHP يسحب ميزات أقل استخدامًا لتقليل التأثير.
RFC ، مناقشة حول Externals.io ، التنفيذ
تأثير التوافق مع الإصدارات السابقة
إذا كنت تستخدم وظيفة image2wbmp()
، imagewbmp
المكالمة بـ imagewbmp
. الاستفادة من الأتمتة التي يمكن أن تغير هذا لك.
FILTER_FLAG_HOST_REQUIRED
FILTER_FLAG_SCHEME_REQUIRED
و FILTER_FLAG_HOST_REQUIRED
عند استخدام FILTER_VALIDATE_URL
هذه حركة إلى الأمام. عند استخدام filter_var($var, FILTER_VALIDATE_URL)
، هناك FILTER_FLAG_SCHEME_REQUIRED
FILTER_FLAG_HOST_REQUIRED
لضمان التحقق الصارم من عنوان URL: FILTER_FLAG_SCHEME_REQUIRED
و FILTER_FLAG_HOST_REQUIRED
.
بدءًا من 5.2.1 PHP ، يتم تطبيق كل من هذه العلامات بشكل ضمني بغض النظر عن ما إذا كانت مضبوطة أم لا.
إذا كان رمزك يستخدم هذه العلامات ، فما عليك سوى حذفها وستكون على ما يرام. يوجد حاليًا أكثر من 5000 نتيجة بحث باستخدام github.
RFC ، مناقشة حول Externals.io ، التنفيذ
تأثير التوافق مع الإصدارات السابقة
نظرًا لإيقاف كل من هذه العلامات ، سترى إشعارًا مثل:
Deprecated: filter_var(): explicit use of FILTER_FLAG_SCHEME_REQUIRED and FILTER_FLAG_HOST_REQUIRED is deprecated in ...
كل ما عليك فعله هو إزالة العلمين فقط يتم FILTER_VALIDATE_URL
عند استخدام FILTER_VALIDATE_URL
.
تسجيل الثوابت المستقلة المهملة
تسمح لك الوظيفة define()
بتعريف ثابت في وضع غير حساس لحالة الأحرف. يجب أن تعلن صراحة عن ثابت حساس لحالة الأحرف بتمرير المعلمة الثالثة للدالة true
. هذا ليس السلوك الافتراضي وربما لا يتوافق مع القدرة على إعلان الثوابت عبر الكلمة الأساسية const
.
define('Foo', 'Bar', true);
سوف يرمي الرمز أعلاه إشعارًا Deprecated: define(): Declaration of case-insensitive constants is deprecated in ...
: Deprecated: define(): Declaration of case-insensitive constants is deprecated in ...
بالإضافة إلى ذلك ، عند محاولة الوصول إلى الثوابت التي تم الإعلان عنها في Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "Foo"
( FOO
) ، سترى تحذيرًا مفيدًا جدًا: Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "Foo"
Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "Foo"
RFC ، مناقشة حول Externals.io ، التنفيذ
تأثير التوافق مع الإصدارات السابقة
سيكون عليك الذهاب إلى الكود الأساسي ، حيث يتم الإعلان عن الثوابت المستقلة عن التسجيل وتصحيحها لاحقًا. من غير المحتمل للغاية أن تكون هناك أي مشاكل في هذا ، لأنه من الصعب للغاية القبض على جميع حالات الاستخدام ، ولكن نتيجة لذلك سيصبح الرمز أكثر وضوحًا.
لم أجد أي أمثلة على هذا الاستخدام على github ، ولكن على الأقل Drupal و WordPress (مشروعان قديمان إلى حد ما و PHP) لديهم ثوابت غير حساسة لحالة الأحرف.
استثناء اختياري اختياري للأخطاء في json_decode
json_encode
و json_decode
واحدة من المفضلة. طوال هذه السنوات ، كان json_encode()
و json_decode()
صامتين بشأن الأخطاء في متغيرات PHP أو سلاسل json ، مما أدى إلى رمز تم وضع علامة عليه. كانت هذه القضية حتى في الانتقاد الشهير لـ PHP: مجموعة من التصميم الضعيف .
يعرض json_decode
فارغة للإدخال غير الصالح ، في حين أن القيمة الخالية هي كائن حقيقي تمامًا لـ JSON الذي تم فك تشفيره. هذه الوظيفة غير موثوقة تمامًا ، ما لم تكن بالطبع تسمي json_last_error
كل مرة تستخدمها.
استغرق الأمر 6 سنوات بعد مشاركة المدونة هذه وأتيحت لنا الفرصة للحصول على خطأ حول فشل json:
try { json_decode("{", false, 512, JSON_THROW_ON_ERROR); } catch (\JsonException $exception) { echo $exception->getMessage();
يعد \JsonException
الجديد \JsonException
لـ \Exception
، بالإضافة إلى الثابت JsonException
و JsonException
نفسه في مساحة الاسم العامة.
أوصي بشدة أن تبدأ في استخدام هذه الميزة. هناك مكتبات تابعة لجهات خارجية ، مثل daverandom / الاستثنائية-json ، تقوم بتنفيذ وظائف مماثلة لإصدارات PHP 7.2 وما دونها. مع ظهور هذه الوظيفة في قلب PHP ، يمكنك إزالة هذه الحزمة وأطنان من كود القالب القبيح باستخدام json_last_error()
في كل مكان تعمل فيه مع json.
RFC ، مناقشة حول Externals.io ، التنفيذ
تأثير التوافق مع الإصدارات السابقة
لا شيء إذا كنت لا تستخدم الاستثناء الخاص بك و / أو الثابت بنفس الأسماء.
إضافة is_countable()
PHP 7.2 لديه الكثير من الوظائف المتقادمة والعربات التي تجرها الدواب. إذا كنت في PHP 7.2. count()
المكالمات count()
باستخدام متغير غير countable
، ثم سيعرض PHP تحذيرًا حول ذلك. في التعديلات العامة ، كان هناك اقتراح للتحقق من المتغير الناتج countable
قبل استخدامه في count()
.
countable
-variable عبارة عن مصفوفة أو كائن يقوم بتنفيذ واجهة \Countable
. نظرًا لأنه سيتم استخدام الكثير من التعليمات البرمجية المعيارية أثناء التحقق ، قدم PHP 7.3 وظيفة جديدة is_countable()
، والتي تتحقق من المتغير لـ ... جيدًا ... إمكانية استخدام count()
.
لقد كتبت ملفًا متعددًا لـ is__countable () إذا كنت تريد البدء في استخدام هذه الميزة الآن.
RFC ، مناقشة حول Externals.io ، التنفيذ
تأثير التوافق مع الإصدارات السابقة
حتى يتم الإعلان عن وظيفتها الخاصة is_countable()
، لن تكون هناك مشاكل.
إضافة الدالتين array_key_first()
و array_key_last()
في PHP ، هناك 75 وظيفة مختلفة للعمل مع المصفوفات ، ولكن حتى الآن لم تكن هناك طريقة سهلة للحصول على المفتاحين الأول والأخير من الصفيف دون تغيير مؤشر الصفيف أو التكرار عبر جميع المفاتيح (عبر array_keys()
) ثم الحصول على القيمة الأولى / الأخيرة.
array_key_first()
وظيفتان جديدتان ، array_key_first()
و array_key_last()
مما يتيح لك القيام بذلك.
اقترح RFC أيضًا إضافة array_value_first()
و array_value_last()
، لكن هذا الجزء لم ينجح في التصويت.
RFC ، مناقشة حول Externals.io ، التنفيذ
تأثير التوافق مع الإصدارات السابقة
إذا لم تعلن عن array_key_first()
الخاصة في array_key_first()
و array_key_last()
، فلا مشكلة.
الانتقال من PCRE إلى PCRE2
تستخدم PHP التعبيرات العادية المتوافقة مع Perl أو PCRE قريبًا في المكتبة للعمل مع التعبيرات العادية. منذ PHP 7.2 ، تم استخدام الإصدار 8.x من مكتبة PCRE القديمة ، وفي PHP 7.3 سيتم استخدام PCRE2 بالفعل. يرجى ملاحظة أن PCRE2 تعتبر مكتبة جديدة ، على الرغم من أنها متوافقة إلى حد كبير مع PCRE (8.x).
المكتبة الجديدة أكثر عدوانية في التحقق من الأنماط وقد تؤدي إلى أخطاء في التعليمات البرمجية الموجودة. المقتطف التالي سيكون غير صالح مع PHP 7.3:
preg_match('/[\w-.]+/', '');
سيصدر PHP تحذيرًا Warning: preg_match(): Compilation failed: invalid range in character class at offset 3
.
مشكلة النمط: لكي ينجح هذا ، يجب نقل الواصلة إلى النهاية أو الفرار.
preg_match('/[\w\-.]+/', '');
سوف يعمل الكود أعلاه بشكل جيد ليس فقط مع PHP 7.3 ، ولكن أيضًا مع الإصدارات الأقدم. في النمط الجديد ، يتم تجاوز الواصلة -
إلى \-
. هذه هي المشكلة الأكثر شيوعًا التي قد تواجهها عند حل مشكلات التوافق.
هذا تغيير طفيف إلى حد ما ، ولكن هناك احتمال أن يسير كل شيء بشكل خاطئ. تشير رسالة الخطأ إلى الموضع الدقيق للشخصية في التعبير العادي. تأكد من التحقق بعناية من التعليمات البرمجية الخاصة بك. تحقق من التعبيرات العادية للتوافق مع بناء جملة PCRE2 من خلال Regex Buddy
أو برامج أخرى مماثلة. راجع وصف بناء جملة PCRE2 وبنية PCRE القديمة لمزيد من المعلومات.
RFC ، مناقشة حول Externals.io ، التنفيذ
تأثير التوافق مع الإصدارات السابقة
نظرًا لأن PCRE2 أكثر انتقائية وصرامة بشأن النماذج ، فقد لا تعمل بعض preg_match()
والمكالمات المماثلة. يختلف الإصلاح من تحديث القالب ببساطة (على سبيل المثال ، الهروب من الواصلات) إلى إعادة كتابة القوالب. تأكد من نجاح جميع اختباراتك.