关于php析构函数__destruct()的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于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();

 

以上是关于关于php析构函数__destruct()的问题的主要内容,如果未能解决你的问题,请参考以下文章

php中的构造函数与析构函数(魔术方法)

试图分析 php 脚本但析构函数是模糊的

在__destruct析构函数里操作文件出现的问题

php析构方法关于栈的问题

php析构函数小结

PHP面向对象——构造函数析构函数