首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PHP奇怪的行为: ReflectionClass::isCloneable()调用析构函数?

PHP奇怪的行为: ReflectionClass::isCloneable()调用析构函数?

ReflectionClass::isCloneable()是PHP反射类库中的一个方法,用于判断一个类是否可以被克隆。在调用该方法时,如果被检测的类实现了__destruct()析构函数,会导致该析构函数被调用。

析构函数是在对象被销毁时自动调用的方法,用于执行一些清理操作。通常情况下,析构函数会在对象被销毁时自动触发,而不需要手动调用。

然而,在ReflectionClass::isCloneable()方法中,如果被检测的类实现了析构函数,会导致该析构函数被调用。这个行为可能会让人感到奇怪,因为通常情况下,我们不希望在判断一个类是否可以被克隆时触发其析构函数。

这个行为可能是PHP反射类库的一个设计决策,但具体原因需要进一步查阅官方文档或源代码来确认。在使用ReflectionClass::isCloneable()方法时,需要注意这个奇怪的行为,以免对代码逻辑产生意外影响。

关于ReflectionClass::isCloneable()方法的更多信息,可以参考腾讯云的PHP文档中的相关介绍:ReflectionClass::isCloneable()

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java中函数”——finalize() 对象消亡时调用

这些特性之一就是函数。取代使用函数,Java 支持finalize() 方法。   在本文中,我们将描述 finalize() 与 C++ 函数区别。...因为这一双重支持,C++ 也提供了自动构造和,这导致了对构造函数函数调用,(对于堆对象)就是内存分配和释放。   在 Java 中,所有对象都驻留在堆内存,因此局部对象就不存在。...结果,Java 设计者觉得不需要函数(象 C++ 中所实现)。   取而代之,Java 定义了一个特殊方法叫做finalize() ,它提供了 C++ 函数一些功能。...Java中是没有函数。C++函数是在对象消亡时运行。由于C++没有垃圾回收,对象空间手动回收,所以一旦对象用不到时,程序员就应当把它delete()掉。...所以函数中经常做一些文件保存之类收尾工作。

2.8K10

C++ 构造函数函数调用函数注意事项

同样,在函数调用函数函数入口地址也是在编译时静态决定。也就是说,实现是实调用而非虚调用。 考察如下例子。...b退出作用域时,会先调用类B函数,然后调用类A函数,在函数~A()中,调用了虚函数show()。...从输出结果来看,类A函数对show()调用并没有发生虚调用。...从概念上说,函数是用来销毁一个对象,在销毁一个对象时,先调用该对象所属类函数,然后再调用其基类函数,所以,在调用基类函数时,派生类对象“善后”工作已经完成了,这个时候再调用在派生类中定义函数版本已经没有意义了...因此,一般情况下,应该避免在构造函数函数调用函数,如果一定要这样做,程序猿必须清楚,对虚函数调用其实是实调用

91310

PHP函数destruct与垃圾回收机制讲解

函数 当某个对象成为垃圾或者当对象被显式销毁时执行。 PHP5中提供函数是__destruct,其与构造方法__construct相对应。...__destruct() 函数,是在垃圾对象被回收时执行。 函数是由系统自动调用,也可以被显式调用,但不要这样去做。 如下面程序所示,程序结束前,所有对象被销毁。函数调用了。 <?...程序运行结果: 函数现在执行了 0 1 2 3 4 上面的例子中,我们将p设置为空或者赋予p一个字符串,这样 php unset变量 <?...($p1); // 现在没有指向对象变量了,函数在这里执行了 ?...0 1 2 3 4 现在再把 $p1 也销毁掉,即已经没有指向对象变量了 函数现在执行了 unset 销毁是指向对象变量,而不是这个对象。

68930

构造函数以及函数PHP中需要注意地方

构造函数以及函数PHP中需要注意地方 基本上所有的编程语言在类中都会有构造函数函数概念。...:构造函数调用,$d // ----- // A:函数调用,$d // C:函数调用,$c // A:函数调用,$b // B:函数调用,$b // A:函数调用,$a...,也就是说顺序不一定固定 函数引用问题 当对象中包含自身相互引用时,想要通过设置为NULL或者unset()来调用函数可能会出现问题。...()注释,函数执行顺序是: // 使用gc回收后结果 // E:函数调用,e1 // ----- // E:函数调用,e2 // ----- // E destory // E:函数调用...,e3 // ----- // E:函数调用,e4 // ----- 可以看出,必须要让php使用gc回收一次,确定对象引用都被释放了之后,类函数才会被执行。

1.6K20

【C++】继承 ⑧ ( 继承 + 组合 模式类对象 构造函数函数 调用规则 )

