positive: "版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。<br>一. Python 的类和实例<br>在面向对象中,最重要的概念就是类(class)和实例(instance),类是抽象的模板,而实例是根据类创建出来的一个个具体的 “对象”。<br>就好比,学生是个较为抽象的概念,同时拥有很多属性,可以用一个 Student 类来描述,类中可定义学生的分数、身高等属性,但是没有具体的数值。而实例是类创建的一个个具体的对象, 每一个对象都从类中继承有相同的方法,但是属性值可能不同,如创建一个实例叫hansry的学生,其分数为93,身高为176,则这个实例拥有具体的数值。<br>1.类:以Student类为例,在Python中,定义类如下:<br>classStudent(object):def__init__(self,name,score):self.name=nameself.score=score<br>a.(object)表示的是该类从哪个类继承下来的,而object类是每个类都会继承的一个类。 yt<br>b.__init__方法的第一参数永远是self,用来表示类创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self本身就是指向创建的实例本身。<br>c.有了__init__方法后,在创建实例的时候,就不能传入空参数,必须传入与__init__方法匹配的参数,但self本身不需要传入参数,只需要传入self后面的参数即可。<br>2.实例:定义好了类后,就可以通过Student类创建出 Student 的实例,创建实例是通过 类名 + ()实现:<br>student = Student('name',93) >>>student.name ""name"">>>student.score 93<br>a.其中 Student 是类名称,(’name’,93)为要传入的参数<br>b.self.name 就是 Student类的属性变量,为Student 类所有。同时, name 是外部传来的参数,不是 Student 类所自带的。故self.name = name 的意思就是把外部传来的参数 name 的值赋值给 Student类自己的属性变量 self.name .<br>"
negative: 由于push操作的特殊性,索引key在PHP数组中先后顺序并不是通过下标大小来决定,而是由push的先后决定。例如 $arr[1] = 2; $arr[2] = 3;对于double类型的key,Zend HashTable会将他当做索引key处理<br>6. PHP变量<br>PHP是一门弱类型语言,本身不严格区分变量的类型。PHP在变量申明的时候不需要指定类型。PHP在程序运行期间可能进行变量类型的隐示转换。和其他强类型语言一样,程序中也可以进行显示的类型转换。PHP变量可以分为简单类型(int、string、bool)、集合类型(array resource object)和常量(const)。以上所有的变量在底层都是同一种结构 zval。<br>Zval是zend中另一个非常重要的数据结构,用来标识并实现PHP变量,其数据结构如下:<br>Zval主要由三部分组成:<br>type:指定了变量所述的类型(整数、字符串、数组等)refcount&is_ref:用来实现引用计数(后面具体介绍)value:核心部分,存储了变量的实际数据<br>Zvalue是用来保存一个变量的实际数据。因为要存储多种类型,所以zvalue是一个union,也由此实现了弱类型。<br>PHP变量类型和其实际存储对应关系如下:<br>1IS_LONG-> lvalue<br>2IS_DOUBLE-> dvalue<br>3IS_ARRAY-> ht<br>4IS_STRING-> str<br>5IS_RESOURCE-> lvalue<br>引用计数在内存回收、字符串操作等地方使用非常广泛。PHP中的变量就是引用计数的典型应用。Zval的引用计数通过成员变量is_ref和ref_count实现,通过引用计数,多个变量可以共享同一份数据。避免频繁拷贝带来的大量消耗。<br>在进行赋值操作时,zend将变量指向相同的zval同时ref_count++,在unset操作时,对应的ref_count-1。只有ref_count减为0时才会真正执行销毁操作。如果是引用赋值,则zend会修改is_ref为1。<br>PHP变量通过引用计数实现变量共享数据,那如果改变其中一个变量值呢?当试图写入一个变量时,Zend若发现该变量指向的zval被多个变量共享,则为其复制一份ref_count为1的zv