美文网首页
面向对象

面向对象

作者: 始于原子 | 来源:发表于2018-04-18 11:25 被阅读0次

    类成员的定义

    成员属性的定义

    // 非静态成员属性的定义
    public $属性名[=属性值];
    var $属性名[=属性值]; // 老版本定义
    
    // 静态成员属性的定义
    public static $属性名[=属性值];
    
    // 类常量
    const 常量名 = 常量值;
    

    成员方法的定义

    // 非静态成员方法的定义
    public function 方法名([形参列表]){
        # code
    }
    
    // 静态成员方法的定义
    public static function 方法名([形参列表]){
        # code
    }
    

    类成员的使用

    # 实例化类
    $obj = new ClassName();
    
    // 类的外部调用非静态成员
    $obj -> 属性名;
    $obj -> 方法名();
    
    // 类的外部调用静态成员(使用范围解析操作符)
    $obj::属性名;
    $obj::方法名();
    
    // 类的外部调用类常量
    $obj::常量名;
    
    // 类的内部调用非静态方法
    $this->属性名;
    $this->方法名();
    
    // 类的内部调用静态方法
    ClassName::$属性名;
    ClassName::方法名();
    
    // 类的内部调用常量
    ClassName::常量名;
    

    构造方法

    PHP不负责定义这个构造方法,只负责调用构造方法

    当使用new关键字实例化这个类的对象的时候,该类的构造方法就会被PHP自动调用执行一次

    class ClassName extends AnotherClass
    {
        function __construct(argument)
        {
            # code...
        }
    }
    

    析构方法

    PHP不负责定义析构方法,只负责调用析构方法

    当对象被销毁时(手动销毁和程序执行完毕自动销毁),析构方法会被PHP自动调用执行一次

    析构方法不支持传递参数

    class ClassName extends AnotherClass
    {
        function __destruct()
        {
            # code...
        }
    }
    

    对象的值传递和引用传递

    对象的引用传递

    原理:对象的引用传递将会使$obj变量和$obj2变量指向同一个变量值空间

    class ClassName
    {
        public $name = 'zjlsp';
    }
    $obj = new ClassName(); // 实例化类
    $obj2 = &$obj;  // 对象的引用传递
    
    $obj2-> name = 'zjlsp2';
    var_dump($obj->name);   // $obj的属性也随之改变
    

    对象的值传递

    原理:对象的值传递将会就地复制一份变量的值空间。$obj变量和$obj2变量指向的是两个不同的值空间,但是他们值空间所指向的对象空间却是同一个;所以导致最终改变任何一方的值,也将会影响到另外一方的值

    class ClassName
    {
        public $name = 'zjlsp';
    }
    $obj = new ClassName(); // 实例化类
    $obj2 = $obj;
    
    $obj2-> name = 'zjlsp2';
    var_dump($obj->name);   // $obj的属性也随之改变
    

    对象的克隆

    $obj = new ClassName();
    $obj2 = clone $obj;
    

    自动加载

    什么时候使用到这个类,就什么时候加载这个类文件的操作策略!

    // 自动加载函数
    function  __autoload($className){
        # code
    }
    
    // 自定义自动加载函数
    function zdjz($className){
        # code
    }
    spl_autoload_register('zdjz');
    
    // 自定义自动加载非静态方法和静态方法
    class ClassName
    {
        public static function f1($className){
            # code...
        }
        public function f2($className)
        {
            # code...
        }
    }
    spl_autoload_register(array('ClassName','f1'));
    spl_autoload_register(ClassName::f1);  // 自定义自动加载静态方法
    
    $obj = new ClassName();
    spl_autoload_register(array($obj,'f1'));  // 自定义自动加载静态方法
    

    如果我们使用了自定义的自动加载,那么,默认的自动加载函数将会失效,如果还想继续使用默认的自动加载,就必须再将默认的自动加载注册一次
    可以注册多个自定义自动加载

    关键字

    // self专门用来在本类的内部代替本类的类名的
    self::$属性名;
    
    // parent关键字其实就是专门在子类中代替父类的类名的
    parent::$属性名;
    

    访问限定修饰符

    标识符 描述 作用域
    public 公共的 表示在类的内部,类的外部和类的继承链中都能直接访问
    protected 受保护的 表示在类的内部和继承链中能被直接访问
    private 私有的 表示只能在本类的内部被直接访问

    最终类和最终方法

    被final申明的类将不能被继承

    final class ClassName
    {
        final public function fName(){
    
        }
    }
    
    

    抽象类

    包括:1)普通类的所有成员;2)抽象方法;

    抽象类不能够被直接实例化为对象,但是抽象类中的静态成员和类常量都能够正常使用
    抽象类如果被普通类所继承,那么抽象类中的抽象方法必须全部被实现
    抽象类还可以被抽象类所继承,如果被抽象类所继承,那么被继承的那个抽象类中其抽象方法可以不被实现

    abstract  class  类名{
        // 抽象类成员
        abstract function 抽象方法名(){
    
        }
    }
    

    接口类

    包括:1)接口常量;2)接口抽象方法

    接口如果被普通类所实现,那么,接口中的所有接口抽象方法都要被全部实现
    接口还可以被抽象类所实现,如果被抽象类实现,那么接口中的接口抽象方法可以不被实现
    接口中的接口抽象方法只能是public类型

    interface  接口名{
        // 接口成员
    }
    
    // 接口可以被多实现:使用implements关键字来实现接口
    class ClassName implements inter1,inter2{
    
    }
    

    静态延时绑定

    静态延时绑定是PHP5.3之后才出现的特性

    class A {
        function f1(){
            echo static::$var1;
        }
    }
    class B extends A
    {
        public static $var1 = '我是类B';
    }
    class C extends A
    {
        public static $var1 = '我是类C';
    }
    $b = new B();
    $b -> f1(); // 我是类B
    
    $c = new C();
    $c -> f1(); // 我是类C
    

    重载

    PHP访问一个不存在的成员时,默认的处理方式为:报一个NOTICE级别的错误,并且返回NULL值

    PHP访问一个非公有的成员,默认的处理方式为:直接报致命的错误,阻止程序继续执行

    属性的重载(非静态)

    class ClassName {
        // 当获取一个不可访问的(非静态)成员属性值时,进行自定义的处理
        function __get($name){
            # code...
        }
        // 当设置一个不可访问的(非静态)成员属性时,进行自定义的处理
        function __set($name){
            # code...
        }
        // 当删除一个不可访问的(非静态)成员属性值时,进行自定义的处理
        function __unset($name){
            # code...
        }
        // 当判断一个不可访问的(非静态)成员属性是否存在时,进行自定义的处理
        function __isset($name){
            # code...
        }
    }
    

    方法的重载

    class ClassName {
        // 当访问一个不可访问的(非静态)成员方法时,进行自定义处理
        function __call($name){
            # code...
        }
        // 当访问一个不可访问的(静态)成员方法时,进行自定义处理*(本身必须是静态方法)
        static function __callstatic($name){
            # code...
        }
    }
    

    面向对象的三大特性

    1)封装的特性, 将特定的功能打包成一个类。

    2)继承的特性, 指的就是extends语法特性。

    3)多态的特性, 指的就是重写的特性,一种方法可以有多种实现方式。

    相关文章

      网友评论

          本文标题:面向对象

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