2009-07-20 129 views
0

Im新的MVC和我重新做了很多我的代碼。require_once問題與模板

我有master.php(指數),其中有:

<?php require_once("header.php"); ?> 

兩個master.phpheader.php是在同一文件夾但我得到以下錯誤:

Warning: require_once(1) [function.require-once]: failed to open stream: No such file or directory in /Users/MyName/Sites/MySite/Views/master.php on line 15

Fatal error: require_once() [function.require]: Failed opening required '1' (include_path='.:') in /Users/MyName/Sites/MySite/Views/master.php on line 15

這並沒有發生之前。 (文件全部在根文件夾中)。我沒有看到問題出在哪裏,因爲它們在同一個文件夾中 - 我不必返回'../'或引用任何其他文件夾。我在這裏錯過了什麼?

謝謝。

+1

從它沒有錯誤看起來像試圖要求「header.php」它看起來像它試圖要求「1」。你真的在第15行顯示的是哪一行?它可能會幫助你,如果你張貼更多的代碼 – Cfreak 2009-07-20 14:37:54

+0

是的,它是第15行的確切代碼:<?php require_once(「header.php」)或die; ?> – asdfasdfasdfasdf 2009-07-20 14:47:50

回答

5

在您的評論你說你的代碼是:

<?php require_once("header.php") or die; ?> 

請儘量留出了「或死「 - > IST是沒有必要的,因爲如果沒有找到該文件,require_once會觸發致命錯誤。

編輯: 我測試了它,省去了「或死」,它會工作。

編輯2:解釋爲什麼會這樣: 上面的代碼也可以這樣寫:

require_once (("header.php") or die()); 

因爲require_once不是一個函數,但是在PHP的聲明中,括號是可選的,PHP解釋上面是一個布爾表達式,其中字符串「header.php」被賦值爲布爾值「true」。 True被轉換爲一個字符串(導致「1」),並且該字符串被傳遞回來以便需要一次。

所以上面的代碼被解釋爲

require_once("1") 

這裏是如何它被解釋一步一步:

(("header.php") or die()) = (TRUE or die()) 
(TRUE or die()) = TRUE 
(string) TRUE = '1'; 

希望這有助於;)

1

PHP開始在根文件夾中尋找'header.php',並且找不到它。如果是在同一目錄作爲當前的腳本,你倒是應該使用魔術常量__DIR__

<?php require_once __DIR__ . '/header.php'; ?> 
+0

由於header.php和master.php都在同一個目錄中,並且包含路徑有'。'在這裏,這不應該是必需的。 – MitMaro 2009-07-20 14:46:36

+0

當前目錄(include_path =。)是腳本被調用的路徑,而不是目錄,腳本所在。 – soulmerge 2009-07-20 14:48:52

1

這可能是因爲master.php被列入或另一個腳本文件,它是不是在同一個目錄中所需 as header.php。也就是說,當你訪問索引時,你知道哪個文件被調用/解析嗎?

看看在documentationinclude(),這也適用於require()

Files for including are first looked for in each include_path entry relative to the current working directory, and then in the directory of current script. E.g. if your include_path is libraries, current working directory is /www/, you included include/a.php and there is include "b.php" in that file, b.php is first looked in /www/libraries/ and then in /www/include/

更新

爲了解決一些評論:我並沒有說包括()將改變CWD。我在說,如果CWD不是master/header.php所在的那個,那可能是問題所在。

例如,假設您在與master.phpheader.php不同的文件夾中有index.php;它包含或要求master.php使用正確的路徑。現在,master.php具有聲明:

<?php require_once("header.php"); ?> 

然而,在這一點上CWD 不含header.php,因爲CWD是,index.php

要解決此問題,需要使用當前腳本的CWD到header.php的正確路徑調用require_once,而不是從master.php開始的路徑。

0

你需要有15行,因爲這:

<?php (require_once("header.php")) or die(); ?> 

但是從何時起頭。PHP是沒有找到需要是致命的,那麼你應該有:

<?php (include_once("header.php")) or die(); ?> 

<?php require_once("header.php"); ?>