一、继承 + 组合 模式类对象 构造函数函数调用规则 1、场景说明 如果一个类 既 继承了 基类 , 又 在类中 维护了一个 其它类型 成员变量 , 那么 该类 构造 与 , 就需要涉及到...类 本身 构造函数函数 , 父类 构造函数函数 , 类 成员变量 构造函数函数 ; 2、调用规则 在 继承 + 组合 情况下 , 构造函数函数 调用规则如下...自身定义 构造函数 ; 函数 : 自身 -> 成员 -> 父类 ; 首先 , 调用 自己 函数 ; 自身定义 函数 ; 然后 , 调用 成员 函数 ; 也就是 成员变量 类型..., 涉及到 父类构造/函数 , 自身构造/函数 , 成员变量 构造/函数 调用顺序 ; 构造函数调用顺序 : 父类 -> 成员 -> 自身 ; 函数调用顺序 : 自身 -> 成员...; 然后分析 函数 调用顺序 ; C 函数 , 是 自身构造函数 ; D 函数 , 是 成员构造函数 ; A 和 B 函数 , 是 父类构造函数 ; 函数调用顺序为 : 自身

15710

Qt窗口关闭和应用程序停止是否调用函数一些说明

---- 在main,栈上面创建一个窗口A,关闭窗口A时,会调用函数。 如果在这个窗口A构造函数中再创建一个窗口B,并且在A函数中对B进行释放。...第一种形式: MainWindow * b = new MainWindow(); 当关闭窗口A,再关闭窗口B时,创建B函数调用,窗口A函数调用 (这种关闭方式有明显的卡顿,当关闭A,按照规则...,窗口A函数调用 (这种关闭方式无卡顿,实际上是B窗口被隐藏,并未主动执行,而在A函数中被动执行,这也是为什么关闭B时,显示并未调用B,而关闭A时,才显示调用B原因) 我们给窗口...把窗口A中关于窗口B释放代码去掉,显示调用了窗口B函数调用窗口A函数,但是没有出现异常(存在卡顿,多次运行,发现还会存在A不执行问题(打印语句并未被打印在控制台))。...,再在窗口A中再次释放B会报异常,把A中函数释放B代码再次注释,运行,显示依次调用了窗口B函数,窗口A函数(无卡顿)。

2.3K10

c++学习笔记4,调用派生类顺序构造和函数(一个)

大家好,又见面了,我是全栈君 测试源代码: //測试派生类构造函数调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include using namespace...a3也并没有调用基类构造函数"<<endl; A *a3=&a; B b; } 输出为: 能够看到,在创建派生类对象时候,首先调用是基类中构造函数,然后才是调用派生类自己构造函数...而在时候,顺序则刚好相反,先调用派生类函数,然后才是调用基类构造函数。这是由于对象创建时候对象存放在堆栈中原因。(new 对象尽管是存在堆中,可是在堆栈中依旧存放其堆中地址,因此。...时候也是一样) 那么,创建其对象数组时:A a[2],是否会调用其构造函数呢。这是肯定。...顺序似乎弄错了,郁闷。 还没收到面试信息。也还没有受到笔试挂了通知,也不知道是个什么情况啊。 保持。 有时,细节很重要!

67210

【C++】匿名对象 ③ ( 函数返回值为对象值时 匿名对象 拷贝构造函数函数 调用情况分析 )

逐条分析 构造函数 / 拷贝构造函数 / 函数 调用过程 : 调用带参数构造函数 m_age = 12 这是在 fun 函数中 , 调用 有参构造函数 , 创建 普通对象 ; 调用拷贝构造函数 这是在...执行结果如下 : 调用带参数构造函数 m_age = 18 调用带参数构造函数 m_age = 12 调用拷贝构造函数 调用函数 : m_age = 12 调用函数 : m_age = 12...逐条分析 构造函数 / 拷贝构造函数 / 函数 调用过程 : 调用带参数构造函数 m_age = 18 这是在 main 函数中 , 调用 有参构造函数 , 创建 普通对象 ; 调用带参数构造函数...匿名对象 ; 调用函数 : m_age = 12 这是 fun 函数执行完毕 , 在函数作用域中 普通对象 需要被销毁 ; 调用函数 : m_age = 12 这是在 main 函数中..."); return 0; } 执行结果 : 调用带参数构造函数 m_age = 18 调用带参数构造函数 m_age = 12 调用拷贝构造函数 调用函数 : m_age = 12 调用函数

23420

C++编程经验(3):别让异常逃离虚构函数!!!

C++并不禁止函数吐出异常,但它不鼓励你这样做。这是有理由。...但是呢,如果在过程中,有个异常被抛出,那后面还没被Widget怎么办? 好,继续。再被抛出异常,这也不是什么很奇怪事情,有一就有二嘛。...---- 以下情况一直存在于我自己代码中:将close函数置于函数中,并祈求不会出现问题(其实有时候我自己也不知道是不是真的被close了)。...只要调用成功,那就万事大吉、 但是如果该调用导致异常,那函数就会传播该异常,造成难以预料问题。...但是“不明确行为”也不是什么好事儿。 所以,就做一个接口,给客户端自行去调用关闭函数吧。 记住,函数一定不要吐出异常!!! 实在没办法,那咱也要像个硬汉,吞下去!!!

27620

c 线程安全单例模式-C++单例模式(线程安全、内存释放)

更严重问题是,该实例函数什么时候执行?   如果在类行为中有必须操作,比如关闭文件,释放外部资源,那么上面的代码无法实现这个要求。我们需要一种方法,正常删除该实例。   ...我们知道,程序在结束时候,系统会自动所有的全局变量。事实上,系统也会所有的类静态成员变量,就像这些静态成员也是全局变量一样。...利用这个特征,我们可以在单例类中定义一个这样静态成员变量,而它唯一工作就是在函数中删除单例类实例。...CSingleton::m_pInstance; } } Static CGabor Garbo; //定义一个静态成员,程序结束时,系统会自动调用函数 }; `   ...程序运行结束时,系统会调用静态成员Garbo函数,该函数会删除单例唯一实例。

