PHP 객체지향LOGIN

PHP 객체지향

객체 지향 프로그래밍(영어: 객체 지향 프로그래밍, 약어: OOP)에서 객체는 정보와 정보를 처리하는 방법에 대한 설명으로 구성된 전체이며 현실 세계의 추상화입니다. OOP는 재사용성, 유연성, 확장성이라는 소프트웨어 엔지니어링의 세 가지 목표를 달성합니다.

PHP는 버전 4.0 이후 OOP에 대한 지원을 개선했습니다. 소규모 애플리케이션의 경우 기존 절차 프로그래밍을 사용하는 것이 더 간단하고 효율적일 수 있습니다. 그러나 크고 복잡한 애플리케이션의 경우 OOP를 고려해야 합니다.

클래스

클래스는 동일한 속성과 서비스를 가진 개체의 모음입니다. 이는 속성과 서비스라는 두 가지 주요 부분을 포함하는 이 클래스에 속하는 모든 개체에 대한 통합된 추상 설명을 제공합니다. 객체 지향 프로그래밍 언어에서 클래스는 독립적인 프로그램 단위이며 클래스 이름이 있어야 하며 속성 설명과 서비스 설명이라는 두 가지 주요 부분을 포함해야 합니다.

객체

객체는 시스템에서 객관적인 것을 기술하는 데 사용되는 개체입니다. 시스템을 구성하는 기본 단위입니다. 객체는 속성 집합과 속성 집합에서 작동하는 서비스 집합으로 구성됩니다.

현실 세계에서 우리가 마주하는 사물은 컴퓨터, 텔레비전, 자전거 등의 사물입니다.

객체의 주요 세 가지 특성:

객체의 동작: 객체에 어떤 작업을 적용할 수 있는지, 조명을 켜고 끄는 것이 동작입니다.

객체의 모양: 해당 메소드를 적용했을 때 객체가 반응하는 방식, 색상, 크기, 모양.

사물의 표현: 사물의 표현은 신분증과 동일하며, 구체적으로는 동일한 행위와 상태에서도 차이를 구별한다.

클래스와 객체의 관계

클래스와 객체의 관계는 몰드와 캐스팅의 관계와 같습니다. 클래스의 인스턴스화 결과는 객체이고 유형의 추상화입니다. 객체는 클래스입니다.

예를 들어 Animal은 개와 양을 지정할 수 있는 추상 클래스이고, 개와 양은 색상 속성을 가지며, 작성할 수 있고, 기타 동작 상태를 갖습니다.

105.png


객체 지향 콘텐츠

클래스 - 사물의 추상적인 특성을 정의합니다. 클래스의 정의에는 데이터의 형식과 데이터에 대한 작업이 포함됩니다.

Object - 클래스의 인스턴스입니다.

멤버 변수 - 클래스 내부에 정의된 변수입니다. 이 변수의 값은 외부 세계에는 보이지 않지만 멤버 함수를 통해 액세스할 수 있습니다. 클래스가 객체로 인스턴스화되면 변수를 객체의 속성이라고 부를 수 있습니다.

멤버 함수 - 클래스 내부에 정의되어 있으며 객체의 데이터에 액세스하는 데 사용할 수 있습니다.

상속 - 상속은 하위 클래스가 상위 클래스의 데이터 구조와 메서드를 자동으로 공유하는 메커니즘입니다. 클래스를 정의하고 구현할 때 기존 클래스를 기반으로 할 수 있고, 기존 클래스에서 정의한 콘텐츠를 자신의 콘텐츠로 가져와서 새로운 콘텐츠를 추가할 수 있습니다.

부모 클래스 - 클래스는 다른 클래스에 의해 상속됩니다. 이 클래스는 부모 클래스, 기본 클래스 또는 슈퍼 클래스라고 할 수 있습니다.

하위 클래스 - 다른 클래스를 상속하는 클래스를 하위 클래스 또는 파생 클래스라고 합니다.

