positive: "Python编程中类的概念可以比作是某种类型集合的描述,如“人类”可以被看作一个类,然后用人类这个类定义出每个具体的人——你、我、他等作为其对象。类还拥有属性和功能,属性即类本身的一些特性,如人类有名字、身高和体重等属性,而具体值则会根据每个人的不同;功能则是类所能实现的行为,如人类拥有吃饭、走路和睡觉等功能。具体的形式如下:<br># 例:类的概念class 人类:名字 = '未命名' # 成员变量def 说话(内容): # 成员函数print 内容 # 成员变量赋初始值<br>某人 = 人类() # 定义一个人类对象某人某人.名字 = ""路人甲""某人.说话 ('大家好') # 路人甲说话>>> 大家好! # 输出<br>示例程序一(类的定义):<br>>>> class pp:<br>... pass<br>>>> p = pp()<br>>>> print p<br>>>><br>打印了这个变量的类型。它告诉我们我们已经在__main__模块中有了一个Person类的实例。<br>示例程序二(__init__用法):<br>说明:__init__方法在类的对象被建立时,马上运行。该方法用来对对象进行初始化。<br>>>> class Person:<br>... def __init__(self, name):<br>... self.name = name<br>... def sayHi(self):<br>... print 'Hello, my name is', self.name<br>>>> p = Person('Swaroop')<br>>>> p.sayHi()<br>Hello, my name is Swaroop<br>>>><br>示例程序三(__del__方法):<br>说明:__del__方法是在程序退出时调用的。<br>>>> class Person:<br>... population = 0<br>... def __init__(self, name):<br>... self.name = name<br>... print '(Initializing %s)' % self.name<br>... def __del__(self):<br>... print '%s says bye.' % self.nam"
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