• PHP之OOP要点摘要


    类和对象:
        类是生成对象的模板,对象是活动组件;
        面向对象编程实际操作都是通过类的实例(而不是类本身)完成的;
        
    访问控制(public、protected、private):
    (1) 在任何地方都可以访问public属性和方法;
    (2) 只能在当前类中才能访问private方法和属性,即使在子类中也不能访问;
    (3) 可以在当前类或子类中访问protected方法或属性,其他外部代码无权访问(实例化对象也不可以访问);

    子类与父类:
        子类默认继承父类所有的public和protected方法(但是没有继承private方法和属性);

    静态方法和属性:
        (1) 我们不仅可以通过对象访问方法和属性,还可以通过类来访问它们,这样的方法和属性是“静态的(static)”,必须用static关键词来声明;
        (2) 静态方法是以类作为作用域的函数,静态方法不能访问这个类中的普通属性,因为那些属性属于一个对象,但可以访问静态属性。
        (3) 只有在使用parent关键词调用方法的时候,才能对一个非静态方法进行静态形式的调用,除非是访问一个被覆写的方法,否则永远只能使用::访问被明确声明为static的方法和属性;
        (4) 只能通过类而不是类的实例来访问静态方法和属性;
        
    常量属性:
        只能通过类而不是类的实例来访问常量属性;
        
    抽象类:
        (1) 抽象类至少包含一个抽象方法。抽象方法用abstract关键字声明,其中不能有具体内容,你可以像声明普通方法那样声明抽象方法,但要以分号而不是方法结束语。
        (2) 抽象类的每个子类都必须实现抽象类中的所有抽象方法,或者把它们自身也声明为抽象方法。
        (3)扩展类不仅仅负责简单实现抽象类中的方法,还必须重新声明方法。新的实现方法的访问控制不能比抽象方法的访问控制更严格。新的实现方法的参数个数应该和抽象方法的参数个数一样,重新生成对应的类型提示。
        
    接口:
        (1)抽象类提供了具体实现的标准,而接口(interface)则是纯粹的模板。接口只能定义功能,而不包含实现的内容。接口可用关键字interface来声明。接口可以包含属性和方法声明,但是方法体为空。
        (2)任何实现接口的类都要实现接口中所定义的所有方法,否则该类必须声明为abstract。
        (3)一个类可以同时继承一个父类和实现任意个接口,extends子句应该在implements子句之前:

    class FooClass extends FooBaseClass implements Ainterface,Binterface[,...]{
           //......
    }

    延迟静态绑定:static关键字

        abstract class DomainObject {
            
        }
        //子类一
        class User extends DomainObject {
            public static function create(){
                return new User();
            }
        }
        //子类二
        class Document extends DomainObject {
            public static function create(){
                return new Document();
            }
        }
        print_r(User::create()); //可以正常运行,并且得到一个对象    

    观察以上代码大家肯定对这样的重复代码感到有点不爽,有没有更好的办法吗?于是开始不新的尝试...于是有了下面的简化...

      abstract class DomainObject {
            public static function create(){
                return new self();
            }
        }
        class User extends DomainObject {}
        class Document extends DomainObject {}

    这样写看起来很整洁。实际上对该类所起的作用与$this对对象所起的作用并不完全相同。self指的不是调用上下文,它指的解析上下文,因此,如果运行上面的例子,会得到:
        print_r(User::create()); // Fatal error: Cannot instantiate abstract class DomainObject in ....on line xxx
        
        因此,self被解析为定义create()的DomainObject,而不是解析为调用self的User类。PHP 5.3之前,在这方面都有严格的限制,产生过很多笨拙的解决方案。PHP 5.3中引入了延迟静态绑定的概念。该特性最明显的标志就是新关键字static。static类似于self,但它指的是被调用的类而不是包含类。在本例中,它的意思是调用User:create()将生成一个新User对象,而不是试图实例化一个DomainObject对象。因此,现在在静态上下文件中使用继承关系。

      abstract class DomainObject {
            public static function create(){
                return new static();
            }
        }
        class User extends DomainObject {}
        class Document extends DomainObject {}

     拦截器方法
        __get($property) //访问未定义的属性时被调用
        __set($property,$value) //给未定义的属性赋值时被调用
        __isset($property) //对未定义的属性调用isset()时被调用
        __unset($property) //对未定义的属性调用unset()时被调用
        __call($method,$arg_array) //调用未定义的方法时被调用

      __clone() //当在一个对象上调用clone关键字时,其__clone()方法就会被自动调用
        __autoload() //当PHP引擎遇到试图实例化未知类的操作时,会调用__autoload()方法,并将类名当做字符串参数传递给它

  • 相关阅读:
    php动态编辑zlib扩展
    部署平台分布式锁设计
    quartz源码分析——执行引擎和线程模型
    RabbitMq核心概念和术语
    Netty SSL安全配置
    跨站脚本攻击介绍
    ssl Diffie-Hellman弱密码问题
    java server wrapper 和 maven assembly 插件
    跨站请求伪造防御
    字符编码笔记:ASCII,Unicode和UTF-8
  • 原文地址:https://www.cnblogs.com/hancf/p/3461403.html
Copyright © 2020-2023  润新知