다형성(Polymorphism) - 다형성은 동일한 작업, 기능 또는 프로세스가 여러 유형의 객체에 적용되어 서로 다른 결과를 얻을 수 있음을 의미합니다. 동일한 메시지를 수신할 때 서로 다른 객체가 서로 다른 결과를 생성할 수 있는 현상을 다형성이라고 합니다.

오버로딩(Overloading) - 간단히 말해서, 이름은 같지만 매개변수 목록이 다른 함수나 메소드를 오버로딩된 함수 또는 메소드라고 합니다.

추상화 - 추상화란 일관된 데이터 구조(속성)와 동작(작업)을 가진 객체를 클래스로 추상화하는 것을 말합니다. 클래스는 관련 없는 콘텐츠를 무시하면서 애플리케이션과 관련된 중요한 속성을 반영하는 추상화입니다. 모든 클래스의 구분은 주관적이지만 특정 응용 프로그램과 관련되어야 합니다.

캡슐화(Encapsulation) - 캡슐화란 현실 세계에 존재하는 객체의 속성과 동작을 하나로 묶어 논리적 단위 내에 배치하는 것을 말합니다.

생성자 - 주로 객체를 생성할 때 객체를 초기화하는 데 사용됩니다. 즉, 객체 멤버 변수에 초기값을 할당하는 데 사용됩니다. 객체를 생성하는 문에서는 항상 new 연산자와 함께 사용됩니다.

소멸자 - 소멸자(소멸자) 생성자와는 반대로 객체의 생명주기가 끝나면(예를 들어 객체가 위치한 함수가 호출된 경우) 시스템이 자동으로 소멸자를 실행합니다. 소멸자는 종종 "정리" 작업을 수행하는 데 사용됩니다(예를 들어 객체를 생성할 때 new를 사용하여 메모리 공간을 엽니다. 메모리 공간은 종료하기 전에 소멸자에서 삭제와 함께 해제되어야 합니다).

아래 그림에서는 Car 클래스를 통해 Mercedes, Bmw 및 Audi라는 세 가지 개체를 만들었습니다.

$mercedes = 새 자동차();
$bmw = 새 자동차()
$audi = 새 자동차()

>101.jpg


PHP 클래스 정의

class 키워드를 사용하여 클래스를 선언하고 그 뒤에 클래스 이름이 오고 본문이 포함됩니다. {} 기호가 나타납니다.

구문:

class class_name{

......}


클래스에는 속성과 행동 양식.

클래스 정의에서 var 키워드를 사용하여 변수를 선언하면 클래스의 멤버 속성이라고도 하는 클래스 속성을 생성할 수 있습니다.

구문:

class class_name{

var $var_name }


클래스에서 함수 선언 정의 즉, 클래스의 메서드가 생성됩니다.

구문:

클래스 클래스 이름{
함수 함수 이름(arg1,arg2,...)
{
함수 코드
}
}

속성과 메소드가 정의된 클래스는 완전한 클래스이며, 클래스에는 완전한 처리 로직이 포함될 수 있습니다. 클래스 내에서 논리를 적용하려면 new 키워드를 사용하여 개체를 인스턴스화합니다. 여러 개체를 동시에 인스턴스화할 수 있습니다.

구문:

object = new class_name();

객체를 인스턴스화한 후 -> 개체 속성 및 메서드.

구문:

object->var_name;
object->function_name;

정의된 멤버에 액세스하려는 경우 class 속성이나 메소드의 경우 의사 변수 $this를 사용할 수 있습니다. $this는 현재 개체나 개체 자체를 나타내는 데 사용됩니다.

<?php
class Person { 
//人的成员属性 
var $name; //人的名字 
var $age; //人的年龄 
//人的成员 say() 方法 
function say() { 
echo "我的名字叫:".$this->name." <br >"; 
echo "我的年龄是:".$this->age; 
} 
} //类定义结束 
//实例化一个对象 
$p1 = new Person(); 
//给 $p1 对象属性赋值 
$p1->name = "张三"; 
$p1->age = 20; 
//调用对象中的 say()方法 
$p1->say(); 
?>

