• php面向对象编程_1


    1, php面向对象编程的三大特征:

    (1) 封装性,封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法)才能对数据进行操作。

    (2) 继承性,继承就是一个子类通过extends父类,把父类的(public/protected)属性和(public/protected)方法继承下来。

    (3) 多态性,多态性体现在类中方法的重载和方法的覆盖。

    (4) 抽象性,我们定义一个类的时候,实际把一类事物的共有属性和行为提取出来,形成一个物理模型,这种研究问题的方法称为抽象。

    2, 封装性

    public:        类的内部子类外部都可以访问;

    protected:  类的内部子类可以访问;

    private:      只有类的内部可以访问。

    如果在类的外部访问protected和private变量,需要使用public属性的成员方法,比如__get(),__set();php的成员函数默认为public。

    3, 继承性

    (1)子类可以继承父类的public和protected属性和方法。

    (2)一个类只能继承一个父类,如果希望继承多个类的属性和方法,需要多层继承。

    (3)当创建子类对象时候,默认不会调用父类的构造方法(这点和Java是不同的)。

    (4)如果子类想去调用父类的构造方法,或者其他的方法(public/protectd),可以这样处理类名::方法名()或者parent::方法名()。

    (5)如果子类中方法与父类相同,我们称方法重写或方法覆盖。

    4, 方法重载

    “重载”是类的多态的一种体现,函数重载指一个标识符被用作多个函数名,且能够通过函数的参数个数或参数类型将这些同名的函数区分开来,调用不发生混淆。调用的时候,虽然方法名字相通,但根据参数表可以自动调用对应的函数。

    重载:函数名一样,通过函数的参数个数或者参数类型不同,达到调用同一个函数名,但是可以区分不同的函数。

    (1)PHP5虽然可以支持重载,但重载在具体实现上,和其他语言还有较大的差别。如果你试图定义多个同名函数,那你的程序运行时将会报错。看下面案例:

    class A{
     
        public function test1(){
     
            echo "test1";
     
        }
     
        public function test1($a){
     
            echo "test1 hello";
     
        }
     
    }
     
     
     
    $a = new A();
     
    $a->test1();
     
    $a->test1(456);

      以上实例适用于C++、Java,但是不适用于PHP。

    (2)php通过魔术函数实现重载,但这并不推荐。

    class A{
        public function test1($p){
            echo "接收一个参数";
        }
        public function test2($p){
            echo "接收两个参数";
        }
    
    //此处提供一个__call魔法函数
    //当一个对象调用某个方法,而此方法不存在时候,系统会自动调用__call(),把方法名字作为__call的第一个参数,方法所有参数作为__call的第二个参数。
        function __call($method,$p){
            if($method == "test"){
                if(count($p) == 1){
                    $this->test1($p);
                }else if(count($p) == 2){
                    $this->test2($p);
                }
            }
        }
    }
    $a = new A();
    $a->test(1);

    小结:关于重载

    (1)    php5默认情况下不直接支持方法重载。

    (2)    php5可以同__call魔术方法,模拟重载效果。

    5, 方法的重写/方法的覆盖,当一个父类知道所有的子类都有一个方法,但是父类不能确定该方法如何去写,可以让子类去覆盖这个方法。

    class Animal{
    
        public function cry(){
    
            echo '动物叫';
    
        }
    
    
    
    }
    
    class Cat extends Animal{
    
        public function cry(){
    
            echo "猫叫";
    
        }
    
    }
    
    $cat1 = new Cat();
    
    $cat1->cry();
    

    (1)     要实现重写,要求子类和父类的方法名字,参数列表必须完全一样。

    (2)     如果子类调用父类的某个方法(public/protected),则可以使用parent::方法()或父类名::方法()。

    (3)     子类重写父类方法时候,不能缩小父类方法的权限。扩大父类权限没有出错。

    当子类没有覆盖父类的方法,子类调用父类的方法;当子类覆盖了父类的方法,子类会调用自己的方法,这也体现了多态性。

  • 相关阅读:
    一些图形API函数收录
    VC6.0常见编译错误及解决方法
    Google Test Primer(入门)(六) 结束部分
    转帖:C++程序内存泄露检测
    Google Test Primer(四)——简单测试
    Android Snippet
    DCAApp 和 DXPApp 类的探索
    WEB(Javascript)远程调用方案清单
    做一个treeview dropdownlist 最近会放上来
    DotLucene:37行代码全文搜索
  • 原文地址:https://www.cnblogs.com/usa007lhy/p/4898591.html
Copyright © 2020-2023  润新知