1、背景:在一次输出错误信息,引入Componets\下的ErrorCode的类文件报错,报错的信息是该类找不到;然而那个类文件明明存在的阿,怎么会报错呢?

2、解决过程:看类加载器如何加载该类。通过框架的入口文件,一步步地找到加载类,看到类加载器中输出的类名路径是正确的(相对路径),而加载类是仍然不存在,并且使用了file_exists函数判断该文件,发现该文件也不存在,这样自己百思不得其解。

过段时间,感觉任何在__destruct()函数创建对象是否都会报错呢?于是实验,感觉果真如此,自己以为找到原因了。但是为什么在__destruct函数创建对象会报错呢?难道真的不能够在__destruct()中创建函数吗?感觉这个理论不太成立。于是进行了这样的实验:

 <?php
class Img{
public function info(){
echo 'I am a Img Class!';
}
} class Test{
public function __construct(){ } public function info(){
echo 'I am a Test Class!';
} public function __destruct(){
$img = new Img();
$img->info();
}
} $test = new Test();
$test->info();

创建对象成功,那么说明__destruct()函数是可以创建对象的。那么是否是__destruct()函数不能够引入文件,于是

分两个文件

一个是Img.class.php文件

 <?php
class Img{
public function info(){
echo 'I am a Img Class!';
}
}

另一个是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文件的代码这样:

 <?php
class Test{
public function __construct(){ } public function info(){
echo 'I am a Test Class!';
echo '<br>';
echo getcwd();
} public function __destruct(){
//require './Img.class.php';
require "D:\\wamp\\www\\img\\Img.class.php";
$img = new Img();
$img->info();
echo '<br>';
echo getcwd();
}
} $test = new Test();
$test->info();

关于php析构函数__destruct()的问题的更多相关文章

  1. php部分---面向对象:定义、实例化、构造函数、析构函数;

    类 − 定义了一件事物的抽象特点.类的定义包含了数据的形式以及对数据的操作. 对象 − 是类的实例.一切皆对象.由类实例化出来的. 成员变量 − 定义在类内部的变量.该变量的值对外是不可见的,但是可以 ...

  2. php魔术方法——构造函数和析构函数

    php有一类很神奇的方法,这些方法是保留方法,通常不会在外部被显式调用,他们使用双下划线(__)开头,他们被称为魔术方法(Magic Methods).php官方也不建议定义其他双下划线开头的方法. ...

  3. php 析构函数,构造函数

    php 析构函数,构造函数   <?php /** * 测试使用的PHP操作类 * Date: 2017/7/13 * Time: 14:22 */class Test{ /** 姓名 */ p ...

  4. php面向对象之构造函数和析构函数

    php面向对象之构造函数和析构函数 简介 php面向对象支持两种形式的构造函数和析构函数,一种是和类同名的构造函数(php5.5之前),一类是魔术方法(php5.5之后).与类名相同的构造函数优先级比 ...

  5. PHP 构造函数和析构函数

    构造函数 __construct ([ mixed $args [, $... ]] ) : void PHP 5 允行开发者在一个类中定义一个方法作为构造函数.具有构造函数的类会在每次创建新对象时先 ...

  6. PHP面向对象学习-属性 类常量 类的自动加载 构造函数和析构函数 访问控制(可见性)

    在类的成员方法里面,可以用 ->(对象运算符):$this->property(其中 property 是该属性名)这种方式来访问非静态属性.静态属性则是用 ::(双冒号):self::$ ...

  7. 构造函数 析构函数的区别与联系 C#

    构造函数 __construct:是在对象被创建是自动调用的方法,用来完成初始化操作 构造函数有以下特点:1.构造函数的名字必须与类名相同:2.构造函数可以有任意类型的参数,但不能具有返回类型:3.定 ...

  8. web进阶之jQuery操作DOM元素&&MySQL记录操作&&PHP面向对象学习笔记

    hi 保持学习数量和质量 1.jQuery操作DOM元素 ----使用attr()方法控制元素的属性 attr()方法的作用是设置或者返回元素的属性,其中attr(属性名)格式是获取元素属性名的值,a ...

  9. 面向对象的PHP

    类的实例(包括继承) <?php // 父类 class Animal { public $name; public $age; // 构造函数,使用new操作符生成实例的时候自动调用 func ...

随机推荐

  1. Codeigniter使用phpexcel

    1. 去 http://phpexcel.codeplex.com/ 下载phpexcel源码,解压缩后把phpexcel/Classes里的PHPExcel文件夹和PHPExcel.php复制到CI ...

  2. Core第三方开源Web框架

    NET Core第三方开源Web框架YOYOFx   YOYOFx框架 YOYOFx是一个轻量级用于构建基于 HTTP 的 Web 服务,基于 .NET 和 Mono 平台. 本着学习的态度,造了这个 ...

  3. 转: html5 history api详解~很好的文章

    从Ajax翻页的问题说起 请想象你正在看一个视频下面的评论,在翻到十几页的时候,你发现一个写得稍长,但非常有趣的评论.正当你想要停下滚轮细看的时候,手残按到了F5.然后,页面刷新了,评论又回到了第一页 ...

  4. adb server is out of date. killing... ADB server didn't ACK * failed to star

    The connection to adb is down, and a severe error has occured. [-- :: - HelloOPone] You must restart ...

  5. C++使用OLE高速读写EXCEL的源码

    我的代码参考的地方是这儿,再次感谢原作者 http://blog.csdn.net/gyssoft/archive/2007/04/29/1592104.aspx 我根据自己的需要做了整理,干净了一点 ...

  6. Mysql 学习记录

    ( xampp 的mysql 与 直接用 dnf 安装的 mysql 有冲突! ) 1. 数据库基本知识: 一张表的行 又称为 记录 一张表的列 又称为 字段 表结构:所有字段,规定了你的每一条记录所 ...

  7. BZOJ 无数据题集合

    题目 http://www.lydsy.com/JudgeOnline/problem.php?id=1142 http://www.lydsy.com/JudgeOnline/problem.php ...

  8. python 命令行参数,以及文件操作

    #demo.py #!/usr/bin/python import sys print sys.argv #python demo.py 11 22 33 44 55 ['demo.py', '11' ...

  9. NHibernate初入门之配置文件属性说明(四)

    一.NHibernate配置所支持的属性 属性名 用途 dialect 设置NHibernate的Dialect类名 - 允许NHibernate针对特定的关系数据库生成优化的SQL 可用值: ful ...

  10. git版本工具(团队开发常用)

    1.创建一个版本库 mkdir repository    //创建一个文件夹 git init        //把目录编程git可以管理的仓库 2.提交文件到版本库 git add test.tx ...