이 예제를 실행하면 다음이 출력됩니다.

My name is: Zhang San
My age is: 20

Example

<?php 
class Site { 
/* 成员变量 */ 
var $url; 
var $title; 
/* 成员函数 */ 
function setUrl($par)
{ 
$this->url = $par; 
} 
function getUrl()
{ 
echo $this->url . PHP_EOL; 
} 
function setTitle($par)
{ 
$this->title = $par; 
} 
function getTitle()
{ 
echo $this->title . PHP_EOL; 
} 
} 
$php = new Site; 
$taobao = new Site; 
$google = new Site; 
// 调用成员函数,设置标题和URL 
$php->setTitle( "php中文网" ); 
$taobao->setTitle( "淘宝" ); 
$google->setTitle( "Google 搜索" ); 
$php->setUrl( 'www.php.cn' ); 
$taobao->setUrl( 'www.taobao.com' ); 
$google->setUrl( 'www.google.com' ); 
// 调用成员函数,获取标题和URL 
$php->getTitle(); 
$taobao->getTitle(); 
$google->getTitle(); 
$php->getUrl(); 
$taobao->getUrl(); 
$google->getUrl(); 
?>

인스턴스 실행 중»

위 코드를 실행하면 출력 결과는 다음과 같습니다.

php 중국 웹사이트
Taobao
Google 검색
www.php.cn
www.taobao.com
www.google.com


PHP 생성자

생성자는 특별한 방법입니다. 주로 객체를 생성할 때 객체를 초기화하는 데 사용됩니다. 즉, 객체 멤버 변수에 초기값을 할당하는 데 사용됩니다. 객체를 생성하는 문에서는 항상 new 연산자와 함께 사용됩니다. new 연산자를 사용하여 클래스의 인스턴스를 생성하면 생성자가 자동으로 호출되며 해당 이름은 __construct()여야 합니다.

클래스에서 하나의 생성자만 선언할 수 있으며 객체가 다음과 같은 경우에만 가능합니다. 매번 생성됨 생성자 메서드는 매번 한 번씩 호출됩니다. 이 메서드는 적극적으로 호출할 수 없으므로 일반적으로 몇 가지 유용한 초기화 작업을 수행하는 데 사용됩니다. 이 메서드에는 반환 값이 없습니다.

구문:

function __construct(arg1,arg2,...)
{
...
}

위의 예에서는 생성자 메서드를 통해 $url 및 $title 변수를 초기화할 수 있습니다.

<?php

function __construct( $ par1, $par2 ) {
$this->url = $par1;
$this->title = $par2
}

?>

이제 더 이상 setTitle 및 setUrl 메소드를 호출할 필요가 없습니다.

Instance

<?php 
$php = new Site('www.php.cn', 'php中文网'); 
$taobao = new Site('www.taobao.com', '淘宝'); 
$google = new Site('www.google.com', 'Google 搜索'); 
// 调用成员函数,获取标题和URL 
$php->getTitle(); 
$taobao->getTitle(); 
$google->getTitle(); 
$php->getUrl(); 
$taobao->getUrl(); 
$google->getUrl(); 
?>

인스턴스 실행»

Destructor

생성자 메서드에 해당하는 소멸자 메서드를 사용하면 파일 닫기, 결과 집합 해제 등과 같은 클래스를 삭제하기 전에 일부 작업을 수행하거나 일부 기능을 완료할 수 있습니다. 소멸자는 매개변수를 사용할 수 없으며 이름은 __destruct() 여야 합니다.

PHP 5에서는 다른 객체 지향 언어와 유사한 소멸자 개념을 도입했습니다. 구문 형식은 다음과 같습니다.

function __destruct()
{
......
}

Instance

<?php 
class MyDestructableClass { 
function __construct() { 
print "构造函数\n"; 
$this->name = "MyDestructableClass"; 
} 
function __destruct() { 
print "销毁 " . $this->name . "\n"; 
} 
} 
$obj = new MyDestructableClass(); 
?>

