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

 

转载于:https://www.cnblogs.com/zhongyinghe/p/5944343.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在ThinkPHP控制器的析构函数中传递参数给Service的析构函数,可以通过以下步骤实现: 1. 在控制器的构造函数中实例化Service,并将需要传递的参数传递给Service的构造函数。例如: ```php class IndexController extends Controller { protected $userService; public function __construct(UserService $userService) { $this->userService = $userService; } // 省略其他方法 } ``` 2. 在控制器的析构函数中,调用Service的析构函数,并将需要传递的参数传递给它。例如: ```php class IndexController extends Controller { protected $userService; public function __construct(UserService $userService) { $this->userService = $userService; } public function __destruct() { $this->userService->__destruct($param1, $param2); } // 省略其他方法 } ``` 3. 在Service的构造函数中,接收控制器传递的参数,并保存到成员变量中。例如: ```php class UserService { protected $param1; protected $param2; public function __construct($param1, $param2) { $this->param1 = $param1; $this->param2 = $param2; } // 省略其他方法 } ``` 4. 在Service的析构函数中,可以使用控制器传递的参数进行一些清理工作。例如: ```php class UserService { protected $param1; protected $param2; public function __construct($param1, $param2) { $this->param1 = $param1; $this->param2 = $param2; } public function __destruct() { // 清理工作,使用 $this->param1 和 $this->param2 } // 省略其他方法 } ``` 通过以上步骤,就可以在控制器的析构函数中传递参数给Service的析构函数了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值