PHP هي لغة برمجة يستخدمها عدد كبير من المستخدمين لأغراض تطوير الويب. تم إصدار أحدث إصدار مستقر ومحدث من PHP، 8.3، في 23.11.2023. لقد كانت هناك العديد من الابتكارات والتغييرات منذ PHP 3.x، الذي تم إصداره في عام 2000. ولا تزال PHP من بين لغات تطوير الويب (تصميم الويب) الأكثر شيوعًا والتي يستخدمها جمهور كبير جدًا. في هذه المقالة، سنقوم بفحص وتحليل الابتكارات والتغييرات في PHP 8.3 مع أمثلة التعليمات البرمجية.
PHP 8.3 الميزات والتحسينات الجديدة الرئيسية
هناك العديد من الابتكارات والتحسينات الرئيسية في PHP 8.3 مقارنة بإصدار PHP السابق PHP 8.2. وفي الوقت نفسه، تم إهمال بعض الميزات. سنقوم الآن بفحص الابتكارات والتحسينات واحدًا تلو الآخر مع أمثلة التعليمات البرمجية.
ثوابت الفئة المكتوبة
يعد الإعلان عن الكتابة ميزة مهمة جدًا للمطورين، فهي تزيد من الاستقرار وتقلل من معدلات الخطأ في تطوير الويب. تمت إضافة ميزة تعريف النوع للخصائص الموجودة في الفصل في PHP 7.4. على الرغم من إجراء العديد من التحسينات على هذه الميزة في الإصدارات الأحدث، إلا أن هذه الميزة ما زالت غير متوفرة للثوابت في الفصل. مع PHP 8.3، أصبح من الممكن الآن الإعلان عن أنواع الثوابت في الفئات.
// Doğru kullanım:
class MyClass {
// Bildirilen tür ve değer aynı
const string VERSION = "PHP 8.3"; // değer string
}
// Hatalı kullanım:
class MyClass {
// Bildirilen tür ile değer farklı
const int VERSION = "PHP 8.3"; // değer string
}
// Hatalı kullanım:
class MyClass {
// Bildirilen tür sınıf sabitleri için desteklenmiyor
const void VERSION = "PHP 8.3"; // değer string
}بعض إعلانات النوع غير مدعومة لثوابت الفئة.
تعريفات النوع غير المدعومة لثوابت الفئة: void, callable, never
وظيفة جديدة: json_validate()
عند العمل مع البيانات بتنسيق JSON (بيانات مشفرة بـ json)، نحتاج إلى التحقق من صحة البيانات الواردة قبل استخدام البيانات. كنا نفعل ذلك في الإصدارات السابقة لـ PHP 8.3 باستخدام الطرق التالية أو طرق مشابهة.
// PHP 8.3'ten önceki sürümlerde JSON verisini doğrulama
$data = $json_decode($maybeJSON);
if (json_last_error() === JSON_ERROR_NONE) {
// $data ile gerçekleştirilecek işlemler
}في هذا المثال القديم، عند التحقق من صحة بيانات JSON، يمكن أن تستهلك PHP ذاكرة كبيرة، اعتمادًا على حجم البيانات. في PHP 8.3، تمت إضافة وظيفة PHP جديدة تعمل على إنشاء حل سريع موجه نحو الأداء: json_validate(). لقد قمنا بتوضيح سيناريو استخدام هذه الوظيفة أدناه.
// PHP 8.3'te JSON verisini doğrulama
$data = $json_decode($maybeJSON);
if (json_validate($maybeJSON)) {
// $data ile gerçekleştirilecek işlemler
}ميزة جديدة: #[تجاوز]
عند تنفيذ الواجهات في PHP، فإننا نقدم وظائف مفصلة للطرق الموجودة في الواجهة. عند إنشاء مثيل لفئة، يمكننا تجاوز الطريقة الأصلية عن طريق إنشاء نسخة بديلة بنفس الاسم والتوقيع المتوافق. وهذا قد يسبب مشاكل كبيرة في البرنامج. باختصار، تكمن المشكلة في أننا نعتقد أننا تجاوزنا الطريقة الرئيسية نتيجة لخطأ مطبعي بسيط تم التغاضي عنه.
توفر خاصية PHP 8.3 #[Override] حلاً لهذه المشكلة. الآن دعونا نرى هذا في المثال.
class A {
protected function myOverrideFunc(): void {}
// Doğru kullanım
// Bu örnek çalışacak
// Üstteki sınıfta ilgili method var ve geçersiz kılındı
class B extends A {
#[\Override]
public function myOverrideFunc(): void {}
// Hatalı kullanım
// Bu örnek çalışmayacak, çünkü ana sınıfta method yok
// Muhtemelen gözden kaçan bir yazım hatası
class C extends A {
#[\Override]
public function myOverrideFunction(): void {}
}الاستنساخ العميق للخصائص للقراءة فقط
قدمت PHP إمكانية الإعلان عن خصائص فئة فردية للقراءة فقط في PHP 8.1 وتعيينها للفئة بأكملها في PHP 8.2. ومع ذلك، يعتقد معظم مطوري الويب أن القيود المفروضة عند العمل مع الفئات التي تحتوي على مثل هذه الميزات تمنع التطبيق العملي في منطق البرمجة.
لتغيير هذا RFC تم تقديم توصيتين رئيسيتين:
للقراءة فقط
readonlyالسماح للفصول الدراسية التي لا يسمح بتمديدهاreadonlyالسماح بإعادة تشغيل الميزات أثناء الاستنساخ
تم تضمين الاقتراح الثاني في PHP 8.3. تمت إضافة هذا النهج الجديد إلى PHP 8.3 readonly حالات فئة مع الخصائصreadonly خصائص) __clone يسمح بإعادة تشغيله بطريقته السحرية.
يمكن أن يساعدنا مثال التعليمات البرمجية هذا من RFC في فهم كيفية عمل هذه الطريقة الجديدة:
الجلب الديناميكي لثوابت الفئة وأعضاء التعداد
على عكس الميزات الأخرى في PHP، يعد التقاط ثوابت الفئة وأعضاء التعداد بأسماء المتغيرات أكثر تعقيدًا بعض الشيء. قبل PHP 8.3 كان بإمكاننا القيام بذلك مثل المثال أدناه:
class Foo {
public function __construct(
public readonly DateTime $bar,
public readonly DateTime $baz
) {}
public function __clone() {
// Klon çağrıldığında $bar yeni bir DateTime alacak
$this->bar = clone $this->bar;
// Ardından bu metod çağrılacak
$this->cloneBaz();
}
private function cloneBaz() {
// Bu __clone içinden çağrıldığından dolayı doğru bir kullanımdır
unset($this->baz);
}
}
$foo = new Foo(new DateTime(), new DateTime());
$foo2 = clone $foo;class MyClass {
public const THE_CONST = 9;
}
enum MyEnum: int {
case FirstMember = 9;
case SecondMember = 10;
}
$constantName = 'THE_CONST';
$memberName = 'FirstMember';
echo constant('MyClass::' . $constantName);
echo constant('MyEnum::' . #memberName)->value;الآن، لنحصل على القيم باستخدام تعريفات الفئة والتعداد في المثال أعلاه في PHP 8.3:
$constantName = 'THE_CONST';
$memberName = 'FirstNumber';
echo MyClass::{$constantName};
echo MyEnum::{$memberName}->value;طريقة جديدة: getBytesFromString()
يمكننا القول أن هذه الطريقة كانت الأكثر غير متوقعة بين الميزات المضافة في PHP 8.3: إنشاء نص عشوائي باستخدام مجموعة من الأحرف المعتمدة مسبقًا.
هذه الطريقة الجديدة بسيطة وواضحة للغاية. نعطي بعض الأحرف للطريقة كموارد ونحدد عدد الأحرف التي نريد استخدامها. هذا كل شيء! الآن ستعيد طريقتنا النتائج بأحرف عشوائية حتى تصل إلى الطول المحدد. الآن دعونا نوضح هذا بمثال
$generateRandomString = new Random\Randomizer();
$allowedChars = 'ABCDEFGHJKMNPQRSTVWXYZ';
$generateRandomString->getBytesFromString($allowedChars, 6) // "MBDSFD" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 6) // "DJSDKA" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 4) // "SDLA" - rastgele gelen veriمن الممكن أن يكون الإخراج أطول من إجمالي طول الأحرف التي حددناها. لقد فعلنا ذلك في المثال أدناه:
$generateRandomString = new Random\Randomizer();
$allowedChars = '123456';
$generateRandomString->getBytesFromString($allowedChars, 8) // "47384252" - rastgele gelen veriإذا كانت جميع الأحرف التي نعطيها كمعلمات مختلفة، فإن احتمال اختيار أي منها يكون متساويًا. ومع ذلك، يمكننا إظهار المزيد من نفس الحرف في المخرجات عن طريق إضافة أكثر من حرف واحد إلى قائمة الأحرف المدعومة لدينا. وقد أظهرنا ذلك في المثال التالي.
$generateRandomString = new Random\Randomizer();
$allowedChars = 'AAAAA12345';
$generateRandomString->getBytesFromString($allowedChars, 5) // "4AA12" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 8) // "38A19AA5" - rastgele gelen veriطرق جديدة: getFloat() و nextFloat()
في هذا الابتكار، يقدم PHP 8.3 طريقتين جديدتين تعملان على توسيع الامتداد العشوائي لـ PHP: getFloat() وnextFloat().
مثال على هذه الأساليب:
$generateRandomNumber = new Random\Randomizer();
// Rastgele ondalıklı (float) bir rakam oluştur
// Değer 0 ile 5 arasında olsun
$generateRandomNumber->getFloat(0,5); // 2.483929 - rastgele gelen veri
// 0 ile 1 arasında rastgele ondalıklı bir rakam oluştur
$generateRandomNumber->nextFloat(); // 0.4828258 rastgele gelen veriالابتكارات والتحسينات الطفيفة في PHP 8.3
بالإضافة إلى الابتكارات المذكورة أعلاه، يحتوي PHP 8.3 على العشرات من التحسينات والابتكارات الصغيرة الأخرى. لقد قمنا بإدراجها مع وثائقها المصدرية في القائمة أدناه.
- طرق جديدة لفئة DOMElement:
DOMElement::getAttributeNames(),DOMElement::insertAdjacentElement(),DOMElement::insertAdjacentText(),DOMElement::toggleAttribute(),DOMNode::contains(),DOMNode::getRootNode(),DOMNode::isEqualNode()DOMNameSpaceNode::يحتوي على () وMParentNode::replaceChildren(). - طرق جديدة لفئة IntlCalendar:
IntlCalendar::setDate(),IntlCalendar::setDateTime(),IntlGregorianCalendar::createFromDate()وIntlGregorianCalendar::createFromDateTime(). - وظائف LDAP الجديدة: ldap_connect_wallet() وldap_exop_sync().
- جديد
mb_str_pad()وظيفة سلسلة متعددة البايت (وظيفة سلسلة متعددة البايت). - وظائف POSIX الجديدة:
posix_sysconf(),posix_pathconf(),posix_fpathconf()وposix_eaccess(). - طريقة جديدة:
ReflectionMethod::createFromMethodName() - وظيفة المقبس الجديدة:
socket_atmark(). - وظائف السلسلة (النص) الجديدة:
str_increment(),str_decrement()، وstream_context_set_options(). - طريقة فئة ZipArchive الجديدة:
ZipArchive::getArchiveFlag(). - إعداد php.ini الجديد لتعيين الحد الأقصى لحجم المكدس المسموح به:
zend.max_allowed_stack_size.
تم إهماله في PHP 8.3
مع كل إصدار جديد من PHP، يتم وضع علامة على بعض التعليمات البرمجية للإهمال. لا يُنصح مطلقًا باستخدام هذه الميزات بمجرد إهمالها تمامًا. إذا تم استخدام التعليمات البرمجية المهملة، فسيتم إرجاع رسالة خطأ عند تنفيذ التعليمات البرمجية.
قائمة الإهمال في PHP 8.3:
- لقد تم إهمال الثابت U_MULTIPLE_DECIMAL_SEPARATORS.
- Mt19937
3MT_RAND_PHPلقد تم إهمال البديل. ReflectionClass::getStaticProperties()لم يعد من الممكن أن تكون فارغة.- إعدادات PHP.ini
assert.active,assert.bail,assert.callback,assert.exceptionوassert.warningتم إهماله. get_class()وget_parent_class()تم إهماله.
PHP 8.3
استعرضنا في هذه المقالة التغييرات والابتكارات المهمة في PHP 8.3. للحصول على قائمة أكثر تفصيلاً بجميع التغييرات في PHP 8.3 سجل التغيير الرسمي ننصحك بمراجعته. إذا كنت تريد ترقية أكوادك أو موقعك من PHP 8.2 إلى PHP 8.3، فقد يكون هذا الدليل مفيدًا: PHP 8.3 Migration Guide -> https://www.php.net/manual/en/migration83.php
إذا كنت قلقًا بشأن إصدارات PHP والترحيل، فنوصي بإعطاء الإصدار الجديد بعض الوقت للترقية إلى PHP 8.3.
تغطية كاملة للغات PHP و JavaScript والتقنيات ذات الصلة مثل Onur Özden Web Çözümleri برامج الويب نحن نقدم الخدمات. إذا كان لديك سؤال أو طلب، يمكنك الاتصال بنا بسرعة عبر زر Whatsapp في أسفل اليسار للحصول على عرض أسعار.



