(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( )
}
}
都是这样间接的去调用。。。。。。。。。。。。。。。。。