談到了使用require_once 仍然告訴說類被重定義的問題,于是想起了前幾天自己遇到的現(xiàn)象,在這里和大家說一下,今天才想起調(diào)查具體原因,如果大家不說的話就快忘了,看來自己凡事果然不經(jīng)大腦,大腦的二級(jí)緩存,及內(nèi)存,甚至是硬盤都小的可憐。
假設(shè)有如下三個(gè)文件,c.php a.php b.php 對(duì)應(yīng)的存放目錄為:localhost/localhost/ localhost/demo
b.php的內(nèi)容比較有意思,因?yàn)樗约阂^承 CLASS A 所以自己把a(bǔ).php也引入進(jìn)去了,代碼如下:
執(zhí)行l(wèi)ocalhost/c.php 系統(tǒng)報(bào)錯(cuò),報(bào)錯(cuò)信息如下
Warning: require_once(../a.php) [function.require-once]: failed to open stream: No such file or directory in F:wwwdemob.php on line 2
Fatal error: require_once() [function.require]: Failed opening required '../a.php' (include_path='.;C:php5pear') in F:wwwdemob.php on line 2但是,驚奇的發(fā)現(xiàn),如果去掉b.php里面的require_once語句,執(zhí)行正常,那么一定是require_once語句定義多了嗎?原因就是Class A重定義了兩次?可是不會(huì)啊。如果我只在c.php里面加require_once(‘a.php’);這條語句,哪怕我寫兩遍也是沒錯(cuò)的,那到底是咋回事呢?
原因就是,b.php定義的目錄和c.php執(zhí)行文件的目錄層級(jí)不一致,導(dǎo)致在c.php里面require_once語句有兩條。使其相當(dāng)于
原因找到了,因?yàn)樵赾.php里面,其相對(duì)目錄 “..”就是 c.php的上一層了,導(dǎo)致文件找不到報(bào)錯(cuò)。
所以,我們的結(jié)論是,在 PHP 里面,使用require_once的時(shí)候,存在不同層級(jí)關(guān)系,且有相對(duì)目錄的使用那么一定要謹(jǐn)慎,小心。