關於php析構函數__destruct()的問題


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();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM