PHP / Zend tanımlanmamış değişkenler hakkında şikayet

4 Cevap php

Durum:

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 notice: Tanımlanmamış değişken: x

Global $ x yerleştirilmesi; bar.php de haber kaldırır, ancak bu konuda bir haber var ilk etapta neden anlıyorum .. C başlıklar dahil gibi oldukça fazla çalışması sayılabilir değil mi? Bu yorumlanmış kod bu gibi görünür olacağı anlamına gelir:

<?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
?>

Benim editör Eclipse / Zend paketidir.

4 Cevap

Ben uzman değilim, bu yüzden yanılıyorsam beni alev etmeyiniz, ama ben include_once veya Require_oncenin tarafından çağrılan dosya arayanın bağlamında denir düşünüyorum. Function foo () yaklaşık $ x bilmiyorum çünkü daha sonra kendi adı verilen herhangi birini içeren vermeyecek. Yukarıdaki gibi aynı kurulumu ile) (function foo içinde $ x 'ilan' ile deneme.

Neredeyse daima birlikte gider olduğumdan beri ben bu bildirimlerin bir demet olsun "$ o. = 'Foo'" herhangi bir tanım yoktur. Ben sadece error_reporting (E_ALL ^ ​​E_NOTICE) ile onları saklıyorum, ancak bu durumda en iyi yol olmadığını bilmiyorum.

Değişken ve fonksiyon aynı dosyada bile bu işe yaramazsa.

  1 <?php
  2
  3 $x = 3;
  4
  5 function t()
  6 {
  7   echo $x;
  8 }
  9
 10 t();

Baskılar şey.

Ama küresel eklemek

  1 <?php
  2
  3 $x = 3;
  4
  5 function t()
  6 {
  7   global $x;
  8   echo $x;
  9 }
 10
 11 t();

ve "3" görebilirsiniz.

Bunu beyan sürece bir fonksiyonu olarak global değişkenler göremiyorum.

evet onun kendi sorunlarına neden olup fonksiyon kapsamı

Eğer değiştirirseniz

foo("bar.php");

ile

include("bar.php");

Eğer fonksiyonlar kapsamı geçerli kapsamı içine koyar ve çünkü her şey iyi çalıştığını göreceksiniz