위 코드를 실행하면 출력 결과는 다음과 같습니다.

생성자
Destroy MyDestructableClass

생성자와 소멸자를 동시에 사용하여

<?php 
class Person { 
var $name; 
var $age; 
//定义一个构造方法初始化赋值 
function __construct($name,$age) { 
$this->name=$name; 
$this->age=$age; 
} 
function say() { 
echo "我的名字叫:".$this->name." <br >"; 
echo "我的年龄是:".$this->age." <br >";; 
} 
function __destruct() 
{ 
echo "再见".$this->name; 
} 
} 
$p1=new Person("张三", 20); 
$p1->say(); 
?>

위 코드를 실행하면 출력 결과는 다음과 같습니다.

내 이름은 Zhang San
나이는 20
안녕 Zhang San

상속됨

PHP 클래스 상속은 다음을 참조합니다. 이전에 정의된 하나 이상의 클래스에서 데이터와 메서드를 상속하고 새 데이터와 메서드를 재정의하거나 추가하여 클래스 계층 구조 또는 계층 구조를 설정할 수 있는 새로운 파생 클래스를 만드는 것입니다.

새 클래스를 파생하는 데 사용되는 기존 클래스를 상위 클래스라고 하고, 기존 클래스에서 파생된 새 클래스를 하위 클래스라고 합니다. 상속은 객체지향의 세 가지 주요 특징 중 하나입니다.

상속 메커니즘을 통해 기존 데이터 유형을 사용하여 새 데이터 유형을 정의할 수 있습니다. 정의된 새 데이터 유형에는 새로 정의된 멤버뿐만 아니라 이전 멤버도 포함됩니다.

참고: Java와 같은 언어와 달리 PHP에서는 클래스가 하나의 클래스, 즉 단일 상속에서만 데이터를 직접 상속할 수 있습니다.

extends 키워드를 사용하여 클래스 상속 정의:

class subclass extends parent class {
}

Instance

인스턴스의 Child_Site 클래스는 Site 클래스를 상속하고 다음 기능을 확장합니다.

<?php 
// 子类扩展站点类别 
class Child_Site extends Site { 
var $category; 
function setCate($par){ 
$this->category = $par; 
} 
function getCate(){ 
echo $this->category . PHP_EOL; 
} 
} 
?>

메서드 재작성

상위 클래스에서 상속된 메서드가 다음의 요구 사항을 충족할 수 없는 경우 하위 클래스 요구 사항을 다시 작성할 수 있습니다. 이 프로세스를 메서드 재정의라고 하며 메서드 재작성이라고도 합니다.

인스턴스에서 getUrl 및 getTitle 메소드가 다시 작성되었습니다.

function getUrl() {
echo $this->php_EOL
return $this; - >url
}

function getTitle(){
echo $this->title . PHP_EOL;
return $this->title; >


액세스 제어 및 캡슐화

이는 PHP에서 public, protected 또는 private 액세스 수정자를 추가하여 달성됩니다. 속성이나 메소드에 대한 액세스 제어.

유형의 액세스 한정자를 사용하면 개발자가 OOP 언어의 기능인 클래스 멤버에 대한 액세스를 제어할 수 있습니다.

PHP는 다음 세 가지 액세스 한정자를 지원합니다.

public(public): 클래스의 멤버는 액세스 제한이 없으며 모든 외부 멤버는 이 클래스에 액세스(읽기 및 쓰기)할 수 있습니다. 멤버 속성 및 멤버 메서드 포함). 클래스 멤버가 멤버 액세스 한정자를 지정하지 않으면 공개로 처리됩니다.

protected: protected로 정의된 멤버는 클래스 외부의 코드에서 액세스할 수 없지만 클래스의 하위 클래스에는 액세스 권한이 있습니다.

