分享

PHP高级语法(二)—— 面向对象(上)

 quasiceo 2014-01-16
分类: PHP专题 2010-02-02 10:46 338人阅读 评论(0) 收藏 举报

目录(?)[+]

1 声明一个类


class 人{
成员属性:姓名、性别、年龄、身高、体重、电话、家庭住址
成员方法:可以开车, 会说英语, 可以使用电脑
}

属性:

通过在类定义中使用关键字“var”来声明变量,即创建了类的属性,虽然在声明成员属性的时候可以给定初始值, 但是在声明类的时候给成员属性初始值是没有必要的,比如说要是把人的姓名赋上“张三”,那么用这个类实例出几十个人,这几十个人都叫张三了,所以没有必要, 我们在实例出对象后给成员属性初始值就可以了。如: var $somevar;

方法(成员函数):

通过在类定义中声明函数,即创建了类的方法。如: function somefun(参数列表){ ... ... }

<?php
class Person
{


//下面是人的成员属性
var $name; //人的名字
var $sex; //人的性别
var $age; //人的年龄


//下面是人的成员方法
function say() //这个人可以说话的方法
{
echo "这个人在说话";
}



function run() //这个人可以走路的方法
{
echo "这个人在走路";
}


}
?>

有了这个类声明以后,我们就可以实例化一个实体出来,也就是我们常说的“对象”。
<?php
$p1=new Person();
$p2=new Person();
$p3=new Person();
?>

$p1=new Person()这条代码就是通过类产生实例对象的过程,$p1 就是我们实例出来的对象名称,同理,$p2, $p3也是我们实例出来的对象名称,一个类可以实例出多个对象,每个对象都是独立的,上面的代码相当于实例出来3 个人来,每个人之间是没有联系的,只能说明他们都是人类,每个人都有自己的姓名,性别和年龄的属性,每个人都有说话和走路的方法,只要是类里面体现出来的成员属性和成员方法,实例化出来的对象里面就包含了这些属性和方法。

对像在PHP 里面和整型、浮点型一样,也是一种数据类,都是存储不同类型数据用的,在运行的时候都要加载到内存中去用, 那么对象在内存里面是怎么体现的呢?内存从逻辑上说大体上是分为4 段,栈空间段、堆空间段、代码段、初始化静态段,程序里面不同的声明放在不同的内存段里面,栈空间段是存储占用相同空间长度并且占用空间小的数据类型的地方,比如说整型1,10,100,1000,10000,100000 等等,在内存里面占用空间是等长的,都是64 位4 个字节。那么数据长度不定长,而且占有空间很大的数据类型的数据放在那内存的那个段里面呢?这样的数据是放在堆内存里面的。栈内存是可以直接存取的,而堆内存是不可以直接存取的内存。对于我们的对象来数就是一种大的数据类型而且是占用空间不定长的类型,所以说对象是放在堆里面的,但对象名称是放在栈里面的,这样通过对象名称就可以使用对象了。

对于$p1=new Person()这个条代码, $p1 是对象名称在栈内存里面,new Person()是真正的对象是在堆内存里面的。

上面看到PHP 对象中的成员有两种一种是成员属性,一种是成员方法。对象我们以经可以声明了,$p1=new Person();怎么去使用对象的成员呢?要想访问对象中的成员就要使用一个特殊的操作符“->”来完成对象成员的访问:

对象->属性:$p1->name; $p2->age; $p3->sex;
对象->方法:$p1->say(); $p2->run();

2 “$this”的使用


现在我们知道了如何访问对象中的成员,是通过“对象->成员”的方式访问的,这是在对象的外部去访问对象中成员的形式,那么如果我想在对象的内部,让对象里的方法访问本对象的属性,或是对象中的方法去调用本对象的其它方法这时我们怎么办?因为对象里面的所有的成员都要用对象来调用,包括对象的内部成员之间的调用,所以在PHP 里面给我提供了一个本对象的引用$this,每个对象里面都有一个对象的引用$this 来代表这个对象,完成对象内部成员的调用, this 的本意就是“这个”的意思,上面的实例里面,我们实例化三个实例对象$P1、$P2、$P3,这三个对象里面各自存在一个$this 分别代表对象$p1、$p2、$p3 。

