مساحات الأسماء
أكبر تغيير في PHP 5.3 هو بلا شك مساحات الأسماء (كانت هناك أسئلة شائعة حول مساحات أسماء PHP من قبل). وهذا يجلب العديد من الفوائد لمطوري PHP، كما تم أيضًا حل مشكلة تسمية الوظائف التي تم انتقادها على نطاق واسع.
الكود أكثر وضوحا
يتطلب الكود الشائع قبل الإصدار 5.3 بادئة مخصصة للتمييز بين أسماء الوظائف والفئات
النص العادي
:
الوظيفة MY_wrapper() {}
فئة MY_DB { }
تعريف('MY_CONN_STR', '');
MY_wrapper();
جديد MY_DB();
MY_CONN_STR;
بعد استخدام مساحات الأسماء، تبدو التعليمات البرمجية أكثر نظافة.
رمزنص عادي
:
مساحة الاسم MY؛
غلاف الوظيفة () {}
فئة قاعدة البيانات { }
const CONN_STR = '';
استخدم MY AS MY؛
إزار()؛
قاعدة بيانات جديدة();
CONN_STR;
مساحات أسماء متعددة محددة في ملف واحد
ما الذي يجب فعله إذا تم تعريف مساحات أسماء متعددة في ملف؟
رمز
نص عادي
:مساحة الاسم LIB؛
فئة MySQL {}
فئة سكليتي {}
$b = جديد SQLite();
مساحة الاسم LIB_EXTRA؛
فئة MScrypt {}
$a = new MScrypt();
var_dump(
get_class($a),
get_class($ب)
);
إخراج الكود أعلاه هو:
نص عادي
:
string(18)"LIB_EXTRA::MScrypt"
سلسلة (11)"LIB::SQLite"
PHP هي لغة للتفسير والتنفيذ، والنتائج المذكورة أعلاه معقولة.
أولوية مساحة الاسم
الوظائف والفئات والثوابت المحددة في مساحة الاسم لها الأولوية، تليها الثوابت العامة.
رمز
نص عادي
:namespace foo;
دالة strlen($foo) {إرجاع htmlentities($foo });
صدى strlen("اختبار");
صدى ::strlen("اختبار");
مساحة اسم الصدى::strlen("اختبار");
الصداقة بين مساحة الاسم والتحميل التلقائي
سيقوم التحميل التلقائي بتحليل موقع ملف الفئة بناءً على اسم مساحة الاسم واسم الفئة. سيتم تشغيل التحميل التلقائي فقط عندما لا يتم العثور على تعريف الفئة في مساحة الاسم ولن يتم استدعاء __autoload المحدد في مساحة الاسم تلقائيًا.
نص عادي
شفرة:
function __autoload($var) { var_dump($var } // LIB::foo
تتطلب "./ns.php"؛
<?php
مساحة الاسم LIB؛
جديد فو();
*/
مساحة الاسم بعض الملحقات
رمز
نص عادي
:مساحة الاسم حقًا::long::pointless::verbose::ns;
__NAMESPACE__; // ثابت سحري جديد يمثل اسم مساحة الاسم الحالية
فئة أ {}
get_class(new a()); // حقا::long::pointless::verbose::ns::a
use حقا::long::pointless::verbose::ns::a AS b;// قم بالإشارة إلى فئة من مساحة الاسم ملاحظة: المحتوى هنا مقتبس من pdfIntroduction إلى PHP 5.3 Slides ولن يتم تكراره لاحقًا.
تحسينات في الأداء
تحسن الأداء العام لـ php 5.3 بنسبة 5-15%
وأصبح md5() أسرع بنسبة 10-15%
تنفيذ مكدس أفضل في المحرك
انتقلت الثوابت إلى ذاكرة القراءة فقط
تحسين عملية معالجة الاستثناءات (التبسيط، عدد أقل من أكواد التشغيل)
(تتطلب/تشمل) _ بمجرد التحسين، قم بإزالة التكرارات المفتوحة
حجم ثنائي أصغر وحجم بدء التشغيل مع gcc4
ميزة اللغة الجديدة__DIR__
قبل الإصدار 5.3، من أجل الحصول على دليل البرنامج النصي الحالي، كان استدعاء الوظيفة مطلوبًا
: PLAIN TEXT
CODE:
echo dirname(__FILE__); // < PHP 5.3
في الإصدار 5.3، هناك حاجة إلى ثابت سحري واحد فقط __DIR__.
رمز
نص عادي
:echo __DIR__; // >= PHP 5.3
?:Operator يمكن للمشغل ?:المريح الحصول بسرعة على قيمة غير فارغة من قيمتين/تعبيرات.
رمز
نص عادي
:$a = true ?: false // true;
$a = خطأ؟: صحيح // صحيح
$a = "" ?: 1;
$a = 0 ?: 2;
$a = array() ?: array(1); // array(1);
$a = strlen("") ?: strlen("a"); // 1
__callStatic()
تمت إضافة طريقة سحرية جديدة __callStatic، وظيفتها مشابهة لـ __call، ولكنها صالحة فقط للطرق الثابتة.
نص عادي
:
مساعد الفئة {
وظيفة ثابتة __callStatic($name, $args) {
echo $name.'('.implode(',', $args).')';
}
}
مساعد::test("foo"،"bar")؛
استدعاء طريقة ثابتة ديناميكيًا استدعاء طريقة ثابتة؟ الجمع بين الحركة والسكون.
نص عادي
:
مساعد الفئة {
وظيفة ثابتة foo() { echo __METHOD__ };
}
$a = "المساعد";
$b = "فو";
$a::$b(); // helper::foo
الربط الثابت المتأخر
لا أعرف كيفية ترجمته، ربما يكون من الأسهل فهمه إذا تركت النص الأصلي. لقد تغير توقيت معالجة الأحداث للطرق الثابتة، حيث كان يتم معالجتها أثناء التجميع، ولكن تتم معالجتها الآن أثناء التنفيذ.
قبل PHP 5.3، كانت الشيفرة التالية تُخرج الحرف A، لكن هذا ليس ما نريده. لقد تمت إعادة تعريف طريقة whoami في الفئة B. وينبغي أن تُخرج الحرف B ليتوافق مع ما نعتبره أمرًا مفروغًا منه.
رمزنص عادي
:
الفئة أ {
وظيفة ثابتة عامة whoami() {
صدى __CLASS__;
}
هوية الوظيفة الثابتة العامة () {
الذات::whoami();
}
}
الفئة ب تمتد أ {
وظيفة ثابتة عامة whoami() {
صدى __CLASS__;
}
}
B::identity(); // أ <-- PHP <5.3
يستخدم التعليمة البرمجية التالية static::whoami() لاستدعاء الأساليب الثابتة. بعد PHP 5.3، وبما أن __CLASS__ تتم معالجته أثناء التنفيذ، يمكن اكتشاف الفئة B بنجاح في هذا المثال.
نص عادي
:
الفئة أ {
وظيفة ثابتة عامة whoami() {
صدى __CLASS__;
}
هوية الوظيفة الثابتة العامة () {
ثابت::whoami();
}
}
الفئة ب تمتد أ {
وظيفة ثابتة عامة whoami() {
صدى __CLASS__;
}
}
B::identity(); // B <-->= PHP 5.3
com.mysqlnd
تأكد من أن mysqlnd أصبح برنامج تشغيل mysql الافتراضي في PHP 5.3
، ولكن PDO_MySQL لا يدعم mysqlnd بعد. في الوقت الحالي، يمكن فقط لامتداد mysql(i) استخدام
الميزات الجديدة لـ PHP 5.3 التي تم تقديمها من قبل، والتي تعد جميعها ملائمة للمطورين. إليك ميزة يحبها مقدمو استضافة الويب كثيرًا.
تعزيز دعم ملف ini
يدعم CGI/FastCGI تكوين INI المشابه لـ .htaccess. يمكن أن يحتوي كل دليل على إعدادات INI. يعتمد اسم ملف ini على تكوين php.ini، ولكن [PATH=/var/www/domain.com]، [HOST=www. لا يمكن للمستخدم تعديل إعدادات قسم .domain.com.
معالجة محسنة للأخطاء
يُسمح بتحديد المتغيرات والثوابت في ملفات ini ويمكن استدعاؤها مباشرة في البرنامج.
مرفق مثال لملف ini.
نصي عادي
:
# اسم ملف php.ini المحدد من قبل المستخدم (.htaccess). الاسم الافتراضي هو ".user.ini".
user_ini.filename = ".user.ini"
#إذا كنت تريد تعطيل هذه الميزة، فاضبطها على قيمة فارغة.
user_ini.filename=
# طول ملف php.ini المحدد من قبل المستخدم TTL (مدة البقاء)، الوحدة هي ثوانٍ، وأنا أفهمها على أنها وقت انتهاء صلاحية ذاكرة التخزين المؤقت. الافتراضي هو 300 ثانية
user_ini.cache_ttl=300
[PATH=/var/www/domain.com]
variables_order = GPC
الوضع الآمن =1
[المتغيرات الخاصة بي]
سوميفار = "1234"
elsevar = ${somevar}; Anothervar == somevar
[صفائف ini]
فو[شريط]=1
فو[123]=2
فو[]=3