PHP 객체 지향 오버로딩을 위한 새로운 메소드 인스턴스에 대한 자세한 설명

伊谢尔伦
풀어 주다: 2023-03-13 08:42:01
원래의
1055명이 탐색했습니다.

PHP를 배울 때, PHP의 메소드는 오버로드될 수 없다는 것을 알게 됩니다. 소위 메서드 오버로딩은 동일한 메소드 이름을 다른 "매개변수 수" 또는 "매개변수 유형"에 따라 정의하는 것입니다. 동일한 메소드 이름을 가진 다른 메소드.

12. 새로운 메소드 오버로드
PHP를 배우다 보면, PHP의 메소드는 오버로드될 수 없다는 것을 알게 됩니다. 소위 메소드 오버로딩은 "매개변수" "번호" 또는 "매개변수 유형"을 통해 동일한 메소드 이름을 정의하는 것입니다. 다른 이름으로 동일한 메서드에 액세스하려면 다릅니다. 그러나 PHP는 약한 유형의 언어이기 때문에 메소드의 매개변수에서 다양한 유형의 데이터를 받을 수 있으며, PHP 메소드는 무한한 수의 매개변수를 받을 수 있으므로 다른 수의 매개변수를 전달하여 호출할 수 없습니다. 동일한 메소드 이름을 가진 다른 메소드도 유효하지 않습니다. 따라서 PHP에는 메소드 오버로딩이 없습니다. 오버로드될 수 없습니다. 즉, 동일한 메서드 이름을 가진 메서드를 프로젝트에 정의할 수 없습니다. 또한, PHP에는 이름 부분공간 개념이 없기 때문에 동일한 이름의 메소드는 동일한 페이지 및 포함된 페이지에 정의될 수 없으며, 물론 PHP에서 제공하는 메소드와 동일한 이름으로 정의될 수도 없습니다. 동일한 클래스에는 동일한 이름의 메소드를 정의할 수 없습니다.
여기서 새로운 메서드를 오버로드한다는 것은 무엇을 의미하나요? 사실, 우리가 새 메소드 오버로드라고 부르는 것은 하위 클래스가 상위 클래스의 기존 메소드를 덮어쓰는 것입니다. 상위 클래스의 메소드를 직접 상속받아 사용할 수는 없나요? 하지만 우리가 다루어야 할 몇 가지 상황이 있습니다. 예를 들어 앞서 언급한 예에는 "Person" 인간에 "speak" 메서드가 있고 "Person" 클래스를 상속하는 모든 하위 클래스는 Can "speak"입니다. , "Student"
클래스는 "Person" 클래스의 하위 클래스이므로 "Student" 인스턴스는 "말할" 수 있지만 인간의 "speak
talk" 메서드는 "Person" 클래스의
attributes
라고 말합니다. , "Student" 클래스는 "Person" 클래스를 확장하고 몇 가지 새로운 속성을 추가합니다. 상속된 "say()" 말하기 메서드를 사용하는 경우
"Person" 클래스에서 상속된 속성을 알려줄 수 있는 경우에만 가능합니다. 상속된 "say()" 메소드를 사용하여 새로 확장된 속성을 말할 수는 없습니다. 그러면 어떤 사람들은 'Student' 하위 클래스가 말하기를 위한 새로운 메소드를 정의하는 것만으로도 충분하지 않을까요? 하위 클래스의 속성? 추상적인 관점에서 볼 때 "학생"은 두 가지 말하기 방법을 가질 수 없습니다. 두 가지 다른 말하기 방법을 정의하더라도 원하는 "말하기" 방법을 얻을 수 있습니다. 상속된 항목은 사용할 기회가 없을 수 있으며, 상속된 항목은 삭제할 수 없습니다.
이때는 Coverage를 사용하겠습니다.
PHP에서는 동일한 이름의 메소드를 정의할 수 없지만, 부모-자식 관계를 갖는 두 클래스에서는 하위 클래스에서 상위 클래스와 동일한 이름의 메소드를 정의하여 상위 클래스에서 상속받은 메소드를 재정의할 수 있습니다. .
코드 조각


코드는 다음과 같습니다.

