>  기사  >  백엔드 개발  >  (고급) PHP 객체지향의 세 가지 주요 기능(캡슐화, 상속, 다형성)을 알아봅니다.

(고급) PHP 객체지향의 세 가지 주요 기능(캡슐화, 상속, 다형성)을 알아봅니다.

黄舟
黄舟원래의
2017-02-07 10:02:501373검색

다음은 기사 전문입니다.


1. Encapsulation

Encapsulation은 추출된 데이터와 해당 데이터에 대한 연산을 함께 캡슐화하는 것입니다. . 내부적으로 보호되며 프로그램의 다른 부분에서 승인된 작업(메서드)만 데이터에 대해 작업할 수 있습니다.

php는 세 가지 액세스 제어 수정자를 제공합니다.

public은 전역, 이 클래스 내부, 클래스 외부 및 하위 클래스에 액세스할 수 있음을 의미합니다.

protected는 보호됨을 의미합니다. 이 클래스 또는 하위 클래스만 가능합니다. access

private은 private을 의미하며 이 클래스 내에서만 액세스할 수 있습니다.

위 세 가지 수식자는 메소드와 속성(변수)을 모두 수정할 수 있습니다. 메소드가 없는 경우 액세스 수식자는 기본적으로 public으로 설정됩니다. 및 멤버 속성은 액세스 한정자를 지정해야 합니다. PHP4에는 공개 속성을 의미하는 var $name을 작성하는 방법도 있습니다.

예:

<?php 
class Person{ 
    public $name; 
    protected $age; 
    private $salary; 
    function __construct($name,$age,$salary){ 
        $this->name=$name; 
        $this->age=$age; 
        $this->salary=$salary; 
    } 
    public function showinfo(){ 
        //这表示三个修饰符都可以在本类内部使用 
        echo $this->name."||".$this->age."||".$this->salary; 
    } 
} 
$p1=new Person(&#39;张三&#39;,20,3000); 
//这里属于类外部,那么如果用下面的方法访问age和salary都会报错 
// echo $p1->age; echo$p1->salary; 
?>


그럼 외부에서 보호된 요소와 비공개 요소 및 메서드에 액세스하려면 어떻게 해야 하나요?

일반적인 접근 방식은 공개 함수를 통해 이러한 변수 형식에 액세스하는 것입니다.

public function setxxxx($val){ 
    $this->xxxx=$val; 
} 
public function getxxxx(){ 
    return $this->xxxx; 
}

여기서 설정하고 가져오는 것은 식별의 편의를 위한 것일 뿐 필수는 아닙니다.

예:

public function getsalary(){ 
    return $this->salary; 
    //扩展:这里可以调用一些方法,如判断用户名等,正确才给访问 
}

외부적으로 echo $p1->getsalary();를 사용할 수 있습니다.

보호되고 비공개로 액세스하려면 다음 방법을 사용할 수도 있지만 권장되지 않습니다. , 그냥 이해하세요

__set() 및 __get()

__set()은 보호 속성 또는 비공개 속성에 값을 할당합니다

__set($name,$val);

__get()은

__get($name)

예:

<?php 
class testa{ 
    protected $name; 
    //使用__set()来管理所有属性 
    public function __set($pro_name,$pro_val){ 
        //上面$pro_name和$pro_val可自定义 
        //下面$this->pro_name为既定,不可更改 
        $this->pro_name=$pro_val; 
    } 
    //使用__get()来获取所有属性值 
    public function __get($pro_name){ 
        if(isset($pro_name)){ 
            return $this->pro_name; 
        } else { 
            return null; 
        } 
    } 
} 
$n1=new testa(); 
//正常情况,类外部是不能访问protected属性的,
但是用了上面的方法就可以对它们进行操作 
$n1->name=&#39;小三&#39;; 
echo $n1->name; 
?>


의 값을 얻습니다.

2. 상속

먼저 예시를 살펴보겠습니다:

<?php 
class Pupil{ 
    public $name; 
    protected $age; 
    public function getinfo(){ 
        echo $this->name.&#39;||&#39;.$this->age; 
    } 
    public function testing(){ 
        echo &#39;this is pupil&#39;; 
    } 
} 
class Graduate{ 
    public $name; 
    protected $age; 
    public function getinfo(){ 
        echo $this->name.&#39;||&#39;.$this->age; 
    } 
    public function testing(){ 
        echo &#39;this is Graduate&#39;; 
    } 
} 
?>

위 예시에서 볼 수 있듯이, 여러 클래스가 공통 속성과 메소드를 많이 가질 경우,

코드 재사용성이 높지 않고 코드가 중복되는 경우 CSS에서 처리하는 방법을 생각해 보세요

해결 방법: 상속

<?php 
class Students{ 
    public $name; 
    public $age; 
    public function __construct($name,$age){ 
        $this->name=$name; 
        $this->age=$age; 
    } 
    public function showinfo(){ 
        echo $this->name.&#39;||&#39;.$this->age; 
    } 
} 
class Pupil extends Students{ 
    function testing(){ 
        echo &#39;Pupil &#39;.$this->name.&#39; is testing&#39;; 
    } 
} 
class Graduate extends Students{ 
    function testing(){ 
        echo &#39;Graduate &#39;.$this->name.&#39; is testing&#39;; 
    } 
} 
$stu1=new Pupil(&#39;张三&#39;,20); 
$stu1->showinfo(); 
echo &#39;<br/>&#39;; 
$stu1->testing(); 
?>

위에서 알 수 있듯이 상속은 하위 클래스(Subclass)입니다. )는 상위 클래스를 확장합니다

클래스(BaseClass)의 공개 및 보호 속성과 메소드는 계속됩니다.

비공개 속성과 메소드를 상속할 수 없습니다.

구문 구조:

class 父类名{} 
class 子类名 extends 父类名{}


세부 정보:

1. 하위 클래스는 하나의 상위 클래스만 상속할 수 있습니다(여기서는 직접 상속을 나타냄). 여러 클래스,

는 여러 레이어를 사용할 수 있습니다. 상속

예:

<?php 
class A{ 
    public $name=&#39;AAA&#39;; 
} 
class B extends A{ 
    public $age=30; 
} 
class C extends B{} 
$p=new C(); 
echo $p->name;//这里会输出AAA 
?>

2. 하위 클래스 객체를 생성할 때 해당 상위 클래스의 생성자는 기본적으로 자동으로 호출되지 않습니다.

예:

class A{ 
    public function __construct(){ 
        echo &#39;A&#39;; 
    } 
} 
class B extends A{ 
    public function __construct(){ 
        echo &#39;B&#39;; 
    } 
} 
$b=new B();//这里会优先输出B中的构造方法,

B에 생성자 메소드가 없으면 A의

가 출력됩니다. 3. 상위 클래스의 메소드에 액세스해야 하는 경우. 하위 클래스에서(생성자 메서드 및 멤버 메서드의 수정자는 protected 또는 private입니다)

그런 다음 상위 클래스:: 메서드 이름 또는 parent:: 메서드 이름을 사용하여

여기에서 완료할 수 있습니다. parent와 앞서 언급한 self는 모두 소문자이며, 대문자로 하면 오류가 보고됩니다.]

