美文网首页
php面向对象

php面向对象

作者: Continue_li | 来源:发表于2019-12-11 11:30 被阅读0次
    1. 类的概念:类是具有相同属性和服务的一组对象的集合
    2. 对象的概念:对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位.对象由一组属性和对这组属性进行操作的一组服务组成。
    3. 类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是类.类描述了一组有相同特性(属性)和相同行为(方法)的对象。
    4. 开发一个系统程序和建一个电脑教室类似,你把每个独立的功能模块抽象成类形成对象,由多个对象组成这个系统,这些对象之间都能够接收信息、处理数据和向其它对象发送信息等等相互作用。就构成了面向对象的程序。
    5. 通过在类定义中使用关键字" var "来声明变量,即创建了类的属性
    6. 对象在内存里面是怎么体现的呢?内存从罗辑上说大体上是分为4段, 栈空间段, 堆空间段,代码段, 初使化静态段, 程序里面不同的声明放在不同的内存段里面,栈空间段是存储占用相同空间长度并且占用空间小的数据类型的地方,在内存里面占用空间是等长的,都是64位4个字节。 那么数据长度不定长,而且占有空间很大的数据类型的数据放在那内存的那个段里面呢?这样的数据是放在堆内存里面的。栈内存是可以直接存取的,而堆内存是不 可以直接存取的内存。
    7. 每个属性又都有一个地址。p1=new Person();等号的左边p1是一个引用变量,通过赋值运算符“=”把对象的首地址赋给“p1“这个引用变量, 所以p1是存储对象首地址的变量,p1放在栈内存里边,p1相当于一个指针指向堆里面的对象, 所以我们可以通过$p1这个引用变量来操作对象, 通常我们也称对象引用为对象。
    8. __construct ( [参数] ) { ... ... }
      在一个类中只能声明一个构造方法,而是只有在每次创建对象的时候都会去调用一次构造方法,一个类的析构函数名称必须是__destruct( )。析构函数不能带有任何参数。
    9. 注意:由于类实例是以堆栈的形式放在内存中,所以最后调用 析构函数 的时候,输出顺序是按 后进先出 的原则!
    10. 封装的原则在软件上的反映是:要求使对象以外的部分不能随意存取对象的内部数据(属性),从而有效的避免了外部错误对它的"交叉感染",使软件错误能够局部化,大大减少查错和排错的难度。
    11. 构造方法是默认的公有方法(构造方法不要设置成私有的),所以在类的外面可以访问到,这样就可以使用构造方法创建对象, 另外构造方法也是类里面的函数,所以可以用构造方法给私有的属性赋初值
    12. __set()、__get()、__isset()、__unset() 这四个方法都是我们添加到对象里面的,在需要时自动调用的,来完成在对象外部对对象内部私有属性的操作。
    13. 在PHP5.3及以后,上述魔术方法(__get(),__set(),__isset(),__unset() 等)提倡是 public 类型的,并且不是 static 方法,否则会给出警告信息!
    14. 在PHP和Java语言里面没有多继承,只有单继承,也就是说,一个类只能直接从一个类中继承数据, 这就是我们所说的单继承。
    15. PHP中的方法是不能重载的, 所谓的方法重载就是定义相同的方法名,通过“参数的个数“不同或“参数的类型“不 同,来访问我们的相同方法名的不同方法。另外,因为PHP没有名子空间的概念,在同一个页面和被包含的页面中不能定义相同名称的方法, 也不能定义和PHP给我提供的方法的方法重名,当然在同一个类中也不能定义相同名称的方法。
    16. 重载新的方法(parent::)--虽然说在PHP里面不能定义同名的方法, 但是在父子关系的两个类中,我们可以在子类中定义和父类同名的方法,这样就把父类中继承过来的方法覆盖掉了。
    一种是使用父类的“类名::“来调用父类中被覆盖的方法;
    一种是使用“parent::”的方试来调用父类中被覆盖的方法;
    
    1. 在子类覆盖父类的方法时也要注意一点,子类中方法的访问权限一定不能低于父类被覆盖方法的访问权限,也就是一定要高于或等于父类方法的访问权限。例如,如果父类方法的访问权限是protected,那么子类中要覆盖的权限就要是protected和public
    2. final这个关键字只能用来定义类和定义方法, 不能使用final这个关键字来定义成员属性,因为final是常量的意思,我们在PHP里定义常量使用的是define()函数,所以不能使用final来定义成员属性。

    使用final关键标记的类不能被继承;
    使用final关键标记的方法不能被子类覆盖,是最终版本;

    1. static成员能够限制外部的访问,因为static的成员是属于类的,是不属于任何对象实例,是在类第一次被加载的时候分配的空间,其他类是无法访问的,只对类的实例共享,能一定程度对类该成员形成保护;类的静态变量,非常类似全局变量,能够被所有类的实例共享,类的静态方法也是一样的,类似于全局函数。
    2. 静态的成员不是在每个对象内部存在的,但是每个对象都可以共享,所以我们如果使用对象访问成员的话就会出现没有这个属性定义,使用对象访问不到静态成员的,使用类名去访问(Person::$myCountry)
    3. 类里面的静态方法只能访问类的静态的属性,在类里面的静态方法是不能访问类的非静态成员的.在静态方法里,可以使用这个方法所在的类的“类名“,也可以使用“self”来访问其它静态成员,如果没有特殊情况的话,我们通常使用后者,即“self::成员属性”的方式。
    4. 用“const”修饰的成员属性的访问方式和“static”修饰的成员访问的方式差不多,也是使用“类名”,在方法里面使用“self”关键字。但是不用使用“$”符号,也不能使用对象来访问。
    5. “__toString()”方法中返回的字符,所以“__toString()”方法一定要有个返回值(return 语句)。
    6. “__clone()”方法可以没有参数,它自 动包含this和that两个指针,this指向复本,而that指向原本;
    7. __call()”方法,这个方法有2个参数,第一个参数为调用不存在的方法过程中,自动调用__call()方法时,把这个不存在的方法的方法名传给第一个参数,第二个参数则是把这个方法的多个参数以数组的示我们调用的方法及使用的参数不存在,但程序还可以继续执行形式传进来。
    8. 我们在类里面定义的没有方法体的方法就是抽象方法,所谓的没有方法体指的是,在方法声明的时候没有大括号以及其中的内容,而是直接在声明时在方法名后加上分号结束,另外在声明抽象方法时还要加一个关键字“abstract”来修饰;
    9. 只要一个类里面有一个方法是抽象方法,那么这个类就要定义为抽象类,抽象类也要使用“abstract”关键字来修饰;在抽象类里面可以有不是抽象的方法和成员属性,但只要有一个方法是抽象的方法,这个类就必须声明为抽象类,使用”abstract”来修饰。
    10. 最重要的一点就是抽象类不能产生实例对象, 所以也不能直接使用.定义抽象类就相当于定义了一种规范,这种规范要求子类去遵守,子类继承抽象类之后,把抽象类里面的抽象方法按 照子类的需要实现。子类必须把父类中的抽象方法全部都实现,否则子类中还存在抽象方法,那么子类还是抽象类,
    11. 使用“implements”这个关键字去实现接口中的抽象方法 接口和类之间。class Four extends 类名一 implemtns 接口一, 接口二, ...

    相关文章

      网友评论

          本文标题:php面向对象

          本文链接:https://www.haomeiwen.com/subject/jxjogctx.html