>  기사  >  백엔드 개발  >  PHP 객체지향의 세 가지 주요 특징을 분석합니다.

PHP 객체지향의 세 가지 주요 특징을 분석합니다.

巴扎黑
巴扎黑원래의
2017-06-26 15:20:331589검색
class BenHang extends Card{     /*构造函数与及构造的继承*/ function __construct($cardno,$pwd, $name,$money){
         parent::__construct($cardno,$pwd, $name,$money);
     }    
     function take($money){         echo "本行取款{$money}没有手续费·····<br>";
     }function zhuan($money){         echo "本行转账{$money}·····<br>";
     }
    
 }$benhang=new BenHang(123,344,444,444);$benhang->check();$benhang->take(234);$benhang->zhuan(4555);/*其他银行卡的类*/class Qita extends Card{function __construct($cardno,$pwd, $name,$money){
         parent::__construct($cardno,$pwd, $name,$money);
     }    function take($money){         echo "非本行取款{$money}有手续费2元·····<br>";
     }
}$qita=new Qita(123,344,444,444);$qita->check();$qita->take(99);
ㅋㅋㅋ                 , 상속을 어떻게 구현하나요?

하위 클래스가 상위 클래스를 상속받도록 하려면 하위 클래스에 확장 키워드를 사용하세요.

class Student는 Person을 확장합니다.{}

2. 상속을 구현할 때 주의할 사항은 무엇입니까?

① 하위 클래스는 상위 클래스의 비공개 속성만 상속할 수 있습니다.

②하위 클래스가 상위 클래스를 상속받은 후 상위 클래스의 속성과 메서드를 하위 클래스에 복사하는 것과 동일하며 $this를 사용하여 직접 호출할 수 있습니다. ③ PHP는 단일 상속만 지원하며, 하나의 클래스가 여러 클래스를 상속하는 것을 지원하지 않습니다. 그러나 클래스는 다중 레벨 상속을 수행합니다.

class Person{}

//Student 클래스 Chengnian 클래스와 Person 클래스의 속성과 메서드를 모두 갖습니다.

3. 메소드 오버라이드(메소드 재작성)

조건 ① 하위 클래스는 상위 클래스를 상속받습니다.

조건 ② 하위 클래스는 상위 클래스의 기존 메서드를 재정의합니다.           위의 두 가지 조건을 충족하는 것을 메소드 커버리지라고 합니다. 재정의 후 하위 클래스가 메서드를 호출하면 하위 클래스의 자체 메서드가 호출됩니다.

마찬가지로 메서드 재정의 외에도 하위 클래스는 속성 재정의를 위해 상위 클래스와 동일한 이름의 속성을 가질 수도 있습니다.

4. 하위 클래스가 상위 클래스 메서드를 재정의하는 경우 하위 클래스에서 동일한 이름을 가진 상위 클래스 메서드를 호출하는 방법은 무엇입니까? : PARTENT :: 메소드 이름 ();

따라서 하위 클래스가 상위 클래스를 상속하는 경우 하위 클래스 구조의 첫 번째 단계를 먼저 호출해야 합니다.

       function __construct($name,$sex,$school){

             parent::__construct($name,$sex);

             $this->school = $school;

       }

实例一枚:

class Person{protected $name;public $sex;
        function __construct($name,$sex){     //声明构造函数            $this->name = $name;
            $this->sex = $sex;
        }
        function say(){
            echo "我叫{$this->name},我是{$this->sex}生!<br>";
        }
    }    class Student extends Person{                       //子类继承父类public $school;                                           function __construct($name,$sex,$school){          //子类的构造函数            parent::__construct($name,$sex);        //调用父类构造进行复制$this->school = $school;
        }
        
        function program(){
            echo "PHP真好玩!我爱PHP!PHP是世界上最好用的编程语言!<br>";
        }
        
        function say(){
            parent::say();                      //重写父类的同名方法echo "我是{$this->school}的";
        }
    }
    
    $zhangsan = new Student("张三","男","起航");
    $zhangsan->say();
    $zhangsan->program();

 

二、封装

  1、什么是封装?
   通过访问修饰符,将类中不需要外部访问的属性和方法进行私有化处理,以实现访问控制。
【注意】是实现访问控制,而不是拒绝访问。 也就是说,我们私有化属性之后,需要提供对应的方法,让用户通过我们提供的方法处理属性。
2、封装的作用?
    ①使用者只关心类能够提供的功能,而不必关心功能实现的细节!(封装方法)
    ②对用户的数据进行控制,防止设置不合法数据,控制返回给用户的数据(属性封装+set/get方法)
  3、实现封装操作?
   ① 方法的封装
    对于一些只在类内部使用的方法,而不像对外部提供使用。那么,这样的方法我们可以使用private进行私有化处理。
     private function formatName(){}        //这个方法仅仅能在类内部使用$this调用
         function showName(){
          $this -> formatName();
       }
