现在的位置: 首页 > 综合 > 正文

php关于面向对象的一些笔记(2011年8月10日)

2013年12月04日 ⁄ 综合 ⁄ 共 2933字 ⁄ 字号 评论关闭

(1)成员属性的public不可缺省,否则会发生错误,成员方法的public则可缺省,默认值为public。new类后的括号可省。

(2)function __construct(  )是构造函数,优先在于new完类后,就会自动自行,不需要别人来调用。

(3)如果子类没有构造方法,而父类有,则子类初始化时会自动调用父类的构造函数。如果2个同时有的话,则优先调用子类的,再用双冒号的形式调用下父类的构造函数(否则会有不可遇知的问题)。

(4)类中定义的属性,要在方法体中来给某属性赋值,只能用$this->a这样的方式,要在方法体中调用某个属性也只能用$this->a。直接在方法体中$b=10和在类体中$b=10的效果是完全不一样的,前者会发生错误,后者是给类加了个属性值。直接echo $a无论是在类内部还是外部都是行不通的,只能echo $this->a,因为类的属性和变量不是一个性质的。

(5)对象调用属性,属性的$符号必须去掉,如$my->a,$my对象实例自My类。而如果类通过双冒号的形式来调用,则$符号不能去掉,如My::$a。

(6)必须是静态属性才能用“类名::” 的形式调用,而对于函数而言,无所谓静态不静态,“类名::函数名()”都可以立马调用。

(7)final类不能有子类,final方法不能被覆盖。

(8)get_class( $a)会返回对象$a是从哪个类实例化来的。

(9)static与“private,protected,public”的最大区别在于,前者是类直接调用,后者都是实例调用(虽然会发生实例不可调即在外部不能调的情况,但内部还是可以用$this来调用的)。它们之间可以进行组合,如private static $a,这样的属性,只能在类内部,通过self::$a的方式来调用。

(10)self与parent前面都不可有$符号,因为那是对象或者属性才有的东西,类没有,而self与parent代表着类,一个是自己这个类,一个是父类。

(11)父类中有构造函数,子类没有的话,则子类实例化会自动调用执行父类的构造函数,如果2个类都有构造函数,则会自动执行子类的,父类的构造函数要手动添加执行语句。

(12)抽象方法没有方法体,即没{}区域,但有(),而且需要用abstract来修饰。

(13)抽象类至少要有一个抽象方法。抽象类不能被实例化,于是抽象类中成员属性和方法一般是不能访问的,因为没法实例化(除非常量和静态变量)。

(14)注意只要有一个抽象方法,那这个类就是抽象类,所以子类在继承抽象基类的时候,如果基类有抽象方法,子类也会继承到,于是子类也会变成抽象类,这个时候子类就也不能被实例化,于是就要在子类中实现“重载”,重写继承基类中的那个抽象方法。。。于是子类就不会变成为抽象类,可以被实例化。

(15)一般function(  ){  }后,大括号之后不需要带分号,因为大括号本身相当于分号分隔作用,而抽象方法不仅要去掉大括号,还要加上分号。

(16)抽象类的作用:让子类必须有抽象类中的方法名,因为如果没有,如果不重载,子类也会变成一个抽象类,也就不能被实例化。其实就是在定义某种规范,让子类按规范先定义,然后按照自己的需求实现自己的功能。抽象类,不可实例化,必须有一个抽象方法,抽象方法没有方法体。至少有一个抽象方法,就说明还可以有其它普通的方法,普通方法都是有函数体的,这些普通方法就可以供所有的子类来共用。

(17)抽象类对团队合作起的作用,如A和B程序员一起开发,A写了一堆程序,但有些功能是调B中的方法实现的,于是A可以先写完自己的程序,并定义一个抽象类,抽象类里就有抽象方法,于是B写的程序的方法名必须和抽象类相同,于是就统一了规范,所以A即使写完的程序中需要调取B写的部分还米写完,也没关系,因为B的名称必须按照A定义的抽象类来规定,所以抽象类是组规范。

(18)一般抽象类的写法是将公有的成员属性,成员方法全部写出来,然后要实现重载的,需要子类在各自不同情境中去定义的方法就写个抽象方法体,具体的实现方式由子类各自定义。

(19)php不支持多重继承,既又继承于A,同时又继承于B,但是可以间接重继承,比如继承于A,而A是继承于B的。

(20)构造函数如果没有显式写明的话,会自动生成一个默认的构造函数,其不接受任何参数。

(21)析构函数(function __destruct(  ){  } )在unset($a)销毁一个对象的时候发生作用。

(22)函数虽然也可以定义变量,也可定义方法,但多了容易乱。而类相当于一个命名空间,每个成员属性和方法都可由类的实例来调用,不会影响到其它。

(23)封装后不仅数据可以保密,同时减少了程序之间的相互依赖,改动比较方便。

(24)两个错误。定义类的时候,总喜欢写小括号,如class A(  ){ },这其实是在写函数,是没有()的,class A{ }就好。类调静态属性的时候还是喜欢把$去掉,对象调属性的时候$要去掉,但是类调属性的时候,$符号必须存在。

(25)静态方法只能调静态属性,乍一看莫名其妙,但确实正确。因为是静态方法,所以外部调用只能用类的形式调用,所以没有实例化。而如果是调普通的属性,则需要用到$this,于是这里就矛盾啦,又没实例化又要用到$this,于是就会报错。

(26)多态就是同一个方法,在不同类中具体实现内容不同,比如多个类都继承自一个抽象类,都有相同名称的方法,但具体作用内容不相同,如都继承自动物,然后都有makesound(  )方法,但具体内容却各自不同。

(27)经常会看到$bb->b->a这样的调用方式,那说明$bb->b的结果本身也应该是一个对象,,,函数里可以这么定义$this->b=new A(  )。把一个创建对象的表达式赋予它。。

(27)有类A,实例化出对象$a,这时“$a instanceof  A”,这个式子如果返回ture就说明是类A的实例,get_class($a)这个式子的结果可以直接给出所属类名。诸如get_class_methods这样的方式,可以获取类的所有方法。

(28)对象其实就是对数据的封装,使用时候可以和其他类自由组合,这样减少了程序之间的相互依赖和耦合。

(29)子类可以调父类构造函数,如parent::__construct(  )来完成,但也可以调任意一个类中的构造函数,即使没有任何关联关系,如A::__construct(  ),只要用类名加在前面就好。

(30)还可以有__clone(   )这样的方法体,也是2根下划线,当有克隆行为产生的时候,会自动执行该函数。

(31)抽象类中可以有子类共用的普通方法,而接口中全部都是抽象方法都没有方法体。

(32)创建的类本身并不会存在内存之中,而一旦实例化后就会在内存中开辟空间。

(33)protected方法,只有类自己和自己继承的才能访问,类的实例或者继承子类的实例都不可直接访问,所以。

class A{  

   function a(  ){ return 1  }

}

class B extends A{

    function b(  ){

    $this->a(  )

  }

}

都是这样间接的去调用。。。。。。。。。。。。。。。。。

抱歉!评论已关闭.