PHP面向对象——构造函数、析构函数
在PHP中构造函数和析构函数是固定的,如下:

// 构造函数
function __construct([argument1,argument2,...,argumentN]){
/* Class initialization code */
} // 析构函数
function __destruct(){
// ...
}

构造函数
- 构造函数可以接受参数,能够在创建对象时赋值给对象属性
- 构造函数可以调用类方法或其他函数
- 构造函数可以调用其他类的构造函数
构造函数使用例子:

<?php
class Person{
private $name;
private $age;
private $gender; public function __construct($name,$age,$gender){
$this->setName($name);
$this->setAge($age);
$this->setGender($gender);
} public function setName($name){
$this->name = $name;
} // ... getter setter 方法 } $peron = new Person("lee",18,'男'); ?>

调用父类构造函数、调用无关类的构造函数:
function __construct(){
parent::__construct(); // 调用父类的构造函数必须显示的使用parent调用父类构造函数
classname::__construct(); // 调用其他类的构造函数,classname是类名
//其他操作
}
继承和构造函数
PHP中的子类的构造函数不会主动调用父类的构造函数,要显示的使用parent::__construct()调用:

<?php
class Animal{
private $name;
function __construct($name){
$this->setName($name)
echo "动物类被创建!";
}
// ... 其他方法 } class Birds extends Animal{
private $name;
private $leg;
function __construct($name,$leg){
parent::__construct($name); // 显示调用
$this->setLeg($leg);
echo "鸟类被创建!";
}
// ... 其他方法
}
?>

如果涉及多层继承,当调用parent::__construct()时,会沿着父类向上搜索,直到找到最合适的构造函数,例如:

// 接上例 class Parrot extends Birds{
private $name;
private $leg;
private $wing;
function __construct($name){
parent::__construct($name); // 此时没有找到父类(Birds类)合适的构造函数,只能向上搜索,搜索到Animal类时,才找到合适的构造函数
echo "鹦鹉类被创建!";
$this->smackTalk();
/*
输出结果:
"动物类被创建!"
"鹦鹉说话!"
*/
}
function smackTalk(){
echo "鹦鹉说话!";
} }

如果想要依次调用几个父类的构造函数,可以使用类名直接调用构造函数,例如:
function __construct($name,$leg){
Animal::__construct($name); // 调用Animal构造函数
Birds::__construct($name,$leg); // 调用Birds构造函数
}
PHP是不支持函数的重载,所有构造函数同样不能有多个。
析构函数
- 析构函数是在销毁对象时,自动调用,不能显示的调用。
- 析构函数不能带参数。
在以下几种情况下可能会调用析构函数(但不一定):
- PHP页面加载完毕之后;
- unset()类;
- 变量引用指向别的对象或值时;
PHP的内存回收机制和JAVA的很类似,对没有任何引用的对象进行销毁回收,采用引用计数器的技术。
例子:

<?php
class test{
function __destruct(){
echo "当对象销毁时会调用!!!";
} }
$a = $b = $c = new test(); $a = null;
unset($b); echo "<hr />"; ?>