②属性的封装+set/get方法
속성의 설정 및 읽기를 제어하려면 속성을 민영화하고 사용자가 제공하는 세트/get 메소드를 통해 설정을 설정해야 할 수 있습니다.
   Return $this->age; & $ Object-& gt; getage ()
$ object-& gt;
+마법의 방법
개인 $ 연령
                                             ...                                                                         $key=$value; ㅋㅋ > , __set() 매직 메소드가 자동으로 호출되고 set 속성 이름이 및 속성 값이 전달됩니다. __set() 메서드를 제공하세요.
【 注意】在魔术方法中,可以使用分支结构,判断$key的不同,进行不同操作。
  4、关于封装的魔术方法:
     ① __set($key,$value):给类私有属性赋值时自动调用,调用时给方法传递两个参数:需要设置的属性名、属性值;
     ② __get($key):读取类私有属性时自动调用,调用时给方法传递一个参数:需要读取的属性名;
     ③ __isset($key):外部使用isset()函数检测私有属性时,自动调用。
       >>> 类外部使用isset();检测私有属性,默认是检测不到的。false
       >>> 所以,我们可以使用__isset();函数,在自动调用时,返回内部检测结果。
       function __isset($key){
              return isset($this->$key);
            }
当外部使用isset($对象名->私有属性);检测时,将自动调用上述__isset()返回的结果!
    ④ __unset($key):外部使用unset()函数删除私有属性时,自动调用;
       function __unset($key){
           unset($this->$key);
           }
  当外部使用unset($对象名->私有属性);删除属性时,自动将属性名传给__unset(),并交由这个魔术方法处理。
实例一枚
class Person{public $name;public $age;public $sex;
        function __construct($name, $age,$sex){
            $this->name=$name;
            $this->setAge($age);
            $this->setSex($sex);
        }
        function setAge($age){if($age>=0&&$age<=120){return $this->age=$age;
            }else{
                die("年龄输入有误!!!");
            }
        }
        function setSex($sex){if($sex=="女"||$sex=="男"){return    $this->sex=$sex;
            }else{
                die("性别输入有误!!!");
            }
        }
        function say(){
            echo "我的名字叫{$this->name},我的年龄{$this->age},我的性别是{$this->sex}<br>";
        }
    }class Work extends Person{private $position;
        function __construct($name, $age,$sex,$position){
            parent::__construct($name, $age,$sex);
            $this->job=$job;
            $this->setPosition($position);
        }
        function setPosition($position){
            $arr=['总监','董事长','程序员','清洁工'];if(in_array($position, $arr)){return $this->position=$position;
            }else{
                die("不存在该职位");
            }
        }        
        function __set($key,$value){if($key=="age"){return    parent::setAge($value);
            }
            elseif($key=="sex"){return    parent::setSex($value);
            }
            elseif($key=="position"){return $this->setPosition($value);
            }return $this->$key=$value;
        }
        
        function say(){
            parent::say();
            echo "我的职位是{$this->position}";
        }
     }
     
    $zhangsan=new Work("张三",22,"男","总监");
    $zhangsan->setSex("女");
    $zhangsan->setAge(30);//  $zhangsan->setPosition("董事长");$zhangsan->position="董事长";
    $zhangsan->name="lisi";$zhangsan->say();

 

三.多态
  3.1、什么是多态?
     多态实现多态的前提是实现继承。
      1.一个类被多个子类继承,如果这个类的某个方法在多个子类中表现出不同的功能,我们称这种行为为多态。在PHP中的方法重写,
     2.实现多态的必要途径:
      ⑴子类继承父类;
      ⑵重写父类方法;
      ⑶父类引用指向子类对象;
     
/*墨盒接口
 * 纸张接口*/
 interface InkBox{     function color();
 }interface Paper{     function sizes();
 }class Computer{function fangfa(InkBox $a,Paper $b){     //父类引用echo "即将开始打印····<br>";    $a->color();$b->sizes();echo "打印结束···<br>";    
    
  }
}class Color implements InkBox{function color(){echo "正在装载彩色墨盒<br>";echo "实现彩色墨盒<br>";
    }
}class White implements InkBox{function color(){echo "正在装载黑白墨盒<br>";    echo "实现黑白墨盒<br>";
    }
}class A4 implements Paper{function sizes(){echo "正在加载A4纸张<br>";echo "实现A4纸张<br>";
    }
}class A5 implements Paper{function sizes(){echo "实现A5纸张<br>";
    }
}$com=new Computer();//创建对象$com->fangfa(new Color(),new A4());//子类对象

 

 

위 내용은 PHP 객체지향의 세 가지 주요 특징을 분석합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.