سؤال

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

تحرير يبدو {''} () لا يعمل. أتذكر أنه اعتاد أن>.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top