2011-05-20 129 views
6

我已閱讀了很多很多線程,但仍無法將其包裹在頭。PHP 5 - 不包含類或函數的包含文件的變量範圍

這裏是我的基本問題:

header.php包括一個名爲navigation.php文件。在navigation.php之內,$previous$next被定義。使用echo語句我已經驗證它們有值。

接下來,header.php包含一個名爲backnext.php的文件。我需要backnext.php瞭解$previous$next的值。如果我在backnext.php的頂部聲明它們爲global,我不會收到錯誤,但echo聲明顯示它們是空的。如果我沒有,我會得到一個undefined variable錯誤。

在哪裏我需要聲明它們爲globalbacknext.php能夠正確讀取它們的值?

這些文件都沒有使用函數或類。

+0

是navigation.php肯定包含在backnext之前? – Fosco 2011-05-20 15:38:00

+0

你可以在代碼塊中顯示它正好放在哪個oder(在header.php中)我知道你解釋了它,但它更容易以可視化的方式 – Neal 2011-05-20 15:38:27

+0

@Fosco - 是的。 @Neal - 我試圖避免張貼超過300行代碼,但我同意你的看法,可以給它的濃縮版一展身手: 'code' 的header.php: ... 包括」 ../ ../includes/navigation.php'; //第一個回顯前一個 echo $ previous; ... echo'

'; // include '../../includes/leftnavbar/backnext.php'; echo '
'; //第二回波以前 回聲$以前 ... navigation.php ... $以前= $ M [ 「$ P」]; ... backnext.php ... // 3rd echo previous echo「previous is $ previous」; ... 'code' 1st說index.php,2nd說index.php,3rd說以前是沒有價值的。 – user762985 2011-05-20 16:02:46

回答

8

如果這些文件都不具備功能或類別,則$prev$next位於全局範圍內,並且應該被所有包含文件看到,並且不應使用global關鍵字。

聽起來像你包括的順序可能有點不對。

更新:

如果我理解正確的話,你有這樣的事情:

header.php:

<?php 
echo "In header.php\n"; 

require_once("navigation.php"); 
require_once("backnext.php"); 

echo "Also seen in header.php:\n"; 
echo "prev=$prev\n"; 
echo "next=$next\n"; 
?> 

navigation.php:

<?php 
echo "In navigation.php\n"; 
$prev = "Hello World#1"; 
$next = "Hello World#2"; 
echo "Exiting navigation.php\n"; 
?> 

backnext.php:

<?php 
echo "In backnext.php\n"; 
echo "prev=$prev\n"; 
echo "next=$next\n"; 
echo "Exiting backnext.php\n"; 
?> 

如果我運行此我得到:

 
In header.php 
In navigation.php 
Exiting navigation.php 
In backnext.php 
prev=Hello World#1 
next=Hello World#2 
Exiting backnext.php 
Also seen in header.ph 
prev=Hello World#1 
next=Hello World#2 

backnext.php能夠同時看到$prev$next

+0

@watcher - 我可以直接在之前和之後回覆$ previous和$ next,之後我加入了backnext.php,所以不,他們沒有被消滅。我無法迴應他們的唯一時間是在該文件中。 – user762985 2011-05-20 15:52:31

1

我想你可能有一個邏輯錯誤,其中變量的內容被抹去,或者@Kev指出執行流程是錯誤的。下面是一些測試代碼:

文件:test.php的

<?php 
    $test = "Hi!"; 
    require_once 'test2.php'; 
    require_once 'test3.php'; 
?> 

文件:test2.php

<?php 
    echo("Test 2: " . $test . "<br/>"); 
?> 

文件:TEST3。PHP

<?php 
    echo("Test 3: " . $test . "<br/>"); 
?> 

這將產生輸出:

Test 2: Hi! 
Test 3: Hi! 

這證明可變$test全局範圍的,並且應提供給任何腳本它被定義之後。

PS-不要依賴的SO用戶提供參考材料。直行到源:Variable Scope - PHP Manual該網頁上第一段讀取:

變量的範圍即它被定義上下文 。對於 大部分所有PHP變量只有一個範圍 。這個單一的範圍 跨度包括和需要的文件爲 以及。

編輯

header.php試試這個,看看會發生什麼:

<?php 
    include 'navigation.php'; 
    echo($previous . " ; " . $next . "<br/>"); 
    include 'backnext.php'; 
    echo($previous . " ; " . $next . "<br/>"); 
?> 

如果你沒有得到相同的輸出兩次,然後有一個問題在backnext.php其中的變量正在被擦拭。如果它確實產生相同的輸出,那麼將backnext.php內部的回波移到頂部和底部。從邏輯上講,它不是實際上移動他們,但你可以不斷移動它們越來越近,直到你找到問題的地方。

+0

@Kev - 我同意。他們應該。不過,這個順序正如我上面所述。 – user762985 2011-05-20 15:50:53

+0

好的,我明白了......但我不明白。當我發佈上面的代碼時,我將使用BASE_URL的路徑從絕對路徑更改爲相對的backnext.php,因爲它在那裏,現在它可以工作。因爲它絕對包括文件,所以我很困惑爲什麼絕對/相對路徑導致這個問題? – user762985 2011-05-20 16:14:27