class A{ 
    public function test(){ 
        echo &#39;a_test&#39;; 
    } 
} 
class B extends A{ 
    public function __construct(){ 
        //两种方法都行 
        A::test(); 
        parent::test(); 
    } 
} 
$b=new B();

5. 하위 클래스(파생 클래스)의 메소드가 상위 클래스의 메소드와 완전히 동일한 경우( 공개, 보호),

이를 메서드 재정의 또는 메서드 재정의(override)라고 합니다. 아래를 참조하세요 다형성

3. 다형성

예:

<?php 
class Animal{ 
    public $name; 
    public $price; 
    function cry(){ 
        echo &#39;i don\&#39;t know&#39;; 
    } 
} 
class Dog extends Animal{ 
    //覆盖、重写 
    function cry(){ 
        echo &#39;Wang Wang!&#39;; 
        Animal::cry();//这里不会报错,能正确执行父类的cry(); 
    } 
} 
$dog1=new Dog(); 
$dog1->cry(); 
?>

요약:

1. 상위 클래스가 모든 하위 클래스에 메서드가 있다는 것을 알고 있지만 상위 클래스가 메서드 작성 방법을 결정할 수 없는 경우 하위 클래스가 해당 메서드를 덮어쓰도록 할 수 있습니다. 하위 클래스의 메서드 이름과 매개 변수 수가 정확히 동일해야 합니다.

2. 하위 클래스가 상위 클래스(보호/공용)의 메서드를 호출하려는 경우 상위 클래스 이름을 사용할 수 있습니다. :메서드 이름 또는 부모::메서드 이름

3. 메소드 재작성을 구현할 때 액세스 한정자는 다를 수 있지만 하위 클래스 메소드의 액세스 권한은 해당 메소드의 액세스 권한보다 크거나 같아야 합니다. 상위 클래스 메서드(즉, 상위 클래스 메서드의 액세스 권한을 줄일 수 없음)

예를 들어 상위 클래스 공용 함수 cry( ){} 하위 클래스 보호 함수 cry(){}는 오류를 보고합니다.

그러나 하위 클래스의 액세스 권한은 다음과 같이 확장될 수 있습니다:

父类private function cry(){} 子类 protected function cry(){} 可以正确执行

위는 (고급) PHP 객체 지향 3가지 주요 기능(캡슐화, 상속, 다형성)에 대해 알아봅니다. .더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


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