<?php 
//定义一个“人”类做为父类 
class Person{ 
//下面是人的成员属性 
var $name; //人的名子 
var $sex; //人的性别 
var $age; //人的年龄 
//定义一个
构造方法
参数为属性姓名$name、性别$sex和年龄$age进行赋值 
function construct($name, $sex, $age){ 
$this->name=$name; 
$this->sex=$sex; 
$this->age=$age; 
} 
//这个人可以说话的方法, 说出自己的属性 
function say() { 
echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>"; 
} 
} 
class Student 
extends
 Person 
{ 
var $school; //学生所在学校的属性 
//这个学生学习的方法 
function study() { 
echo "我的名子叫:".$this->name." 我正在”.$this->school.”学习<br>"; 
} 
//这个学性可以说话的方法, 说出自己所有的属性,覆盖了父类的同名方法 
function say() { 
echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."我在 
".$this->school."上学.<br>"; 
} 
} 
?>
로그인 후 복사
위의 예에서는 "Student" 하위 클래스의 상위 클래스에서 상속된 "say()" 메서드를 재정의하여 구현했습니다. "메서드" 확장됨.
그러나 이렇게 하면 위에서 언급한 문제가 해결되지만 실제 개발에서는 메서드가
하나의 코드 또는 여러 개의 코드로 구성될 수 없습니다. 예를 들어 "Person" 클래스의 "say()" 메서드에는 100개의 코드가 있습니다. 이 메서드의 원래 기능을 덮어쓰고 유지하면서 좀 더 많은 기능을 추가하려면 원래 100줄의 코드를 한 번 다시 작성하고 몇 줄의 확장된 코드를 추가해야 합니다. 하지만 어떤 경우에는 원본 코드가 상위 클래스의 메서드에 표시되지 않습니다. 이때 원본 코드를 어떻게 다시 작성합니까? 우리는 또한 해결책을 가지고 있습니다. 즉, 하위 클래스의 메서드에서 상위 클래스의 재정의된 메서드를 호출할 수 있습니다. 즉, 재정의된 메서드의 원래 기능을 가져와 자신만의 함수 중 일부를 추가하는 것입니다. 하위 클래스의 메서드에서 상위 클래스의 재정의된 메서드를 호출하는 방법은 두 가지입니다.
하나는 상위 클래스의 "클래스 이름::"을 사용하여 상위 클래스의 재정의된 메서드를 호출하는 것입니다. "parent:" :" 상위 클래스에서 재정의된 메서드를 호출하는 메서드;
코드 조각


코드는 다음과 같습니다.
class Student extends Person{ 
var $school; //学生所在学校的属性 
//这个学生学习的方法 
function study() { 
echo "我的名子叫:".$this->name." 我正在”.$this->school.”学习<br>"; 
} 
//这个学性可以说话的方法, 说出自己所有的属性,覆盖了父类的同名方法 
function say() { 
//使用父类的“类名::“来调用父类中被覆盖的方法; 
// Person::say(); 
//或者使用“parent::”的方试来调用父类中被覆盖的方法; 
parent::say(); 
//加上一点自己的功能 
echo “我的年龄是:".$this->age."我在".$this->school."上学.<br>"; 
} 
}
로그인 후 복사


이제 상위 클래스에서 재정의된 메서드에 액세스하는 두 가지 방법이 있습니다. 우리는 무엇을 선택합니까? 사용자는

会发现自己写的代码访问了父类的变量和函数。如果子类非常精炼或者父类非常专业化的时
候尤其是这样。不要用代码中父类文字上的名字,应该用特殊的名字parent,它指的就是子
类在extends 声明中所指的父类的名字。这样做可以避免在多个地方使用父类的名字。如果继
承树在实现的过程中要修改,只要简单地修改类中extends 声明的部分。
同样,构造方法在子类中如果没有声明的话,也可以使用父类中的构造方法,如果子类
中重新定义了一个构造方法也会覆盖掉父类中的构造方法,如果想使用新的构造方法为所有
属性赋值也可以用同样的方式。
代码片段

代码如下:

class Student extends Person{ 
var $school; //学生所在学校的属性 
function construct($name, $sex, $age, $school){ 
//使用父类中的方法为原有的属性赋值 
parent::construct($name, $sex, $age); 
$this->school=$school; 
} 
//这个学生学习的方法 
function study() { 
echo "我的名子叫:".$this->name." 我正在”.$this->school.”学习<br>"; 
} 
//这个人可以说话的方法, 说出自己的属性 
function say() { 
parent::say(); 
//加上一点自己的功能 
echo “我的年龄是:".$this->age."我在".$this->school."上学.<br>";
로그인 후 복사


위 내용은 PHP 객체 지향 오버로딩을 위한 새로운 메소드 인스턴스에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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