修改一下上面的实例,让每个人都说出自己的名字,性别和年龄:
<?php
class Person
{


//下面是人的成员属性
var $name; //人的名字
var $sex; //人的性别
var $age; //人的年龄


//下面是人的成员方法
function say() //这个人可以说话的方法
{
echo "我的名字叫:".$this->name." 性别:".$this->sex." 我的年龄是:
".$this->age."<br>";
}

 

function run() //这个人可以走路的方法
{
echo "这个人在走路";
}


}


$p1=new Person(); //创建实例对象$p1
$p2=new Person(); //创建实例对象$p2
$p3=new Person(); //创建实例对象$p3
?>

分析一下这个方法:
function say() //这个人可以说话的方法
{
echo "我的名字叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>";
}

在$p1、$p2 和$p3 这三个对象中都有say()这个方法,$this 分别代表这三个对象, 调用相应的属性,打印出属性的值,这就是在对象内部访问对象属性的方式, 如果相在say()这个方法里调用run()这个方法也是可以的,在say()这个方法中使用$this->run()的方式来完成调用。

3 构造方法与析构方法


大多数类都有一种称为构造函数的特殊方法。当创建一个对象时,它将自动调用构造函数,也就是使用new这个关键字来实例化对象的时候自动调用构造方法。

构造函数的声明与其它操作的声明一样,只是其名称必须是__construct( )。这是PHP5中的变化,以前的版本中,构造函数的名称必须与类名相同,这种在PHP5中仍然可以用,但现在以经很少有人用了,这样做的好处是可以使构造函数独立于类名,当类名发生改变时不需要改相应的构造函数名称了。为了向下兼容,如果一个类中没有名为__construct( )的方法,PHP 将搜索一个php4 中的写法,与类名相同名的构造方法。

格式:function __construct ( [参数] ) { ... ... }

在一个类中只能声明一个构造方法,而是只有在每次创建对象的时候都会去调用一次构造方法,不能主动的调用这个方法,所以通常用它执行一些有用的初始化任务。比如对成属性在创建对象的时候赋初值。

析构函数:

与构造函数相对的就是析构函数。析构函数是PHP5 新添加的内容,在PHP4 中没有析构函数。析构函数允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件,释放结果集等,析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行,也就是对象在内存中被销毁前调用析构函数。与构造函数的名称类似,一个类的析构函数名称必须是__destruct( )。析构函数不能带有任何参数。

格式:function __destruct ( ) { ... ... }

例子:
<?
//创建一个人类
class Person
{


//下面是人的成员属性
var $name; //人的名字
var $sex; //人的性别
var $age; //人的年龄


//定义一个构造方法参数为姓名$name、性别$sex和年龄$age
function __construct($name, $sex, $age)
{
//通过构造方法传进来的$name给成员属性$this->name赋初使值
$this->name=$name;
//通过构造方法传进来的$sex给成员属性$this->sex赋初使值
$this->sex=$sex;
//通过构造方法传进来的$age给成员属性$this->age赋初使值
$this->age=$age;
}


//这个人的说话方法
function say()
{
echo "我的名字叫:".$this->name." 性别:".$this->sex." 我的年龄是:
".$this->age."<br>";
}


//这是一个析构函数,在对象销毁前调用
function __destruct()
{
echo “再见”.$this->name.”<br>”;
}

}


//通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄
$p1=new Person(“张三”,”男”, 20);
$p2=new Person(“李四”,”女”, 30);
$p3=new Person(“王五”,”男”, 40);
//下面访问$p1对象中的说话方法
$p1->say();
//下面访问$p2对象中的说话方法
$p2->say();
//下面访问$p3对象中的说话方法
$p3->say();
?>

输出结果为:
我的名字叫:张三性别:男我的年龄是:20
我的名字叫:李四性别:女我的年龄是:30
我的名字叫:王五性别:男我的年龄是:40
再见张三
再见李四
再见王五

更多 0

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多