您的位置:首页 > 编程语言 > PHP开发

面向对象的"形"与"本"

2016-08-08 10:57 190 查看
类是对象的抽象组织,对象是类的具体存在。

对象的“形”

类是我们对一组对象的描述

在PHP中,每个类的定义都以关键字class开头,后面跟着类名,紧接着一对花括号,里面包含有类成员方法的定义。如下代码所示:

<?php

class person
{
public $name;
public $gender;

public function say()
{
echo $this->name." is ".$this->gender;
}
}


定义了一个person类。代表了抽象出来的人这个概念,它含有姓名和性别这两个属性,还具有开口说话的方法。

$student = new person();
$student->name='Tom';
$student->gender='male';
$student->say();
$teacher = new person();
$teacher->name='Kate';
$teacher->gender='female';
$teacher->say();


这段代码示例化了person类,差生了一个student对象和teacher对象的实例。实际上也就是从抽象到具体的过程。
类定义了一系列的属性和方法,并提供了实际的操作细节,这些方法可用来对属性进行加工。对象含有类属性的具体值,这就是类的实例化。正是由于属性的不同,才能区分不同的对象。在上面的例子中,由于student和teacher的姓名和性别不同,才得以区分出二人。
对象是由属性和方法组成的。由于PHP的对象是用数组来模拟的,因此我们把对象转为数组就能看到这个对象所拥有的属性了。


print_r((array)$student);
var_dump($student);


运行结果为:

Array ( [name] => Tom [gender] => male )

object(person)#1 (2) { [“name”]=> string(3) “Tom” [“gender”]=> string(4) “male” }

到这里可以很直观的认知到,对象就是一堆数据。既然如此,可以把一个对象存储起来,一遍需要时使用。这就是对象的**序列化**。

所谓序列化,就是把保存在内存中的各种对象状态(属性)保存起来,并且在需要时可以还原出来。
这里我们需要用到两个函数:`serialize()`和`unserialize()`
`serialize()`函数将实例转化为一个序列化的字符串
`unserialize()` 还原已经序列化的对象
下面的代码实现的是将内存中的对象保存到一个文件中。


$str = serialize($student);
echo $str;
file_put_contents('store.txt', $str);


运行结果为

O:6:”person”:2:{s:4:”name”;s:3:”Tom”;s:6:”gender”;s:4:”male”;}

在需要时反序列化这个对象。

$str = file_get_contents('store.txt');
$student = unserialize($str);
$student->say();


此时无需实例化可以继续使用,而且属性和值都是保持在序列化之前的状态

补充:其实serialize()就是将PHP中的变量如对象(object),数组(array)等等的值序列化为字符串后存储起来.序列化的字符串我们可以存储在其他地方如数据库、Session、Cookie等,序列化的操作并不会丢失这些值的类型和结构。这样这些变量的数据就可以在PHP页面、甚至是不同PHP程序间传递了。
而unserialize()就是把序列化的字符串转换回PHP的值。


可以看到,对象序列化后,存储的只是对象的属性。类是由属性和方法组成的,而对象则是属性的集合,有同一个类生成的不同对象,拥有各自不同的属性,但共享了类的代码空间中方法区域的代码。

对象的“本”

对象也是一种很普通的变量,不同的是其携带了对象的属性和类的入口。

对象与数组

对象可以装换为数组,数组也能转换成对象。数组是由键值对数据组成的,数组的键值对和对象的属性/属性值十分相似。

$student_arr = array('name'=>'Tom', 'gender'=>'male');
echo serialize($student_arr);


运行结果如下:

a:2:{s:4:”name”;s:3:”Tom”;s:6:”gender”;s:4:”male”;}

而上文中,对象序列化后的结果为:

O:6:”person”:2:{s:4:”name”;s:3:”Tom”;s:6:”gender”;s:4:”male”;}

可以很清楚的看出,对象和数组在内容上一模一样!

而对象和数组的区别在于:对象还有个指针,指向它所属的类。

对象与类

类是定义一系列属性和操作的模板,而对象则把属性进行具体话,然后交给类处理。对象就是数据,对象本身不包含方法。但是对象有一个"指针"指向一个类,这个类里可以有方法。
方法描述不同属性所导致的不同表现。
类和对象是不可分隔的,有对象就必定有一个类和其对应,否则这个对象也就成了一个没有亲人的孩子(但有一种特殊情况存在,就是由标量进行强制类型转换的object,没有一个类和它对应。此时,PHP中一个称为"孤儿"的stdClass类就会收留这个对象)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php 面向对象