关于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()的问题的主要内容,如果未能解决你的问题,请参考以下文章