تطوير PHP. مكون وحدة تحكم سيمفوني - نصائح وحيل
تم إنشاء هذه المقالة بهدف أن تظهر لك النصائح والحيل الأكثر فائدة واسترجاعًا حول تطوير وحدة تحكم Symfony Console.
الإصدار الجديد من PHP على الأبواب. ما هي التطبيقات الجديدة التي يجب أن تعرفها؟ راجع هذه المقالة لمعرفة ذلك!
PHP 8.2 على وشك الإصدار. ربما سيكون الإصدار الذي يجعل الترقية إلى PHP 8 تبدو جذابة للجميع. دعونا نتحدث عما يمكن للمطورين التطلع إليه مع PHP 8.2 والاستعداد لأحدث إصداراته. ولكن أولاً، دعنا نستعرض بسرعة جميع إصدارات PHP والتغييرات التي طرأت عليها على مر السنين.
<?php
فئة المستخدم {
عام int $id;
سلسلة عامة $name;
}
?>
<?php
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = مصفوفة (10، 20، 30، 40);
?>
<?php
الفئة أ {}
الصنف B يمدد A {}
صنف منتج {
طريقة الدالة العامة(): A {}
}
صنف ChildProducer ممتد منتج {
طريقة الدالة العامة(): B {}
}
?>
<?php
$array['key'] ??= computeDefault();
// يعادل تقريبًا
إذا (!isset($array['key'])) {
$array['key'] = computeDefault();
}
?>
<?php
$parts = ['تفاحة'، 'كمثرى'];
$fruits = ['موز'، 'برتقال'، ...$parts، 'بطيخ'];
// ['موز'، 'موز'، 'برتقال'، 'تفاح'، 'كمثرى'، 'بطيخ'];
?>
<?php
// إرجاع مصفوفة تحتوي على جميع الحالات الضرورية للكائن.
الدالة العامة __serialize(): مصفوفة;
// يستعيد حالة الكائن من مصفوفة البيانات المعطاة.
الدالة العامة __unserialize(صفيف $data): باطل;
?>
صدر الإصدار PHP 8.0 في نوفمبر 2020، وقد قدم لنا PHP 8.0 أفضل الميزات حتى الآن، والتي تتضمن
htmlspecialchars($string, double_encode: false)؛<رمز
فئة متحكم المنشورات
{
#[Route("/API/posts/{id}", methods: ["GET"])]
دالة عامة get($id) { /* .... */ }
}
صنف نقطة {
عام الدالة __construct(
العامة العوامة $x = 0.0,
العامة العوامة $y = 0.0,
العامة العوامة $z = 0.0,
) {}
}
فئة العدد {
الدالة العامة __construct(
خاص int |العدد $number
) {}
}
رقم جديد('NaN')؛ // خطأ في الكتابة
صدى مطابقة (8.0) {
'8.0' => "أوه لا!",
8.0 => "هذا ما توقعته",
};
//> هذا ما توقعته
$country = $session?- المستخدم?- المستخدم?- الحصول على العنوان()- البلد;
حالة التعداد
{
حالة مسودة
حالة منشورة
حالة مؤرشف;
}
دالة قبول الحالة(الحالة $status) {...}
فئة بيانات المدونة
{
عام للقراءة فقط الحالة $status;
الدالة العامة __إنشاء(الحالة $status)
{
$this->الحالة = $status;
}
}
$foo = $This->foo(...);
$fn = strlen(...);
فئة الخدمة
{
مسجّل خاص $logger;
دالة عامة __بناء(
Logger $logger = جديد NullLogger(),
) {
$This->logger = $logger;
}
}
دالة Count_and_and_iterate(Iterator&Countable $value) {
قبل كل ($value ك $val) { {
صدى $val;
}
عد($value);
}
$response = $httpClient->>request('https://example.com/');
اطبع json_decode($response->getBody()>>buffer())['code'];
PHP 8.2 يقدم المزيد من التغييرات التي تهدف إلى تسهيل حياة المطور وتحسين عمله أكثر. فيما يلي قائمة بالميزات الجديدة.
واحدة من أكبر التحسينات في الإصدار الجديد من PHP هي القدرة على إنشاء للقراءة فقط
فئة. ستعمل الفئة الموصوفة بهذه الميزة على نشرها تلقائيًا لمتغيراتها. ستبدو فئات DTO الآن أنيقة ونظيفة!
للقراءة فقط فئة الفاتورةDTO
{
الدالة العامة __construct(
عام UUID $uid,
عام المصدر $issuer,
عام DateTime $issuedAt,
) {}
}
التغيير الضخم الثاني هو إهمال المتغيرات الديناميكية في الأصناف. سيؤدي التنفيذ التالي إلى إهمال المتغيرات الديناميكية في PHP 8.2 و خطأ في الاستثناء
في الإصدار المستقبلي من PHP.
فئة المستخدم الخاص بي
{
سلسلة عامة $name;
}
(...)
$myUser->الاسم = 'الاسم'؛ // موافق
$P62TmyUser->>اللقب = 'اللقب'؛ // تم الإهمال/استثناء خاطئ
من الجدير بالذكر أن الفصول التي تنفذ __ احصل على
و __مجموعة
والفئات التي ترث مباشرة من ستد كلاس
لا يزال بإمكانه تنفيذ الأساليب السحرية دون أي عقبات.
وهنا أحيلك أيضًا إلى موضوع مثير للاهتمام على GitHub، حيث يناقش مطورو PHP-CS هذا التغيير والحاجة إلى تعديل أداتهم الشائعة للإصدار الجديد من اللغة.
أخيرًا وليس آخرًا، يمكنك تعطيل هذا السلوك عبر التعليق التوضيحي.
#[السماح بالخصائص الديناميكية]
فئة MyUser
{
سلسلة عامة $ الاسم;
}
$myUser-> اللقب = 'اللقب'؛ // موافق
لا شيء
, صحيح
و كاذبة
حتى الآن، كانت الدوال التي تُعيد دائمًا صحيح
أو كاذبة
قيمة يجب وصفها بـ بعملي
النوع.
الدالة AlwaysTrue(): bool { إرجاع صواب؛ }
من الآن فصاعدًا، يمكننا استخدام صحيح
و كاذبة
كأنواع بسيطة في القيم المُعادة للدوال.
الدالة AlwaysTrue(): صواب { إرجاع صواب؛ }
(DNF) هي طريقة قياسية لتنظيم التعبيرات المنطقية. على وجه التحديد، تعني هيكلة التعبير المنطقي إلى سلسلة من (ORed) من (ANDs). عند تطبيقه على تعريفات النوع، فإنه يسمح بطريقة قياسية لكتابة أنواع الاتحاد والتقاطع المدمجة التي يمكن للمحلل معالجتها.
إنه تغيير كبير، حيث يمكننا الآن الحصول على أنواع تقاطعات لاغية على سبيل المثال:
دالة getFullName((HasName&HasSurname)|null $user) { ... }
أنا لست من أكبر مؤيدي استخدام السمات ومثل هذا التغيير شكلي بحت بالنسبة لي، خاصةً أنه لا يسمح لك باستخدام قيم السمات دون تهيئة الكائن.
سمة Foo {
عام const const FLAG_1 = 1;
دستة محمية FLAG_2 = 2;
خاص يشكل FLAG_3 = 2;
الدالة العامة doFoo(int $flags): باطل {
إذا ($flags & self::FLAG_1) { {
صدى 'حصلت على العلم 1';
}
إذا ($flags & self::FLAG_2) { {
صدى 'حصلت على العلم 2';
}
إذا ($flags & self::FLAG_3) { {
صدى 'حصلت على العلم 3';
}
}
}
أحد أهم التغييرات التي أتطلع إليها. في الإصدار الأخير من PHP سنتمكن في الإصدار الأخير من PHP من تمييز المتغيرات على أنها قيمة المعلمة الحساسة
. لماذا يجب علينا؟
تعتبر آثار مكدس PHP في الاستثناءات مفيدة جدًا لتصحيح الأخطاء، ومع ذلك، فهي تسمح لك بمعاينة قيم المعلمات. على سبيل المثال، دعنا نتخيل أن PDO الكود المستخدمة للاتصال بقاعدة بيانات. سيبدو تتبع التصحيح كما يلي:
استثناء PDO: حالة SQLSTATE[HY000] [2002] لا يوجد ملف أو دليل من هذا القبيل في /var/www/html/test.php:3
تتبع المكدس:
#0 /var/ww/wwml/test.php(3): PDO->__construct('mysql:host=loca...'، 'root'، 'root'، 'password')
#1 {الرئيسي}
بعد استخدام التعليق التوضيحي #[SensitiveParameter]
لن يُظهر تتبع المكدس قيمة المتغير بعد الآن.
اختبار الدالة(
$foo,
#[SensitiveParameter] $bar,
$baz
) {
طرح استثناء جديد('خطأ');
}
اختبار('foo', 'bar', 'baz');
/*
خطأ فادح: استثناء غير معلوم: خطأ في test.php:8
تتبع المكدس:
#0 test.php(11): اختبار('foo'، كائن (SensitiveParameterValue)، 'baz')
#1 {الرئيسي}
تم طرحه في test.php في السطر 8
*/
كما يقول المؤلف
، الدافع الأساسي لهذا التغيير هو السماح بجلب خصائص الاسم والقيمة في الأماكن التي لا يُسمح فيها بجلب كائنات enum، مثل مفاتيح المصفوفات. يمكن أن نعمل على المصفوفات بحيث يمكن توسيعها للسماح بجلب خصائص المصفوفات للسماح بجلب التعدادات أو جميع الكائنات كمفاتيح، ولكن السماح بجلب خصائص التعدادات أبسط.
enum A: سلسلة {
الحالة B = 'B';
const C = [الذات::B->>قيمة => الذات::B];
}
كانت الطرق الثابتة في السابق تعمل هكذا:
DateTime::createFromImmutable(): التاريخ والوقت
DateTimeImmutable::createFromMutable(): قابل للتغيير
في PHP 8.2 سيتم تغييره إلى
التاريخ والوقت::createFromImmutable(): ثابت
DateTimeImmutable:::createFromImmutable(): ثابت
يعد هذا تغييرًا فاصلًا لمنشئي المكتبات و/أو جميع التطبيقات المخصصة لوقت التاريخ.
هاتان الوظيفتان لم تؤدِّيا الغرض منهما، حيث إنهما لم تحولا إلا بين ISO-8859-1
و UTF-8
. يقترح دليل PHP استخدام mb_convert_encoding
بدلاً من ذلك.
أفضل وصف لحساسية الإعدادات المحلية هو أفضل وصف لمؤلف RFC:
قبل PHP 8.0، كان يتم تعيين لغة PHP من البيئة. عندما يقوم المستخدم بتثبيت Linux، يسأل المستخدم عن اللغة التي يريد أن يكون بها. قد لا يقدّر المستخدم عواقب هذا القرار بشكل كامل. فهو لا يقوم فقط بتعيين لغة واجهة المستخدم للأوامر المدمجة، بل إنه يغير بشكل واسع كيفية عمل معالجة السلاسل في مكتبة C. على سبيل المثال، سيجد المستخدم الذي يختار "التركية" عند تثبيت لينكس أن التطبيقات التي تستدعي كلمة toupper('i') ستحصل على الحرف I المنقّط (U+0130، "İ").
في عصر البروتوكولات الموحدة المستندة إلى النصوص، تعتبر اللغة الطبيعية تطبيقًا أقلية لتحويل حالة الأحرف. ولكن حتى لو كان المستخدم يريد تحويل حالة الأحرف في اللغة الطبيعية، فمن غير المرجح أن يحقق نجاحًا مع strtolower(). هذا لأنه يعالج السلسلة بايتًا واحدًا تلو الآخر، ويغذي كل بايت إلى تولاور() الخاص بمكتبة C. إذا كان الإدخال هو UTF-8، وهو الخيار الحديث الأكثر شيوعًا، فإن strtolower() سيؤدي إلى تشويه السلسلة، وعادةً ما ينتج عنه إخراج UTF-8 غير صالح.
توقف PHP 8.0 عن احترام متغيرات بيئة الإعدادات المحلية. لذا فإن الإعدادات المحلية دائمًا ما تكون "C" ما لم يستدعي المستخدم صراحةً setlocale(). هذا يعني أن الجزء الأكبر من التغيير المتوافق مع الإصدارات السابقة قد انتهى بالفعل. أي تطبيقات تعتمد على الإعدادات المحلية للنظام للقيام بتحويل الحالة لمجموعات الأحرف القديمة ذات 8 بت ستكون قد تعطلت بواسطة PHP 8.0.
ما يعني أن كل الدالة أدناه ستقوم بتحويل حالة ASCII من PHP.8.2:سرتولور
, ستوبر
, ستريستر
, ستريبوس
, ستريبوس
, أولاً
, ucfirst
, ucwords
, str_ireplace
لدينا الكثير من الطرق لتضمين المتغيرات في السلاسل في PHP:
- تضمين المتغيرات مباشرة ("$foo")
- أقواس خارج المتغير ("{$foo}")
- الأقواس بعد علامة الدولار ("${foo}")
- المتغيرات المتغيرة ("${expr}"، ما يعادل (سلسلة) ${expr})
لتجنب الالتباس وسوء الاستخدام لن تعمل هذه بعد الآن:
"مرحباً ${World}";
مهمل: تم إهمال استخدام ${} في السلاسل
"مرحباً ${(العالم)}";
مهمل: تم إهمال استخدام ${T{} (متغيرات متغيرة) في السلاسل
هذه ليست كل التغييرات التي PHP 8.2 ستقدمه لنا. لسوء الحظ، لم نحصل بعد على دعم للأنواع العامة، فوفقًا لما قالته نيكيتا فإن الأنواع العامة أحادية الشكل ستضيف الكثير من الأعباء على الأداء، وتتطلب الأنواع العامة المعاد تشكيلها تغييرات كثيرة في قاعدة الشيفرة بأكملها. لكن الملاحظ هو انضباط ورؤية المنتج. أصبحت التغييرات التي تم إدخالها في الإصدارات المتتالية من اللغة أكثر وضوحًا، وسيلاحظ المهتمون أن PHP تتحرك في الاتجاه الصحيح سواء في مجال تبسيط بناء الجملة أو دعم المستجدات. أتوقع أننا سنرى في وقت مبكر من العام المقبل قابل للاستدعاء
كنوع صالح.