프라이빗(private): private으로 정의된 멤버는 같은 클래스에 속한 모든 멤버에 대한 접근을 허용하지만, 해당 클래스의 외부 코드 및 서브클래스에 대한 접근은 허용하지 않는다.

수정자 액세스 권한 비교표:

                                                                                                     
팁: 하위 클래스가 상위 클래스의 메서드를 재정의하는 경우 하위 클래스의 메서드에 대한 액세스 권한은 다음보다 낮을 수 없습니다. 상위 클래스의 재정의된 메서드에 대한 액세스 권한.

속성 액세스 제어 클래스 속성은 공개, 보호, 비공개 중 하나로 정의되어야 합니다. var로 정의하면 공개로 간주됩니다.

<?php 
/** 
* Define MyClass 
*/ 
class MyClass 
{ 
public $public = 'Public'; 
protected $protected = 'Protected'; 
private $private = 'Private'; 
function printHello()
{ 
echo $this->public; 
echo $this->protected; 
echo $this->private; 
} 
} 
$obj = new MyClass(); 
echo $obj->public; // 这行能被正常执行 
echo $obj->protected; // 这行会产生一个致命错误 
echo $obj->private; // 这行也会产生一个致命错误 
$obj->printHello(); // 输出 Public、Protected 和 Private 
/** 
* Define MyClass2 
*/ 
class MyClass2 extends MyClass 
{ 
// 可以对 public 和 protected 进行重定义,但 private 而不能 
protected $protected = 'Protected2'; 
function printHello() 
{ 
echo $this->public; 
echo $this->protected; 
echo $this->private;
} 
} 
$obj2 = new MyClass2(); 
echo $obj2->public; // 这行能被正常执行 
echo $obj2->private; // 未定义 private 
echo $obj2->protected; // 这行会产生一个致命错误 
$obj2->printHello(); // 输出 Public、Protected2 和 Undefined 
?>

메서드에 대한 액세스 제어

클래스의 메서드는 공개, 비공개 또는 보호로 정의될 수 있습니다. 이러한 키워드가 설정되지 않은 경우 메서드는 기본적으로 public으로 설정됩니다.

<?php 
/** 
* Define MyClass 
*/ 
class MyClass 
{ 
// 声明一个公有的构造函数 
public function __construct() { } 
// 声明一个公有的方法 
public function MyPublic() { } 
// 声明一个受保护的方法 
protected function MyProtected() { } 
// 声明一个私有的方法 
private function MyPrivate() { } 
// 此方法为公有 
function Foo() { 
$this->MyPublic(); 
$this->MyProtected(); 
$this->MyPrivate();
} 
} 
$myclass = new MyClass; 
$myclass->MyPublic(); // 这行能被正常执行 
$myclass->MyProtected(); // 这行会产生一个致命错误 
$myclass->MyPrivate(); // 这行会产生一个致命错误 
$myclass->Foo(); // 公有,受保护,私有都可以执行 

/** 
* Define MyClass2 
*/ 
class MyClass2 extends MyClass 
{ 
// 此方法为公有 
function Foo2() 
{ 
$this->MyPublic(); 
$this->MyProtected(); 
$this->MyPrivate(); // 这行会产生一个致命错误 
} 
} 
$myclass2 = new MyClass2; 
$myclass2->MyPublic(); // 这行能被正常执行 
$myclass2->Foo2(); // 公有的和受保护的都可执行,但私有的不行 
class Bar 
{ 
public function test() 
{ 
$this->testPrivate(); 
$this->testPublic(); 
} 
public function testPublic() 
{ 
echo "Bar::testPublic\n"; 
} 
private function testPrivate() 
{ 
echo "Bar::testPrivate\n"; 
} 
} 
class Foo extends Bar 
{ 
public function testPublic() 
{ 
echo "Foo::testPublic\n"; 
} 
private function testPrivate() 
{ 
echo "Foo::testPrivate\n"; 
} 
} 
$myFoo = new foo(); 
$myFoo->test(); // Bar::testPrivate 
// Foo::testPublic 
?>

캡슐화

