تقديم PHP 7.4: الأداء ، الميزات ، الإهمال

ماذا PHP 7.4 يعني بالنسبة لك؟


يتطور PHP بشكل مستمر وأصدروا للتو آخر تحديثات PHP 7.4 ، المليئة بالميزات الجديدة. كما أثبتنا بالفعل في إصدارات PHP 7 السابقة - استمر الأداء والسرعة في التقدم. واحدة من أكثر الميزات الجديدة إثارة هي التحميل المسبق . إنه يسرع تنفيذ البرنامج النصي ويقدم القدرة على الحصول على كود أسرع وأنظف بسبب الأسطر الشائعة المبسطة للرمز.

أخذ الأشخاص المسؤولون عن PHP تعليقات وطلبات جمهورهم في الاعتبار إلى أقصى حد وأجابوا عليها بلا عيب. لقد قاموا منذ ذلك الحين بتغيير الكود باستمرار ليصبحوا أكثر سهولة وأكثر راحة في التبديل بين لغات البرمجة.

يستخدم PHP في أكثر من 78.9 ٪ من جميع المواقع. وفقًا لـ W3techs ، أشهر المواقع التي تستخدم PHP هي Wikipedia و Pinterest و Facebook ، على سبيل المثال لا الحصر.

إذا نظرنا صراحة إلى مواقع WordPress التي تشغل PHP ، مقارنة PHP 5 و 7 ، يمكننا أن نرى زيادة سرعة مزدوجة. تكتسب مواقع WordPress المدعومة أكثر من غيرها باستخدام أحدث إصدار من PHP.

صورة

يوضح هذا الرسم البياني حقيقة المواقع الإلكترونية التي تستخدم PHP بنشاط. هل 40 مليون. المواقع الحية بما فيه الكفاية لجذب انتباهكم؟ هذا كم يستخدمون PHP الآن. بالإضافة إلى ذلك ، يقدم PHP 7.4 بالفعل نتائج اختبار أفضل من PHP 7.3 مع تحسين الأداء وجودة أخرى من ترقيات الحياة.

يوضح الرسم البياني أدناه الاختبار القياسي العام للإصدارات الجديدة والقديمة من PHP. كانت بعض المعايير التي تم اختبارها هي سهولة الاستخدام والسرعة والأداء وغيرها.

صورة

ما الجديد في PHP 7.4؟


منذ عام 2016 ، أطلق PHP7 تحديثات سنوية دون إخفاق. كل عام يقدمون ميزات وإضافات جديدة وإمكانية كتابة تعليمات برمجية أنظف تجعل اللغة أكثر موثوقية وسهولة في الاستخدام بالنسبة لأولئك الذين يقومون بتشغيلها على مواقع الويب الخاصة بهم.

دعنا ندرس ونلقي نظرة عن كثب على بعض التغييرات التي تم إجراؤها مع إضافة PHP 7.4. للحصول على قائمة كاملة ، تحقق من سجل التغيير هنا .

تحميلها مسبقا


لنتحدث عن الكود. عند استخدام إطار عمل أو مكتبات ، يجب تحميل ملفاتها وربطها عند كل طلب. التحميل المسبق هو عندما يمكنك تحميل الأطر والمكتبات في OPCache. يسمح للخادم بتحميل ملفات PHP وتخزينها في الذاكرة أثناء بدء التشغيل وإتاحتها لأي طلبات مستقبلية. تحدث عن تسير الأمور بسرعة!

يتم تشغيل التحميل المسبق بواسطة توجيه php.ini محدد: opcache.preload . هذا يحتوي على برنامج التحويل البرمجي للبرنامج النصي PHP وينفذ عندما يبدأ الخادم. يمكن استخدامه أيضًا للتحميل المسبق لمزيد من الملفات واختيار تضمينها أو تجميعها.

هذا رائع. ومع ذلك ، إذا تم تغيير مصدر الملفات المحملة مسبقًا ، فيجب إعادة تشغيل الخادم. تظل الملفات المحملة مسبقًا أيضًا مخزنة مؤقتًا في ذاكرة OPCache إلى الأبد.
ومع ذلك ، ستظل هذه الملفات المحملة مسبقًا متاحة لأي طلبات مستقبلية في حالة احتياجك لاستخدامها مرة أخرى.

انتشار عامل التشغيل في تعبيرات الصفيف


عندما تم إصدار PHP 5.6 ، بدأ PHP في دعم تفكيك الوسيطة (معامل الانتشار) ، لكن الآن ، مع 7.4 ، يمكننا استخدام هذه الميزة مع تعبير صفيف. تفكيك الوسيطة عبارة عن بناء جملة لإلغاء تفريغ المصفوفات و Traversables في قوائم الوسيطة. وللقيام بذلك ، يحتاج فقط إلى أن يسبق ... (3 نقاط).

