面向对象的“形”与“本”

面向对象将“对象”作为程序的基本单位,通过对数据和程序的封装,实现软件的重用性、灵活性以及可拓展性。

类是对象的抽象组织,而对象是类的具体表现。

面向对象的形:

类是对象的具体描述,下面定义一个简单的类Person

class Person
{
    public  $name;
    public $gender;
    public funcion say() {
       echo $name."is".$gender;
   }

}
//下面对类实例化
$student = new Person();
$student->name = "tom";
$student->gender = "male";
$student->say();

这个类代表了人这个抽象的概念,这个类有姓名和性别这两个属性,还有说话这个方法。但是这个类仅仅是对人这个概念的抽象描述,它本身是没有实际意义的,只有具体的实例化才会有意义,这就是我们说的对象。一个类的设计需要能充分展示其重要的方法和属性,并且能与其他的事物区分。

(1)类定义了一系列方法和属性

(2)对象含有类属性的具体值,属性的不同用来区分不同的对象。

php 的对象使用数组和模拟实现的,当我们将对象转化为数组,就能看到这个对象所拥有的属性了。对上面的student对象,我们将其打印。

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

对于打印结果,我们发现它其实就是一推数据,和数组内容的呈现在格式上是一样的。在php中,我们可以通过序列化(把保存在内存中的对象状态保存起来,在需要的时候还原,序列化和反序列化都需要包含类的对象的定义,否则在反序列的过程中可能返回不正确的结果)。

$str = serialize($student);
echo $str;

输出序列化的结果后我们发现,存储的只有对象的属性。由此得出,类是方法和属性的集合,而对象是属性的集合,不同的对象有不同的属性值,但是他们共享了类空间的方法区域。

对象的“本”

php源码中变量的定义

#zend/zend.h
typedef union_zvalue_value{
   long lval;/*long value*/
   doulue dval; /*double value */
   struct {
       char *val;
       int len;
  } str;
  HashTable *ht;  /*hash table value*/
  zend_object_value obj;
} zvalue_value;

zvalue就是php底层的变量类型,zend_object_value obj是变量中的一个结构。在php5中,对象是采用“属性数组和方法数组”来实现的。存储结构如图:

对象的zend(php引擎)中的定义与变量的定义原理相同,不同的是携带了对象的属性和类的入口。

在上面的讨论中,我们发现其实数组和对象序列化后在内容上其实是一模一样的,它们的区别在于:对象还有一个指针,指向了它所属的类。在对象序列化后,我们可以看到类名,它就标识了这个对象属于这个类。这个类型保证了对象在执行类的方法时,可以找到方法所在代码空间。

*类是定义一系列属性和操作的模板,对象是将类具体化,然后交给类处理;

*对象就是数据,本身不包括方法,但是有一个指针指向一个类,类里面可以有方法。

*类和对象是不可分割的,有对象就必定有一个类与他对应(在php中有一个特殊情况存在,就是由标量进行强制类型转化的object,stdClass类可以与他对应)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值