캡슐화는 클래스(객체)의 속성과 서비스를 독립적인 단위로 결합하고 내부 세부 정보를 최대한 숨기고 통신에 필요한 인터페이스만 유지하는 것입니다. 외부와. 이 캡슐화 기능은 객체의 독립성을 효과적으로 보장하고 소프트웨어 오류의 위치를 ​​파악하며 오류 확인 및 문제 해결의 어려움을 크게 줄여줍니다.

개인 키워드를 사용하여 속성과 메서드를 캡슐화합니다.

<?php 
class Person { 
//将成员属性定义为 private 
private $name; 
private $age; 
//定义一个构造方法初始化赋值 
function __construct($name, $age) { 
$this->name=$name; 
$this->age=$age; 
} 
function say() { 
echo "我的名字叫:".$this->name." <br >"; 
echo "我的年龄是:".$this->age; 
} 
} 
$p1=new Person("张三", 20); 
$p1->say(); 
?>

Interface

PHP 클래스는 단일 상속입니다. 즉, 지원하지 않습니다. 다중 상속 클래스에 여러 클래스의 기능이 필요한 경우 상속은 무력합니다. 이러한 이유로 PHP는 클래스 인터페이스 기술을 도입합니다.

추상 클래스의 모든 메서드가 추상 메서드이고 변수가 선언되지 않고 인터페이스의 모든 멤버가 공용 권한을 갖는 경우 이 특수 추상 클래스를 인터페이스라고 합니다.

인터페이스를 사용하면 클래스가 구현해야 하는 메서드를 지정할 수 있지만 이러한 메서드의 특정 내용을 정의할 필요는 없습니다.

인터페이스는 표준 클래스 정의와 마찬가지로 인터페이스 키워드를 통해 정의되지만, 그 안에 정의된 메소드는 모두 비어 있습니다. 인터페이스에 정의된 모든 메소드는 공개되어야 합니다. 이는 인터페이스의 특징입니다.

인터페이스를 구현하려면 Implements 연산자를 사용하세요. 클래스는 인터페이스에 정의된 모든 메서드를 구현해야 합니다. 그렇지 않으면 치명적인 오류가 보고됩니다.

<?php 
//定义接口 
interface User{ 
function getDiscount(); 
function getUserType(); 
} 
//VIP用户 接口实现 
class VipUser implements User{ 
// VIP 用户折扣系数 
private $discount = 0.8; 
function getDiscount() { 
return $this->discount; 
} 
function getUserType() { 
return "VIP用户"; 
} 
} 
class Goods{ 
var $price = 100; 
var $vc; 
//定义 User 接口类型参数,这时并不知道是什么用户 
function run(User $vc){ 
$this->vc = $vc; 
$discount = $this->vc->getDiscount(); 
$usertype = $this->vc->getUserType(); 
echo $usertype."商品价格:".$this->price*$discount; 
} 
} 
$display = new Goods(); 
$display ->run(new VipUser);//可以是更多其他用户类型 
?>

결과:

VIP 사용자 제품 가격: 80위안

PHP는 클래스를 상속할 때 동시에 여러 인터페이스를 구현할 수도 있습니다.

클래스 하위 클래스는 상위 클래스 구현을 확장합니다. 인터페이스 1, 인터페이스 2, ...
{
......
}

추상 클래스와 인터페이스의 차이점

인터페이스는 특별한 추상 클래스이며 모델의 사양으로도 간주될 수 있습니다. 인터페이스와 추상 클래스의 일반적인 차이점은 다음과 같습니다.

하위 클래스가 인터페이스를 구현하는 경우(필요 여부에 관계없이) 인터페이스의 모든 메서드를 구현해야 합니다. 필요한 메서드만 구현하면 됩니다.

인터페이스에 정의된 메서드 이름이 변경되면 이 인터페이스를 구현하는 모든 하위 클래스는 메서드 이름을 동기적으로 업데이트해야 하며, 추상 클래스의 메서드 이름이 변경되면 해당 하위 클래스의 메서드 이름도 업데이트됩니다. 영향을 받지 않습니다. 단지 새로운 메서드(이전 메서드에 비해 구현됨)가 된다는 것입니다.

