> 백엔드 개발 > PHP 튜토리얼 > PHP 객체지향의 캡슐화, 상속, 다형성의 세 가지 주요 특성에 대한 자세한 예

PHP 객체지향의 캡슐화, 상속, 다형성의 세 가지 주요 특성에 대한 자세한 예

伊谢尔伦
풀어 주다: 2023-03-11 22:08:02
원래의
1510명이 탐색했습니다.

PHP 객체지향 학습의 세 가지 주요 특징 학습 목표: 추상화, 캡슐화, 상속, 다형성을 완전히 이해

객체지향의 세 가지 주요 특징: 캡슐화, 상속, 다형성 먼저 추상화를 간단히 이해합니다.
앞서 수업에서 우리는 실제로 사물의 클래스의 공통 속성과 동작을 추출하여 물리적 모델(템플릿)을 형성했습니다. 이러한 문제 연구 방법을 추상화라고 합니다.
PHP 객체지향의 캡슐화, 상속, 다형성의 세 가지 주요 특성에 대한 자세한 예
1. 캡슐화
캡슐화는 추출된 데이터를 캡슐화하고 데이터에 대한 작업은 내부적으로 보호되며 프로그램의 다른 부분에서 승인된 작업(메서드)만 데이터에 대해 작업할 수 있습니다.
php는 세 가지 유형의 접근 제어 수정자를 제공합니다.
public은 전역, 이 클래스 내부, 클래스 외부 및 하위 클래스에 액세스할 수 있음을 의미합니다.
protected는 보호됨을 의미하며, 이 클래스 또는 하위 클래스만 액세스할 수 있음을 의미합니다.
private은 비공개를 의미하며, 이 클래스 내에서만 액세스할 수 있습니다
위의 세 가지 수정자는 메소드와 속성(변수)을 모두 수정할 수 있습니다. 메소드에 액세스 수정자가 없으면 기본값은 public입니다. 멤버 속성은 액세스 수정자를 지정해야 합니다. 이는 PHP4에서도 작성됩니다. 이런 방식의 작성은 권장되지 않습니다
예:

<?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를 사용할 수 있습니다. (); 외부적으로
protected 및 private에 액세스하려는 경우 다음 방법을 사용할 수도 있지만 권장되지 않습니다.
set() 및 get()
set()는 protected 또는 private에 값을 할당합니다. 속성
set($name,$val ;

<?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; 
?>
로그인 후 복사

위의 예에서 볼 수 있듯이 여러 클래스에 공통된
속성 및 메서드
가 많으면 코드 재사용성이 높지 않고 코드가 중복됩니다. 처리 방법을 생각해 보세요. in CSS

솔루션: 상속

<?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;; 
} 
} 
?>
로그인 후 복사

위에서 볼 수 있듯이 상속은 상위 클래스(BaseClass)의 공개 및 보호 속성과 메서드를 확장된 상위 클래스를 통해 상속하는 하위 클래스(Subclass)입니다. 구문 구조: 클래스 상위 클래스 이름{} 클래스 하위 클래스 이름은 상위 클래스 이름을 확장합니다.{}
세부 사항:

1. 하위 클래스는 하나의 상위 클래스만 상속할 수 있습니다(여기에서는 상속을 의미함). 여러 클래스의 속성과 메소드를 사용하면 다중 레이어 상속을 사용할 수 있습니다.

예:

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

예:

<?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 
?>
로그인 후 복사

3. 클래스의 하위 클래스 Methods에서 상위에 액세스해야 하는 경우(생성자 및 멤버 메소드의 수정자는 protected 또는 private입니다.) 상위 클래스::메소드 이름 또는 parent::메소드 이름을 사용하여 [여기 앞에서 언급한 parent와 self는 모두 소문자입니다. 오류는 대문자입니다.]

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中的
로그인 후 복사

5. 하위 클래스(파생 클래스)의 메소드가 상위 클래스(public, protected)의 메소드와 완전히 동일하면 이를 호출합니다. 메서드 적용 범위 또는 메서드 재정의(override), 아래에서 자세한 내용을 참조하세요. Morphism

3. Polymorphism 예:

<?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、如果子类要去调用父类的某个方法(protected/public),可以使用 父类名::方法名 或者 parent::方法名
3、在实现方法重写的时候,访问修饰符可以不一样,但是子类方法的访问权限必须大于等于父类方法的访问权限(即不能缩小父类方法的访问权限)
如 父类public function cry(){} 子类 protected function cry(){} 则会报错
但是子类的访问权限可以放大,如:
父类private function cry(){} 子类 protected function cry(){} 可以正确执行
扩展:
方法重载(overload)
基本概念:函数名相同,但参数的个数或参数的类型不同,达到调用同一个函数,可以区分不同的函数
在PHP5中虽然也支持重载,但是和其它语言还是有很大区别的,php中不能定义多个同名函数
PHP5中提供了强大的“魔术”函数,使用这些魔术函数,我们可以做到函数重载,
这里我们要到到 call,当一个对象调一个方法时,而该方法不存在,则程序会自动调用call
【官方不推荐使用】
PHP中有以下几个魔术常量:LINE FILE DIR FUNCTION CLASS 等
例:

<?php 
class A{ 
function test1($p){ 
echo &#39;test1<br/>&#39;; 
} 
function test2($p){ 
echo &#39;test2<br/>&#39;; 
} 
function call($method,$p){ 
//这里$p为数组,上面两个变量名可自定义 
if($method == &#39;test&#39;){ 
if(count($p)==1){ 
$this->test1($p); 
} else if(count($p)==2){ 
$this->test2($p); 
} 
} 
} 
} 
$a=new A(); 
$a->test(5); 
$a->test(3,5); 
?>
로그인 후 복사


위 내용은 PHP 객체지향의 캡슐화, 상속, 다형성의 세 가지 주요 특성에 대한 자세한 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