لنلقِ نظرة على هذا المثال:

$animals = ['dog', 'cat']; $animalkingdom = ['lion', 'elephant', ...$animals, 'giraffe']; // ['lion', 'elephant', 'dog', 'cat', 'giraffe']; 

يمكننا الآن توسيع صفيف من أي مكان نريده في صفيف آخر ، وذلك ببساطة عن طريق استخدام بناء جملة Spread Operator.

هنا مثال أطول:

 $num1 = [1, 2, 3]; $num2 = [...$num1]; // [1, 2, 3] $num3 = [0, ...$num1]; // [0, 1, 2, 3] $num4 = array(...$num1, ...$num2, 111); // [1, 2, 3, 1, 2, 3, 111] $num5 = [...$num1, ...$num1]; // [1, 2, 3, 1, 2, 3] 

ليس ذلك فحسب ، ولكن يمكنك أيضًا استخدامه في وظيفة. تحقق من هذا المثال:

 function getNum() { return ['a', 'b']; } $num6 = [...getNum(), 'c']; // ['a', 'b', 'c'] $num7 = [...new NumIterator(['a', 'b', 'c'])]; // ['a', 'b', 'c'] function arrGen() { for($i = 11; $i < 15; $i++) { yield $i; } } $num8 = [...arrGen()]; // [11, 12, 13, 14] 

بالإضافة إلى ذلك ، يمكنك الآن فك الصفائف والمولدات التي يتم إرجاعها بواسطة دالة مباشرةً في صفيف جديد.

سيبدو مثال الكود كما يلي:

 function getAnimals(){ return ['dog', 'cat', 'elephant']; } $num1 = [...getAnimals(), 'lion', 'tiger', 'giraffe']; 

ومع PHP 7.4 ، ستطبع:

 array(6) { [0]=> string(3) "dog" [1]=> string(3) "cat" [2]=> string(8) "elephant" [3]=> string(4) "lion" [4]=> string(5) "tiger" [5]=> string(7) "giraffe" } 

باستخدام تعبير الصفيف الجديد هذا ، يجب أن يكون لدى مشغلي السبريد أداء أفضل على مستوى 7.3 array_merge. هذا لأن عامل الانتشار هو بنية لغة بينما array_merge دالة. أيضًا لأن معامل الانتشار يدعم الكائنات التي تنفذ traversable و array_merge يدعم المصفوفات فقط.

بعض الأشياء المهمة التي يجب ملاحظتها ، يمكنك فقط استخدام المصفوفات المفهرسة لأن مفاتيح السلسلة غير مدعومة. في حالة الاستخدام ، سيتم طرح خطأ قابل للاسترداد على الشاشة ، بمجرد العثور على مفتاح سلسلة.
فائدة مجيدة أخرى إلى 7.4 هو إزالة array_merge. نقول وداعا لتحول مؤشر اللعين!