此例子,如下图,有三个变量引用$a,$b,$c指向test对象,test对象就有3个引用计数,当$a = null时,$a对test对象的引用丢失,计数-1,变为2,当$b被unset()时,$b对test对象的引用也丢失了,计数再-1,变为1,最后页面加载完毕,$c指向test对象的引用自动被释放,此时计数再-1,变为0,test对象已没有变量引用,就会被销毁,此时就会调用析构函数。
PHP面向对象——构造函数、析构函数的更多相关文章
- C++构造函数/析构函数 设置成private的原因
C++构造函数/析构函数 设置成private的原因 标签(空格分隔): c/c++ 将构造函数,析构函数声明为私有和保护的,那么对象如何创建? 已经不能从外部调用构造函数了,但是对象必须被构造,应该 ...
- C++反汇编第一讲,认识构造函数,析构函数,以及成员函数
C++反汇编第一讲,认识构造函数,析构函数,以及成员函数 以前说过在C系列下的汇编,怎么认识函数.那么现在是C++了,隐含有构造和析构函数 一丶认识构造函数 高级代码: class MyTest { ...
- C++ 类 & 对象-类成员函数-类访问修饰符-C++ 友元函数-构造函数 & 析构函数-C++ 拷贝构造函数
C++ 类成员函数 成员函数可以定义在类定义内部,或者单独使用范围解析运算符 :: 来定义. 需要强调一点,在 :: 运算符之前必须使用类名.调用成员函数是在对象上使用点运算符(.),这样它就能操作与 ...
- Net基础篇_学习笔记_第十一天_面向对象(析构函数)
析构函数与构造函数 析构函数: ~Student() { Console.WriteLine("我是析构函数"); } 析构函数,当程序结束的时候,析构函数才执行. 帮助我们释放资 ...
- Java学习笔记(二) 面向对象---构造函数
面向对象---构造函数 特点 函数名与类名相同 不用定义返回值类型 不写return语句 作用 对象一建立,就对象进行初始化. 具体使用情况 class Student { Student(){ Sy ...
- 2016/3/21 面向对象: ①定义类 ②实例化对象 ③$this关键字 ④构造函数 ⑤析构函数 ⑥封装 ⑦继承
一:定义类 二:实例化对象 //定义类 class Ren { var $name; var $sex; var $age; function Say() { echo "{$this- ...
- c#类 对象 构造函数 析构函数——面向对象
类: 也是复杂数据类型 也是需要我们先定义出类型,才能使用它的数据 对象: 是通过模板类实例化出来的个体,具有具体的属性和行为(方法),对象是不能索引到静态方法. 对象的生命周期 构造—— 使用—— ...
- C++ 中的类构造函数 & 析构函数
类的构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行. 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void.构造函数可用于为某些成员变量设置 ...
- c++基础语法 构造函数 析构函数 类的组合
1 构造函数 1.不能指定任何返回值,甚至连void都不能有. 2.与Java不同,c++不同new对象,对于无参的构造函数声明对象时括号应该省略. 2 析构函数 1. 前加~,不能有参数,不能有返回 ...
随机推荐
- 用IHTMLDocument2接口获取页面上想要的数据,代替正则表达式
原文发布时间为:2010-07-01 -- 来源于本人的百度文章 [由搬家工具导入] 1. 用 IHTMLDocument2::all 获得所有元素; 2. 用 IHTMLElementCollect ...
- js7:表单的学习,Forms对象
原文发布时间为:2008-11-09 -- 来源于本人的百度文章 [由搬家工具导入] dreamveawer中,选择插入——表单——然后后面的几个选项进行学习: 大体上这么些类型: <html& ...
- 宝宝舌苔发白,消化不好 http://wenwen.soso.com/z/q103192661.htm
你好,宝宝咳嗽,如果舌苔是白的,则是风寒咳嗽,说明孩子寒重,咳嗽的痰也较稀.白黏,并兼有鼻塞流涕,这时应吃一些温热.化痰止咳的食品.如果孩子的舌苔是黄.红,则是风热咳嗽,说明孩子内热较大,咳嗽的痰黄. ...
- meta 标签大全
相信在html5之前,很少人会关注html页面上head里标签元素的定义和应用场景,可能记得住的只有"title"."keyword"和"descri ...
- ios iPhone 如何将应用程序名称本地化
iPhone的应用程序名称也可以本地化,可以按照以下步骤来实施: 1. 修改项目目录下的’ -info.plist’文件名 将’ -info.plist’ 修改为 Info.plist 2. 将Inf ...
- 不得不知Git远程操作详解
Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和用法,理解了这些内容,你就会完全掌握Gi ...
- Scut游戏服务器引擎6.0.5.0发布-支持C#脚本
1. 增加C#脚本支持2. 增加Pay和Sns中间件对Mysql数据库支持3. 精简布署步骤,取消Redis写入程序,将其移到游戏底层运行4. 修正Mysql对中文可能会出现乱码的BUG 点击下载:S ...
- oracle手动修改listener.ora和tnsnames.ora之后竟然无效
oracle手动修改listener.ora和tnsnames.ora之后竟然无效 花式重启都没有生效,需要使用Net Configuration Assistant来进行刷一下,重新生成的监听还是一 ...
- 手动脱Mole Box壳实战总结
作者:Fly2015 这个程序是吾爱破解脱壳练习第8期的加壳程序,该程序的壳是MoleBox V2.6.5壳,这些都是广告,能够直接无视了.前面的博客手动脱Mole Box V2.6.5壳实战中已经给 ...
- JAVA Eclipse创建Android程序如何实现MainActivity和Fragment相互传递数据
最简单的方法是直接强制生成一个MainActivity的实例,然后可以执行其中的方法,当然也是可以传递参数的 更加复杂的用法可以参考: http://blog.csdn.net/huangyabin0 ...