추상 클래스는 단독으로만 상속될 수 있습니다. 하위 클래스가 여러 상위 클래스에서 상속되어야 하는 기능을 구현해야 하는 경우 인터페이스를 사용해야 합니다.

상수

일반적인 정의() 함수 대신 const 키워드를 사용하여 클래스에서 상수를 정의합니다.

클래스 내에서 변하지 않는 값을 상수로 정의할 수 있습니다. 상수를 정의하고 사용할 때 $ 기호를 사용할 필요가 없습니다.

상수의 값은 고정된 값이어야 하며 변수, 클래스 속성, 수학 연산의 결과 또는 함수 호출이 될 수 없습니다.

PHP 5.3.0부터 변수를 사용하여 클래스를 동적으로 호출할 수 있습니다. 그러나 이 변수의 값은 키워드(예: self, parent 또는 static)일 수 없습니다.

구문

const 상수 = "value";

인스턴스:

<?php 
Class Person{ 
// 定义常量 
const country = "中国"; 
public function myCountry() { 
//内部访问常量 
echo "我是".self::country."人 <br >"; 
} 
} 
// 输出常量 
echo Person::country." <br >"; 
// 访问方法 
$p1 = new Person(); 
$p1 -> myCountry(); 
?>

실행 출력:

중국
나는 중국어

추상 클래스

모든 클래스에 포함된 메소드 중 하나 이상이 추상으로 선언된 경우 해당 클래스도 추상으로 선언되어야 합니다.

추상으로 정의된 클래스는 인스턴스화할 수 없습니다.

추상으로 정의된 메서드는 호출 메서드(매개변수)만 선언하고 특정 함수 구현을 정의할 수는 없습니다.

추상 클래스를 상속할 때 하위 클래스는 상위 클래스의 모든 추상 메서드를 정의해야 하며, 이러한 메서드의 액세스 제어는 상위 클래스와 동일하거나 더 완화되어야 합니다. 예를 들어 추상 메서드가 protected로 선언된 경우 하위 클래스에 구현된 메서드는 protected 또는 public으로 선언되어야 하며 private으로 정의할 수 없습니다. 또한 메서드를 호출하는 메서드가 일치해야 합니다. 즉, 필수 매개변수의 유형과 개수가 일관되어야 합니다. 예를 들어, 하위 클래스가 상위 클래스의 추상 메서드 선언에 포함되지 않은 선택적 매개 변수를 정의하는 경우 두 선언 간에 충돌이 없습니다.

<?php 
abstract class AbstractClass 
{ 
// 强制要求子类定义这些方法 
abstract protected function getValue(); 
abstract protected function prefixValue($prefix); 
// 普通方法(非抽象方法) 
public function printOut() { 
print $this->getValue() . PHP_EOL; 
} 
} 
class ConcreteClass1 extends AbstractClass 
{ 
protected function getValue() { 
return "ConcreteClass1"; 
} 
public function prefixValue($prefix) { 
return "{$prefix}ConcreteClass1"; 
} 
} 
class ConcreteClass2 extends AbstractClass 
{ 
public function getValue() { 
return "ConcreteClass2"; 
} 
public function prefixValue($prefix) { 
return "{$prefix}ConcreteClass2"; 
} 
} 
$class1 = new ConcreteClass1; 
$class1->printOut(); 
echo $class1->prefixValue('FOO_') . PHP_EOL; 
$class2 = new ConcreteClass2; 
$class2->printOut(); 
echo $class2->prefixValue('FOO_') . PHP_EOL; 
?>

가 위 코드를 실행하면 출력 결과는 다음과 같습니다.

ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2

정적 키워드

문 클래스 특성이나 메서드가 정적이면 클래스를 인스턴스화하지 않고도 직접 액세스할 수 있습니다.