1.7K20

PHP学习记录之面向对象(Object-oriented programming,OOP)基础【类、对象、继承等】

函数函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在函数调用完毕),系统自动执行函数。...函数往往用来做”清理善后” 工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在函数中用delete释放)。...getTitle(); $cuijinpeng- getTitle(); $google- getTitle(); $luyaran- getUrl(); $cuijinpeng- getUrl(); 完事来看函数...(destructor),它与构造函数相反,当对象结束其生命周期时(例如对象所在函数调用完毕),系统自动执行函数。...PHP 5 引入了函数概念,这类似于其它面向对象语言,其语法格式如下: void __destruct ( void ) 来看实例: <?

1.4K41

通俗易懂PHP基础【9-类和对象(1)】

4 构造函数使用 对类体进行一些初始化操作有两种方法。 第一种方法是在类中我们自定义初始化。 第二种方法就是使用PHP已经在类中定义函数。...第二种方法:使用函数 <?...__construct() 是PHP中构造函数统一命名,它会在类被实例化成(new xx())对象时自动被调用。 从上面两种方法对比,通过构造函数来初始化。...,当对类实例化出对象进行初始化时,就位函数指定了参数。 注:构造函数是在对类体进行实例化时自动调用。 5 函数使用使用函数 与构造函数对应函数。...函数是在销毁类之前执行,并统一命名__destruct(),其作用是在类被销毁前自动完成某项功能。

42710

php学习之类与对象构造方法使用技巧

构造方法默认使用修饰符是public 方法: 在php5中引入了函数,类似于面向对象语言,函数会在某个对象所有引用都被删除或当对象被显式销毁时执行 分析: 在php中引入一个技术 某个对象所有引用都被删除...函数没有形参 函数是系统调用 函数在以下情况会被调用 php文件执行完毕 某个对象所有引用都被删除后,就会马上调用函数 作用: 函数作用就是释放对象创建资源,如:数据库连接...函数小结: 当没有变量指向某个对象时,这个对象就会被销毁 在销毁对象前,函数会被调用 函数不是销毁对象本身,而是在销毁对象前给程序员一次机会,可以让程序员去及时回收该对象创建资源,比如数据库连接...函数最佳实战: 使用函数完成对资源及时释放 ?...,我们可以使用函数,显式销毁对象时,在函数中释放资源 垃圾回收机制 在php中,当一个对象没有任何引用指向它时候,就会成为一个垃圾对象,php将启用垃圾回收器将对象销毁 当程序退出前,php也将启用垃圾回收器

57520

php面试中关于面向对象相关问题

多态性语言具有灵活、抽象、行为共享、代码共享优势,很好地解决了应用程序函数同名问题。 三、什么是构造函数函数?...2.函数 函数是在PHP5引入,它作用与调用时机和构造函数刚好相反,它在对象被销毁时自动执行。...函数__destruct()结构形式如下: function __destruct(){ /* 类初始化代码*/ } 需要注意是,函数是由系统自动调用,因此,它不需要参数。...与构造函数类似,如果想在子类中调用父类函数,那么需要显式地调用:parent::__destruct()。如果子类没有定义函数,那么它会继承父类函数。...当对象不再被引用时,将调用函数。如果要明确地销毁一个对象,那么可以给指向对象变量不分配任何值,通常将变量赋值为NULL或者用unset()函数。示例代码如下: <?

1.7K20

PHP面向对象程序设计之构造方法和方法详解

本文实例讲述了PHP面向对象程序设计之构造方法和方法。分享给大家供大家参考,具体如下: 构造方法和方法是对象中两个特殊方法,它们都与对象生命周期有关。...构造方法是对象创建完成后第一个被对象自动调用方法,这是我们在对象中使用构造方法原因。而方法是对象在销毁之前最后一个被对象自动调用方法,这也是我们在对象中使用方法原因。...($name); // 调用Animal构造函数 Birds::__construct($name,$leg); // 调用Birds构造函数 } 2.函数 方法允许在销毁一个对象之前执行一些特定操作...方法声明格式如下: function __deconstruct(){ //方法体,通常用来完成一些在对象销毁前清理任务 } 在以下几种情况下可能会调用函数(但不一定): PHP页面加载完毕之后...但因为对象引用都是放在栈内存中,由于栈后进先出特点,最后创建对象会被最先释放,多以先自动调用第三个对象方法,最后才调用第二个对象方法。

75330
领券