كيف تتخلص من إشعار PHP هنا؟ [مغلق
سؤال
function t1()
{
echo 1;
}
function t2()
{
echo 2;
}
$funcs = array(t1,t2);
$length = count($funcs);
for($i=0;$i<$length;$i++)
{
$funcs[$i]();
}
عندما أقوم بتنفيذ ملف PHP Tiny:
إشعار PHP: استخدام T1 ثابت غير محدد T1 - المفترض "T1" في D: jobirn test str.php على الخط 11
إشعار PHP: استخدام T2 ثابت غير محدد T2 - المفترض 'T2' في D: jobirn test str.php على الخط 11
كيف يمكنني التخلص من تلك الإشعارات؟ 12.
المحلول
تحصل على إشعار لأن PHP لا يعالج الوظائف ككائنات من الدرجة الأولى. عند القيام بذلك
$functions = array(t1, t2);
يرى محرك PHP T1، و T2، وحاول حله كمستمر، لأنه لا يمكن العثور على ثابت باسم T1 / T2، فإنه "يفترض" أنك تريد كتابة صفيف ('T1' و 'T2')؛ إذا قمت بعمل Var_Dump (وظائف $)، فيمكنك أن ترى أن العناصر الموجودة في الصفيف هي سلاسل.
عند محاولة استدعاء سلسلة كدالة، مثل
$functions[0]()
ستبحث PHP عن وظيفة بنفس الاسم كسلسلة. لن أتصل بهذا باستخدام سلسلة كمؤشر دالة، فهذا هو أشبه باستخدام الانعكاس. PHP يدعوها "وظائف متغيرة"، انظر:
http://hu2.php.net/manual/en/functions.variable-functions.php.
لذلك، الطريقة الصحيحة للتخلص من الإشعارات هي:
$functions = array('t1', 't2');
حول لماذا لا
't1'();
لا يعمل؟ لسوء الحظ، لا توجد إجابة. إنه PHP، هناك عدد جيد من هذه المزعجة كما quirks الجحيم. انها نفس Quirk كما:
explode(':', 'one:two:three')[0];
Parse error: syntax error, unexpected '[' in php shell code on line 1
يحرر:
يتوفر بناء الجملة المرجعية المذكورة أعلاه في PHP5.4، فهو يسمى صفيف dereferencing.
نصائح أخرى
$funcs = array('t1','t2');
دون دون تهليل، ولكن هذا هو كيف يعمل
تتمثل جولة العمل في هذه المشكلة في تغيير إعدادات PHP.INI من
error_reporting = E_ALL
ل
error_reporting = E_ALL & ~E_NOTICE
تحقق من وظيفة Error_Reporting ()
http://us2.php.net/manual/en/function.error-reporting.php.
يتيح لك تكوين مستوى الأخطاء، يتم عرض الإشعارات والتحذيرات.
على سبيل المثال، إذا كنت تريد أخطاء وتحذيرات ولا إشعارات:
error_reporting (e_error | e_warning)؛
يستخدم إعلانات السلسلة إذا كنت تقصد السلاسل:
$funcs = array('t1','t2');
انظر أيضا الفصل على وظائف variable في دليل PHP.
لاستخدام سلاسل لاستدعاء وظيفة، يجب عليك استخدام الأقواس المجعد
'hello'() // wont work
$hello = 'hello'; $hello() // will work
تحرير يبدو {''} () لا يعمل. أتذكر أنه اعتاد أن>.