PHP / ZEND يشكو من المتغيرات غير المحددة
-
13-09-2019 - |
سؤال
الوضع:
index.php:
<?php
include("foo.php");
include("baz.php");
foo("bar.php");
?>
baz.php:
<?php
$x = 42;
?>
foo.php:
<?php
function foo($p) {
include_once($p); // please dont mind the inclusion hole
}
?>
bar.php:
<?php
echo $x;
?>
zend. تنويه: متغير غير محدد: X
وضع $ X. في Bar.php يزيل الإشعار، لكنني أفهم لماذا هناك إشعار حول هذا في المقام الأول .. لا يشمل الكثير من العمل مثل رؤوس C؟ هذا يعني أن القانون المفسر يبدو أن هذا:
<?php
function foo($p) {
include_once($p); // please dont mind the inclusion hole
}
$x = 42;
// this however, is included by a function...
// does the function's scope influence the stuff it includes?
echo $x; // undefined variable
?>
محرر الخاص بي هو حزمة الكسوف / zend.
المحلول
أنا لا خبير، لذا يرجى عدم الشعور لي إذا كنت مخطئا، لكنني أعتقد أن الملف الذي تم استدعاؤه بواسطة fines_once أو contect_once يسمى في سياق المتصل. نظرا لأن وظيفة FOO () لن تعرف حوالي X، فلن يتضمن أي من يسمى. يمكنك تجربة "إعلان" X Data Inside Function FOO () مع نفس الإعداد على النحو الوارد أعلاه.
نصائح أخرى
أحصل على مجموعة من تلك الإشعارات لأنني دائما ما يذهب تقريبا إلى "$ o. = 'foo'" دون أي تعريف. أنا فقط أخطرهم مع error_reporting (e_all ^ e_notice)، لكنني لا أعرف ما إذا كانت الطريقة المثلى في هذه الحالة.
لا يعمل حتى إذا كان المتغير والوظيفة في نفس الملف.
1 <?php
2
3 $x = 3;
4
5 function t()
6 {
7 echo $x;
8 }
9
10 t();
يطبع لا شيء.
ولكن أضف عالميا
1 <?php
2
3 $x = 3;
4
5 function t()
6 {
7 global $x;
8 echo $x;
9 }
10
11 t();
ويمكنك أن ترى "3".
في وظيفة لا يمكنك رؤية المتغيرات العالمية إلا إذا أعلنت ذلك.
نعم انها نطاق الوظيفة التي تسبب مشاكلك
إذا استبدلت
foo("bar.php");
مع
include("bar.php");
سترى أن كل شيء يعمل بشكل جيد لأنه يضعه في النطاق الحالي وليس نطاق الوظائف