سؤال

الوضع:

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");

سترى أن كل شيء يعمل بشكل جيد لأنه يضعه في النطاق الحالي وليس نطاق الوظائف

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