php析构方法
⑴ php中的__destruct()析构函数是一个空方法,还是会执行什么功能
同其他语言中的析构函数功能差不多,PHP中析构函数也是执行一些清理工作(如果非要加入其它的一些事情,那就另说了),其实PHP在脚本执行结束后就会销毁一切能够销毁的东西,不会浪费一丁点资源,没有析构的话也没什么关系了。但是,在脚本执行中,我们也会执行一些命令,让某些对象生命结束,如果没有析构,就只能由垃圾收集机制来运行了,这就浪费了一些资源。由此,显式析构的作用就出来了。
⑵ php5的构造函数和析构函数有哪些
构造函数:void __construct ([ mixed $args [, $... ]] )
PHP5允许开发人员为类定义构造函数。包含构造函数的类在创建实例时将自动调用其构造函数,所以构造函数适合完成初始化对象的操作。
注意:如果子类定义了构造函数,那么父类的构造函数将不会被自动的隐式的调用。如果需要运行父类的构造函数,需要执行parent::__construct()。如果子类没有显式的定义构造函数,那么子类将继承父类的构造函数,并直接运行。 析构函数:
PHP5引入了析构函数的概念,类似于C++等面向对象语言中的析构函数的概念。析构函数在类实例的引用失效时、对象被销毁、超出作用域、以及任意关闭序列时,将被调用。 注意:类似构造函数,当子类定义了自己的析构函数,需要使用parent::__destruct()来调用父类的析构函数。
⑶ PHP5,声明构造函数使用什么关键字,析构函数使用什么关键字
PHP还是比较常用的,于是我研究了一下PHP构造函数,在这里拿出来和大家分享一下,希望对大家有用。如果你在一个类中声明一个函数,命名为__construct,这个函数将被当成是一个构造函数并在建立一个对象实例时被执行.清楚地说,__是两个下划线.就像其它任何函数一样,构造函数可能有参数或者默认值.你可以定义一个类来建立一个对象并将其属性全放在一个语句(statement)中.
你也可以定义一个名为__destruct的函数,PHP将在对象被销毁前调用这个函数.它称为析构函数.继承是类的一个强大功能.一个类(子类/派生类)可以继承另一类(父类/基类)的功能.派生类将包含有基类的所有属性和方法,并可以在派生类中加上其他属性和方法.你也可以覆写基类的方法和属性.就像3.1.2中显示的,你可以用extends关键字来继承一个类.
你可能想知道构造函数是如何被继承的.当它们和其它方法一起被继承时,他们不会在创建对象时被执行.如果你需要这个功能,你需要用第二章提到的::运算符.它允许你指向一块命名空间.parent指向父类命名空间,你可以用parent::__construct来调用父类的构造函数.
一些面向对象语言在类之后命名构造函数.PHP的前几个版本也是如此,到现在这种方法仍然有效.也就是:如果你把一个类命名为Animal并且在其中建立一个命名也是Animal的方法,则这个方法就是构造函数.如果一个类的同时拥有__construt构造函数和与类名相同的函数,PHP将把__construct看作构造函数.这使得用以前的PHP版本所写的类仍然可以使用.但新的脚本(PHP5)应当使用__construct.
PHP的这种新的声明构造函数的方法可以使构造函数有一个独一无二的名称,无论它所在的类的名称是什么.这样你在改变类的名称时,就不需要改变构造函数的名称.你可能在PHP中给构造函数一个像其它类方法一样的访问方式.访问方式将会影响从一定范围内实例化对象的能力.这允许实现一些固定的设计模式,如Singleton模式.析构函数,相反于构造函数.PHP调用它们来将一个对象从内存中销毁.默认地,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源.析构函数允许你在使用一个对象之后执行任意代码来清除内存.
当PHP决定你的脚本不再与对象相关时,析构函数将被调用.在一个函数的命名空间内,这会发生在函数return的时候.对于全局变量,这发生于脚本结束的时候.如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值.通常将变量赋值勤为NULL或者调用unset.
下面的例子中,计算从类中实例化的对象的个数.Counter类从PHP构造函数开始增值,在析构函数减值.一旦你定义了一个类,你可以用new来建立一个这个类的实例.类的定义是设计图,实例则是放在装配线上的元件.New需要类的名称,并返回该类的一个实例.如果PHP构造函数需要参数,你应当在new后输入参数.
<?phpclassCounter { privatestatic$count=0; function__construct() { self::$count++; } function__destruct() { self::$count--; } functiongetCount() { returnself::$count; } } //建立第一个实例 $c=newCounter();//输出1 print($c->getCount()."<br>n"); //建立第二个实例 $c2=newCounter(); //输出2 print($c->getCount()."<br>n"); //销毁实例 $c2=NULL; //输出1 print($c->getCount()."<br>n");?>
与构造函数相反,在PHP5中,可以定义一个名为__destruct()的函数,称之为PHP5析构函数,PHP将在对象在内存中被销毁前调用析构函数,使对象在彻底消失之前完成一些工作。对象在销毁一般可以通过赋值为null实现。
⑷ php析构函数什么时候调用
在下边3种情况时被调用:
对象生命周期结束,被销毁时;
主动调用delete ;
对象i是对象o的成员,o的析构函数被调用时,对象i的析构函数也被调用。
⑸ 关于php析构函数__destruct()的问题。
析构函数是在对象销毁时调用的代码。
当这个对象用完之后,会自动执行这个函数中的语句。
把数据库关闭的代码放在这里。就是在对象被销毁的时候顺便把数据库连接关闭了。
⑹ php: 到底什么是析构函数,举个简单例子加以说明!什么时候会用到
和
构造函数
是一对
析构函数
:
对象销毁(或者注销)的时候执行
比如定义了一个class
a
如果
令$a=NULL;则析构函数执行。
⑺ PHP构造方法和析构方法
什么是构造方法
构造方法是类的一种特殊的方法,它的主要作用是完成对新对象初始化.
特点:
1. 没有返回值.
2. 在创建一个新的对象时,系统会自动调用该类的构造方法完成对新对角的初始化.
语法:
php5: 修饰符 function __construct()
{
//code
}
php4: 修饰符 function 类名()
{
//code
}
注意:
1. php5里对两者都支持,如果两种构造方法同时存在的话,优先选择第一种.
2. 一个类里面默认有一个不带参数为空的构造方法,一旦自定义了一个构造方法,就会覆盖默认的构造方法.
所以说一个类有且只有一个构造方法.
3.一个类只能有一个构造方法.(不能重载)
4.构造方法默认的访问修饰符为public.
二.this关键字
this代表当前对象.可以理解为:谁调用它,它就代表谁.
注意事项:
this不在类定义的使用,只能在类定义的方法中使用.
三.实例
复制代码 代码如下:
<?php
header("Conter-Type:text/html;charset=utf-8");
class Person
{
public $name; //成员变量
public $age;
// function __construct()
//{
// echo "不带参数的构造方法";
//}
function __construct($name,$age)
{
$this -> name = $name;
$this -> age = $age;
echo "带参数的构造方法"."<br />";
}
//成员方法
function view()
{
//this的引用.
echo "姓名:".$this ->name.", 年龄:".$this ->age;
}
}
//new一个新的对象
//$p = new Person();
$p2 = new Person("李四",13);
$p2 ->view();
?>
结果如下:
带参数的构造方法
复制代码 代码如下:
<SPAN style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; FONT: 14px 微软雅黑; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: #ff00ff; WORD-SPACING: 0px" color="#ff00ff"> 姓名:李四, 年龄:13</SPAN>
四:析构方法:
析构方法是PHP5引入的新概念.主要作用:释放资源(比如:释放数据库链接,图片资源...).
语法:
function __destruct(){}
特点:
1.析构方法没有返回值.
2.主要作用是释放资源.并不是销毁对象本身.
3.在销毁对象前,系统自动调用该类的析构方法.
4.一个类最多只有一个析构方法.
五:例子:
复制代码 代码如下:
<?php
header("Conter-Type:text/html;charset=utf-8");
class Person
{
public $name;
public $age;
//构造方法
function __construct($name,$age)
{
$this ->name = $name;
$this ->age = $age;
}
//析构方法
function __destruct()
{
echo "姓名:".$this->name.", 年龄".$this->age."-->销毁<br />";
}
}
$p1= new Person("小一",18);
$p2= new Person("小二",17);
?>
结果:
姓名:小二, 年龄17-->销毁
姓名:小一, 年龄18-->销毁
分析结论:
1.析构方法会自动调用.
2.析构方法调用的顺序是先创建的对象后被销毁.
3.当一个对象没有引用,被垃圾回收机制确认为垃圾时,调用析构方法.
⑻ php析构函数的用法
class
x
{
function
__construct()
{
$this->file
=
fopen('path',
'a');
}
function
__destruct()
{
fclose($this->file);
}
}
简单的说,
析构函数
是用来在
对象
关闭时完成的特殊工作,比如我写的上例,在
实例化
同时打开某文件,但是它
什么时候
关闭呢,用完就关闭呗,所以析构函数直接关闭它,
又或者在析构时,我们将处理好的某些数据一并写进数据库,这时可以考虑使用析构函数内完成,在析构完成前,这些
对象属性
仍然存在,并且仅用于内部访问,所以可以放心的做与对象有关的任何善后工作
析构函数并不是为了把对象自身的
内存
释放,而是当用户需要额外释放某些内存时用它来指导php需要释放的内存
在哪里
,最后php在析构时使用
⑼ PHP类的构造方法
构造方法是类中的一个特殊方法。当使用 new 操作符创建一个类的实例时,构造方法将会自动调用,其名称必须是 __construct() 。所以通常用它执行一些有用的初始化任务。该方法无返回值。
如果子类中定义了构造函数则不会暗中调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。
与构造方法对应的就是析构方法,析构方法会在某个对象的所有引用都被删除或者当对象被显式销毁之前执行的一些操作或者功能。析构函数不能带有任何参数,其名称必须是 __destruct() 。
同样,如果子类中定义了析构函数则不会暗中调用其父类的析构函数。要执行父类的析构函数,需要在子类的析构函数中调用 parent::__destruct()。
注意:在析构函数中抛出一个异常会导致致命错误。
<?php
class Construct{
protected $a;
protected $b;
function __construct($a,$b){ //定义构造函数
$this->a=$a;
$this->b=$b;
}
function __destruct(){ //重新定义为初始值
$result=0;
echo '恢复乘积的初始值:'.$result;
}
}
class son extends construct{
private $c;
function __construct($c){
parent::__construct(6,10); //调用父类的构造方法,使用方法:parent::__construct(); 有参数加参数
$this->c=$c;
}
function show(){
$result=$this->a*$this->b*$this->c;
print 'abc的乘积是:'.$result.' ';
}
function __destruct(){
parent::__destruct(); //调用父类的析构函数,使用方式:parent::__destruct();
}
}
$test=new son(12); //实例化对象
$test->show(); //abc的乘积是:720 恢复乘积的初始值:0
?>
⑽ php。已经修炼成大虾的助我一臂之力,不知道为什么需要析构函数
析构在php中一般作用还不是很大。
析构函数里,一般是啥都不写----对于PHP,析构函数都是不用写的。
因为当你的一个脚本页面关闭即卸载的时候,所有的资源就已经自动回收了。----这种回收机制在PHP以前的版本就已经实现了。
就个人的感觉之所以加如析构函数,很有点符合OOP的标准的感觉。
当然PHP里的析构也不是一无是处。如果同楼上说的,你也可以添加你需要执行的代码(函数,类啥的)在里面。当这个析构被执行的时候,就会调用你所添加的代码。
比如:一个登录类,登录完成的时候,可以在析构里写入日志记录的功能。
最后一个问题,其实前面也回答了。不用这个对象,就在你的脚本结束的时候
:假设你的一个文件a.php里只有一个类class a。当你在浏览器里关闭了a.php的浏览之后,class a的资源就自动回收了。