على سبيل المثال ، لنلقِ نظرة على دمج الصفيف الطويل الموضح أدناه:

 $array = ['banana, 'orange']; $array[2] = 'orange'; $array[1] = 'apple'; //shifting var_dump($array); // prints array(3) { [0]=> string(6) "banana" [1]=> string(5) "apple" [2]=> string(6) "orange" 

فائدة أخرى من 7.4 هو استخدام وظيفة المولد. تعمل وظيفة المولد تمامًا كدالة عادية ، باستثناء أنه بدلاً من إرجاع قيمة ، تعطي دالة المولد أكبر عدد ممكن من القيم.

راجع رمز المثال أدناه:

 function generator() { for ($i = 3; $i <= 5; $i++) { yield $i; } } $num1 = [0, 1, 2, ...generator()]; 

مراجع ضعيفة


الآن PHP 7.4 لديه فئة WeakReference ، والتي لا يجب الخلط بينها وبين فئة WeakRed أو امتداد Weakref .

يتيح WeakReferences للمبرمج استدعاء إشارة إلى كائن. هذا مفيد لأنه لا يمنع تدمير الكائن. أنها مفيدة لتنفيذ بنيات مثل ذاكرة التخزين المؤقت.

 WeakReference { /* Methods */ public __construct ( void ) public static create ( object $referent ) : WeakReference public get ( void ) : ?object } 

معلمات المخالفة وعودة المتغير


يستخدم PHP حاليًا أنواع المعلمات الثابتة وأنواع الإرجاع. بمعنى ، إذا كان الأسلوب يحتوي على معلمة أو نوع إرجاع من X ، فيجب أن تكون المعلمة من النوع الفرعي أو نوع الإرجاع من النوع X.

الآن ، مع PHP 7.4 يقترح السماح المتغير (أمر من خاص إلى عام) ومخالف (عكس الترتيب) على أنواع المعلمة والإرجاع.

هنا مثال على كليهما:

مثال على نوع الإرجاع المتغير:

 interface Factory { function make(): object; } class UserFactory implements Factory { function make(): User; } 

مثال على نوع المعلمة Contravariant:

 interface Concatable { function concat(Iterator $input); } class Collection implements Concatable { // accepts all iterables, not just Iterator function concat(iterable $input) {/* . . . */} } 

خصائص مكتوبة 2.0


منذ PHP 5 ، أصبحت تلميحات الكتابة ميزة متاحة تتيح لك تحديد نوع المتغير المتوقع تمريره إلى دالة أو فئة. في عمليات ترحيل 7.2 PHP ، أعطت إضافة نوع بيانات الكائن الأمل في أن يكون المزيد منها متاحًا في المستقبل. المستقبل هو الآن.

في الإصدار 7.4 الجديد ، يستطيع PHP دعم قائمة الأنواع التالية:

 bool, int, float, string, array, object, iterable, self, parent any class or interface name ?type // where "type" may be any of the above 

لاحظ أنه يمكن استخدام النوع الأصل في الفصول ولا يحتاج إلى أن يكون أحد الوالدين متوافقًا مع المعلمة ونوع الإرجاع.

لاحظ أيضًا أنه لا يتم دعم الفراغ والقابل للاستدعاء . تمت إزالة الفراغ لأنه لم يكن مفيدًا وكان له دلالات غير واضحة ؛ يمكن الاتصال به ، لأن سلوكه يعتمد على السياق.

دعنا تحقق من بعض الأمثلة.

فيما يلي فصل ، كتب لـ PHP 7.3:

 class User { /** @var int $id */ private $id; /** @var string $name */ private $name; public function __construct(int $id, string $name) { $this->id = $id; $this->name = $name; } public function getId(): int { return $this->id; } public function setId(int $id): void { $this->id = $id; } public function getName(): string { return $this->name; } public function setName(string $name): void { $this->name = $name; } } 

في PHP 7.4 ، دون التضحية بأي نوع من أنواع السلامة ، يمكن الآن كتابة فصل بسيط مثل:

 class User { public int $id; public string $name; public function __construct(int $id, string $name) { $this->id = $id; $this->name = $name; } } 

فيما يلي بعض الأمثلة لجميع الأنواع 7.4 التي يدعمها الآن:

 class Example { 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 "var" notation var bool $flag; // Typed properties may have default values (more below) public string $str = "foo"; 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; } 

وظائف السهم 2.0


تميل الدالات المجهولة في PHP إلى أن تكون مكتوبة وطويلة ، حتى لو كانت تؤدي عمليات بسيطة فقط. هذا يرجع جزئيًا إلى وجود كمية كبيرة من الغليان النحوي ، ويرجع جزئيًا إلى الحاجة إلى استيراد المتغيرات المستخدمة يدويًا.

هذا يجعل الكود يستخدم عمليات إغلاق بسيطة مربكة في القراءة وصعبة الفهم.

دعونا نلقي نظرة على بعض الأكواد التي ستستخدمها مع PHP 7.3:

 function array_values_from_keys($arr, $keys) { return array_map(function ($x) use ($arr) { return $arr[$x]; }, $keys); } 

الآن ، إليك الصيغة الأكثر إيجازًا لـ PHP 7.4:

 function array_values_from_keys($arr, $keys) { return array_map(fn($x) => $arr[$x], $keys); } 

لذلك ، تحتوي وظائف السهم الآن على هذا النموذج البسيط:

 fn(parameter_list) => expr 

أدناه يمكنك رؤية مثال على وظيفتين $ fn1 (7.3) و $ fn2 (7.4) جنبًا إلى جنب. لديهم نفس النتيجة ولكن تبدو مختلفة:

 $y = 1; $fn1 = fn($x) => $x + $y; $fn2 = function ($x) use ($y) { return $x + $y; }; 

سيعمل هذا أيضًا إذا كانت وظائف السهم متداخلة:

 $z = 1; $fn = fn($x) => fn($y) => $x * $y + $z; 

هنا تلتقط الوظيفة الخارجية $ z . ثم ، تلتقط الوظيفة الداخلية أيضًا $ z من الوظيفة الخارجية. مع 7.4 ، يمكن أن يصبح النطاق الخارجي متاحًا في الوظيفة الداخلية. هذا شيء 7.3 لم أستطع القيام به.

يسمح بناء جملة السهم لمجموعة متنوعة من الوظائف مثل المتغيرات والقيم الافتراضية وأنواع المعلمات والإرجاع ، بالإضافة إلى التمرير والإرجاع حسب المرجع. كل ذلك مع الحفاظ على مظهر نظيف وقابل للقراءة. فيما يلي جميع وظائف السهم الصالحة المتاحة الآن:

 fn(array $x) => $x; fn(): int => $x; fn($x = 42) => $x; fn(&$x) => $x; fn&($x) => $x; fn($x, ...$rest) => $rest; 

شيء واحد هو أن نلاحظ أن وظائف السهم لديها أدنى الأسبقية. انظر المثال:

 fn($x) => $x + $y // is fn($x) => ($x + $y) // not (fn($x) => $x) + $y 

الإستنكار


هناك العديد من الإهمال الذي يحدث عند الدمج إلى 7.4. القائمة التالية هي لمحة موجزة عن الوظائف المستهدفة للإهمال. يمكنك العثور على شرح أكثر تفصيلاً هنا :

  • النوع الحقيقي
  • السحر يقتبس إرث
  • array_key_exists () مع الكائنات
  • فلتر FILTER_SANITIZE_MAGIC_QUOTES
  • طرق تصدير الانعكاس
  • mb_strrpos () مع الترميز كوسيطة 3
  • implode () مزيج ترتيب المعلمة
  • إلغاء ربط هذا دولار من الإغلاق غير ثابت
  • hebrevc () وظيفة
  • وظيفة convert_cyr_string ()
  • المال () وظيفة
  • وظيفة ezmlm_hash ()
  • r estore_include_path () وظيفة
  • allow_url_include ini directiv

بعض النقاط المهمة التي يجب ملاحظتها هي إهمال الخطوات التالي.

تغيير أسبقية المشغل التسلسلي


حاليًا الأسبقية من "." و "+" و "-" جميع العوامل متساوية. سيتم ببساطة حل أي مجموعة من هذه العوامل من اليسار إلى اليمين.

دعونا نلقي نظرة على هذا الكود في PHP 7.3:

 echo "sum: " . $a + $b; // would be evaluated left-to-right echo ("sum: " . $a) + $b; // could also look like this 

باستخدام PHP 7.4 ، "+" و "-" سيكون لهما الأسبقية "." لذلك الإضافات والطرح ستنفذ دائما قبل السلسلة. هذا سيبدو كما يلي:

 echo "sum: " . $a + $b; // would be executed as if the code were as follows. echo "sum :" . ($a + $b); 

يهدف هذا الاقتراح المكون من خطوتين إلى أن يكون أقل عرضة للخطأ وأكثر غريزية. PHP 7.4 حاليًا في المرحلة الأولى مع إشعار إهمال للتعبير غير المقوس عن "+" و "-" و "." أثناء انتظار التصويت النهائي / التغيير الذي يحدث في PHP 8.

المشغل الثلاثي الترابطي الأيسر


على عكس معظم اللغات الأخرى ، فإن العامل الثلاثي في ​​PHP يكون ارتباطي يساري وليس ارتباطي يميني. ليس فقط من غير المألوف ، إنه أمر مربك أيضًا للمبرمجين الذين يقومون بالتبديل بين لغات مختلفة. يقترح PHP 7.4 إزالة associativity اليسار ويتطلب استخدام الأقواس بدلاً من ذلك.

دعنا نلقي نظرة على الكود أدناه:

 return $a == 1 ? 'one' : $a == 2 ? 'two' : $a == 3 ? 'three' : $a == 4 ? 'four' : 'other'; 

في معظم اللغات الأخرى سيتم تفسيرها على النحو التالي:

 return $a == 1 ? 'one' : ($a == 2 ? 'two' : ($a == 3 ? 'three' : ($a == 4 ? 'four' : 'other'))) 

أثناء وجوده في PHP ، يتم تفسيره بدلاً من ذلك على أنه:

 return ((($a == 1 ? 'one' : $a == 2) ? 'two' : $a == 3) ? 'three' : $a == 4) ? 'four' : 'other'; 

هذا يمكن أن يؤدي إلى أخطاء لأنه بشكل عام ليس المقصود.

من خلال اقتراح منفصل مؤلف من خطوتين ، طبق PHP 7.4 الاستخدام الصريح للأقواس كتحذير من الإهمال ونأمل في تنفيذ خطأ وقت تشغيل مترجم في الإصدارات المستقبلية.

استنتاج


في الوقت المناسب لقضاء العطلات ، PHP 7.4 يجلب ميزات جديدة وتحسين نوعية الحياة لجميع مطوري PHP.

ستستفيد مواقع WordPress بالتأكيد من هذه التحسينات ويمكن لمستخدميها توقع أوقات تنفيذ أسرع واستخدام أقل للذاكرة عند استخدام PHP 7.4 مقارنة بالإصدارات السابقة.

مع إضافة إعلانات نوع الخاصية من الدرجة الأولى ونوع التلميح ، ووظائف دمج الأسهم ، والسرعة الأفضل بشكل يبعث على السخرية ، سوف يعمل الإصدار 7.4 على تحسين كل من سرعة وجودة سير عملك.

Source: https://habr.com/ru/post/ar483128/


All Articles