关于php析构函数__destruct()的问题
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()的问题的更多相关文章
- php部分---面向对象:定义、实例化、构造函数、析构函数;
类 − 定义了一件事物的抽象特点.类的定义包含了数据的形式以及对数据的操作. 对象 − 是类的实例.一切皆对象.由类实例化出来的. 成员变量 − 定义在类内部的变量.该变量的值对外是不可见的,但是可以 ...
- php魔术方法——构造函数和析构函数
php有一类很神奇的方法,这些方法是保留方法,通常不会在外部被显式调用,他们使用双下划线(__)开头,他们被称为魔术方法(Magic Methods).php官方也不建议定义其他双下划线开头的方法. ...
- php 析构函数,构造函数
php 析构函数,构造函数 <?php /** * 测试使用的PHP操作类 * Date: 2017/7/13 * Time: 14:22 */class Test{ /** 姓名 */ p ...
- php面向对象之构造函数和析构函数
php面向对象之构造函数和析构函数 简介 php面向对象支持两种形式的构造函数和析构函数,一种是和类同名的构造函数(php5.5之前),一类是魔术方法(php5.5之后).与类名相同的构造函数优先级比 ...
- PHP 构造函数和析构函数
构造函数 __construct ([ mixed $args [, $... ]] ) : void PHP 5 允行开发者在一个类中定义一个方法作为构造函数.具有构造函数的类会在每次创建新对象时先 ...
- PHP面向对象学习-属性 类常量 类的自动加载 构造函数和析构函数 访问控制(可见性)
在类的成员方法里面,可以用 ->(对象运算符):$this->property(其中 property 是该属性名)这种方式来访问非静态属性.静态属性则是用 ::(双冒号):self::$ ...
- 构造函数 析构函数的区别与联系 C#
构造函数 __construct:是在对象被创建是自动调用的方法,用来完成初始化操作 构造函数有以下特点:1.构造函数的名字必须与类名相同:2.构造函数可以有任意类型的参数,但不能具有返回类型:3.定 ...
- web进阶之jQuery操作DOM元素&&MySQL记录操作&&PHP面向对象学习笔记
hi 保持学习数量和质量 1.jQuery操作DOM元素 ----使用attr()方法控制元素的属性 attr()方法的作用是设置或者返回元素的属性,其中attr(属性名)格式是获取元素属性名的值,a ...
- 面向对象的PHP
类的实例(包括继承) <?php // 父类 class Animal { public $name; public $age; // 构造函数,使用new操作符生成实例的时候自动调用 func ...
随机推荐
- ThinPHP第二十八天(F函数和file_put_contents区别|PHP生成PHP文件,Kindeditor编辑器使用方法)
1.F(name,data,path)函数和file_put_contents(file,str)区别 F函数直接生成<?php ?>格式的php文件了,将data加入到<?php和 ...
- MYSQL 退出的三个方式
方式1: exit 方式2: quit 方式3: \q
- ie7(z-index)
父级元素加上position:relative;并设置z-index. 父级元素的z-index优先,子元素的z-index是相对于父级元素的index. <div style="po ...
- 转: html5 history api详解~很好的文章
从Ajax翻页的问题说起 请想象你正在看一个视频下面的评论,在翻到十几页的时候,你发现一个写得稍长,但非常有趣的评论.正当你想要停下滚轮细看的时候,手残按到了F5.然后,页面刷新了,评论又回到了第一页 ...
- 转: requestAnimationFrame,Web中写动画的另一种选择
HTML5/CSS3时代,我们要在web里做动画选择其实已经很多了: 你可以用CSS3的animattion+keyframes; 你也可以用css3的transition; 你还可以用通过在canv ...
- Http请求 post get
package com.sprucetec.tms.utils; import org.slf4j.Logger;import org.slf4j.LoggerFactory; import java ...
- 恢复sudo的权限的命令
出错的原因:不小心给了/etc/的所有文件的777属性,出现了sudo 的错误. 1.pkexec chmod 0440 /etc/sudoers 2.pkexec chmod 0440 /etc/s ...
- 【hadoop】14、hadoop2.5的mapreduce的 配置
配置mapreduce <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href ...
- 史上最简单的Hibernate入门简单介绍
事实上Hibernate本身是个独立的框架,它不须要不论什么web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了非常多非Hibernate ...
- [学习笔记]HTML5之canvas
虐了一下午的canvas 先撸了一个七巧板 <!doctype html> <html> <head> <meta charset="utf-8&q ...