1、背景:在一次輸出錯誤信息,引入Componets\下的ErrorCode的類文件報錯,報錯的信息是該類找不到;然而那個類文件明明存在的阿,怎么會報錯呢?
2、解決過程:看類加載器如何加載該類。通過框架的入口文件,一步步地找到加載類,看到類加載器中輸出的類名路徑是正確的(相對路徑),而加載類是仍然不存在,並且使用了file_exists函數判斷該文件,發現該文件也不存在,這樣自己百思不得其解。
過段時間,感覺任何在__destruct()函數創建對象是否都會報錯呢?於是實驗,感覺果真如此,自己以為找到原因了。但是為什么在__destruct函數創建對象會報錯呢?難道真的不能夠在__destruct()中創建函數嗎?感覺這個理論不太成立。於是進行了這樣的實驗:
1 <?php 2 class Img{ 3 public function info(){ 4 echo 'I am a Img Class!'; 5 } 6 } 7 8 class Test{ 9 public function __construct(){ 10 11 } 12 13 public function info(){ 14 echo 'I am a Test Class!'; 15 } 16 17 public function __destruct(){ 18 $img = new Img(); 19 $img->info(); 20 } 21 } 22 23 $test = new Test(); 24 $test->info();
創建對象成功,那么說明__destruct()函數是可以創建對象的。那么是否是__destruct()函數不能夠引入文件,於是
分兩個文件
一個是Img.class.php文件
1 <?php 2 class Img{ 3 public function info(){ 4 echo 'I am a Img Class!'; 5 } 6 }
另一個是test.php文件
<?php class Test{ public function __construct(){ } public function info(){ echo 'I am a Test Class!'; } public function __destruct(){ require './Img.class.php'; $img = new Img(); $img->info(); } } $test = new Test(); $test->info();
結果果真如此,在__destruct()函數中引入類文件是不行的。那么為什么如此呢?
參考這篇文章:http://tieba.baidu.com/p/4529490669
原來__destruct()函數調用時目錄已經發生變化,所以造成加載不了類文件。
要解決的方法是:使用絕對路徑就可以了。
test.php文件的代碼這樣:
1 <?php 2 class Test{ 3 public function __construct(){ 4 5 } 6 7 public function info(){ 8 echo 'I am a Test Class!'; 9 echo '<br>'; 10 echo getcwd(); 11 } 12 13 public function __destruct(){ 14 //require './Img.class.php'; 15 require "D:\\wamp\\www\\img\\Img.class.php"; 16 $img = new Img(); 17 $img->info(); 18 echo '<br>'; 19 echo getcwd(); 20 } 21 } 22 23 $test = new Test(); 24 $test->info();