>  기사  >  백엔드 개발  >  PHP 객체지향의 세 가지 주요 특징을 알아보세요.

PHP 객체지향의 세 가지 주요 특징을 알아보세요.

不言
不言원래의
2018-04-08 12:30:402004검색

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

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

코드 복사 코드는 다음과 같습니다.

<?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); )는 protected 또는 private
__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; 
?>

//위 코드는 이해하기에 충분하지만 권장되지 않습니다. use


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
해결 방법: Inherit

코드 복사 코드는 다음과 같습니다.

<?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 하위 클래스. name 확장 상위 클래스 이름 {}
세부 사항:
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. 하위 클래스 객체를 생성할 때 해당 상위 클래스의 생성자는 기본적으로 자동으로 호출되지 않습니다.예:

클래스 A{

public 함수 __construct (){
echo 'A'
}
}
클래스 B 확장 A{
public function __construct(){
echo 'B'
}
}
$b=new B();/ /여기서 B의 생성자가 먼저 출력됩니다. B에 생성자가 없으면 A의 생성자가 출력됩니다. 3. 하위 클래스에서 상위 클래스의 메서드에 액세스해야 하는 경우(생성자 및 멤버 메서드의 수정자는 다음과 같습니다. protected 또는 private), parent class::method name 또는 parent::method name을 사용하여 완료할 수 있습니다. [여기서 parent와 이전에 언급한 self는 모두 소문자이며 오류는 대문자로 보고됩니다.]
class A{
public function test(){
echo 'a_test';
}
}
class B는 A를 확장합니다.
}
}
$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、如果子类要去调用父类的某个方法(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面向对象五大原则之依赖倒置原则(DIP)详解_php技巧

PHP面向对象五大原则之里氏替换原则(LSP)详解

PHP面向对象五大原则之开放-封闭原则(OCP)详解

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

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