정적 속성은 인스턴스화된 클래스의 객체를 통해 액세스할 수 없습니다(그러나 정적 메서드는 가능함).

정적 메서드에서는 개체 호출이 필요하지 않으므로 정적 메서드에서는 의사 변수 $this를 사용할 수 없습니다.

객체는 -> 연산자를 통해 정적 속성에 액세스할 수 없습니다.

PHP 5.3.0부터 변수를 사용하여 클래스를 동적으로 호출할 수 있습니다. 그러나 이 변수의 값은 키워드 self, parent 또는 static일 수 없습니다.

<?php 
Class Person{ 
// 定义静态成员属性 
public static $country = "中国"; 
// 定义静态成员方法 
public static function myCountry() { 
// 内部访问静态成员属性 
echo "我是".self::$country."人<br >"; 
} 
} 
class Student extends Person { 
function study() { 
echo "我是". parent::$country."人<br >"; 
} 
} 
// 输出成员属性值 
echo Person::$country."<br >";// 输出:中国 
$p1 = new Person(); 
//echo $p1->country;// 错误写法 
// 访问静态成员方法 
Person::myCountry();// 输出:我是中国人 
// 静态方法也可通过对象访问: 
$p1->myCountry(); 
// 子类中输出成员属性值 
echo Student::$country."<br >";// 输出:中国 
$t1 = new Student(); 
$t1->study();// 输出:我是中国人 
?>

실행 출력:

China
I am Chinese
I am Chinese
China
I am Chinese

최종 키워드

PHP 5에는 새로운 최종 키워드가 추가되었습니다. 상위 클래스의 메서드가 final로 선언되면 하위 클래스는 해당 메서드를 재정의할 수 없습니다. 클래스가 final로 선언되면 상속될 수 없습니다.

최종 클래스 Person
{
......

<?php 
class BaseClass { 
public function test() { 
echo "BaseClass::test() called" . PHP_EOL; 
} 
final public function moreTesting() { 
echo "BaseClass::moreTesting() called" . PHP_EOL; 
} 
} 
class ChildClass extends BaseClass { 
public function moreTesting() { 
echo "ChildClass::moreTesting() called" . PHP_EOL; 
} 
} 
// 报错信息 Fatal error: Cannot override final method BaseClass::moreTesting() 
?>

상위 클래스 생성자 호출

PHP 하위 클래스 생성자에서 상위 클래스 생성자를 자동으로 호출하지 않습니다. 상위 클래스의 생성자를 실행하려면 하위 클래스의 생성자에서 parent::__construct()를 호출해야 합니다.

<?php 
class BaseClass { 
function __construct() { 
print "BaseClass 类中构造方法" . PHP_EOL; 
} 
} 
class SubClass extends BaseClass { 
function __construct() { 
parent::__construct(); // 子类构造方法不能自动调用父类的构造方法 
print "SubClass 类中构造方法" . PHP_EOL; 
} 
} 
class OtherSubClass extends BaseClass { 
// 继承 BaseClass 的构造方法 
} 
// 调用 BaseClass 构造方法 
$obj = new BaseClass(); 
// 调用 BaseClass、SubClass 构造方法 
$obj = new SubClass(); 
// 调用 BaseClass 构造方法 
$obj = new OtherSubClass(); 
?>
위 프로그램을 실행하면 출력 결과는 다음과 같습니다.
BaseClass 클래스의 구성 메서드

BaseClass 클래스의 구성 메서드

SubClass 클래스의 구성 메서드

BaseClass 클래스의 구성 메서드 BaseClass 클래스


다음 섹션

<?php class Person { var $name; var $age; //定义一个构造方法初始化赋值 function __construct($name,$age) { $this->name=$name; $this->age=$age; } function say() { echo "我的名字叫:".$this->name." <br >"; echo "我的年龄是:".$this->age." <br >";; } function __destruct() { echo "再见".$this->name; } } $p1=new Person("张三", 20); $p1->say(); ?>
코스웨어