PHP 에서 abstract(추상),final(최종),static(정적)원리 와 용법 에 대한 상세 한 설명
추상(추상)
PHP 5 는 추상 적 인 클래스 와 추상 적 인 방법 을 지원 합 니 다.추상 적 인 클래스 로 정의 되 어 예화 되 어 서 는 안 된다.어떤 유형 이 든 그 안에 적어도 하나의 방법 이 추상 적 인 것 으로 밝 혀 진다 면 이런 유형 은 추상 적 인 것 으로 밝 혀 져 야 한다.추상 적 인 방법 으로 정의 되 는 것 은 호출 방식(매개 변수)을 설명 하 는 것 일 뿐 구체 적 인 기능 실현 을 정의 할 수 없다.
추상 류 를 계승 할 때 자 류 는 반드시 부류 중의 모든 추상 적 인 방법 을 정의 해 야 한다.또한 이러한 방법의 접근 통 제 는 부모 클래스 와 같 아야 한다(또는 더 느슨 해 야 한다).예 를 들 어 어떤 추상 적 인 방법 이 보 호 받 는 것 으로 밝 혀 지면 하위 클래스 에서 이 루어 지 는 방법 은 보 호 받 거나 공유 되 는 것(엄격 한 정도:private>protected>Public)이 라 고 밝 혀 야 지 사유 로 정의 할 수 없다.그 밖 에 방법의 호출 방식 은 반드시 일치 해 야 한다.즉,유형 과 필요 한 매개 변수 수량 이 일치 해 야 한다.예 를 들 어 하위 클래스 는 선택 할 수 있 는 매개 변 수 를 정 의 했 고 부모 추상 적 인 방법의 성명 에 없 으 면 이들 의 성명 은 충돌 하지 않 았 다.이 는 PHP 5.4 의 구조 함수 에 도 적용 된다.PHP 5.4 이전의 구조 함수 설명 은 다 를 수 있 습 니 다.
요약:
4.567917.추상 류 는 예화 되 어 서 는 안 된다4.567917.유형 중 어떤 추상 적 인 방법 이 있 으 면 이런 유형 도 추상 적 이 어야 한다4.567917.추상 류 는 호출 방식 과 매개 변수 만 설명 할 수 있 고 구체 적 인 기능 실현 을 정의 할 수 없다4.567917.추상 류 를 계승 하 는 자 류 는 추상 류 의 모든 추상 적 인 방법 을 실현 해 야 한다4.567917.하위 클래스 에서 실 현 된 추상 적 인 방법의 방문 통 제 는 부모 류 의 방문 통제 보다 더욱 엄격 해 야 한다4.567917.하위 클래스 에서 실현 되 는 방법의 호출 방식 과 매개 변수 수량 은 반드시 실현 되 는 방법 과 일치 해 야 한다예:
<?php
abstract class AbstractClass
{
// ,
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// ( ),
public function printOut() {
print $this->getValue() . "
";
}
}
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_') ."
";
$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') ."
";
?>
<?php
abstract class AbstractClass
{
//
abstract protected function prefixName($name);
}
class ConcreteClass extends AbstractClass
{
//
public function prefixName($name, $separator = ".") {
if ($name == "Pacman") {
$prefix = "Mr";
} elseif ($name == "Pacwoman") {
$prefix = "Mrs";
} else {
$prefix = "";
}
return "{$prefix}{$separator} {$name}";
}
}
$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "
";
echo $class->prefixName("Pacwoman"), "
";
?>
final부모 클래스 의 방법 이 final 로 밝 혀 지면 하위 클래스 는 이 방법 을 덮어 쓸 수 없습니다.하나의 클래스 가 final 로 밝 혀 지면 계승 할 수 없습니다.
이것 은 비교적 이해 하기 쉬 우 니,군말 은 하지 마라
static
성명 류 속성 이나 방법 이 정적 이면 실례 화 되 지 않 고 직접 접근 할 수 있 습 니 다.정적 속성 은 실례 화 된 대상 을 통 해 접근 할 수 없습니다.(정적 방법 은 가능 합 니 다.)
PHP 4 를 호 환 하기 위해 서 접근 제어 가 지정 되 지 않 으 면 속성 과 방법 은 기본적으로 공유 합 니 다.
정적 방법 은 대상 을 통 해 호출 할 필요 가 없 기 때문에 의사 변수$this 는 정적 방법 에서 사용 할 수 없습니다.
정적 속성 은 대상 이->연산 자 를 통 해 접근 할 수 없습니다.
정적 방식 으로 비 정적 방법 을 호출 하면 ESTRCT 급 오류 입 니 다.
다른 모든 PHP 정적 변수 와 마찬가지 로 정적 속성 은 문자 나 상수 로 초기 화 될 수 있 을 뿐 표현 식 을 사용 할 수 없습니다.따라서 정적 속성 을 정수 나 배열 로 초기 화 할 수 있 지만 다른 변수 나 함수 반환 값 으로 초기 화 할 수 없고 대상 을 가리 킬 수 없습니다.
PHP 5.3.0 부터 하나의 변수 로 동적 호출 클래스 를 사용 할 수 있 습 니 다.그러나 이 변수의 값 은 키워드 self,parent 또는 static 일 수 없습니다.
요약:
4.567917.정태 적 인 방법 은 실례 화 되 지 않 고 직접 방문 할 수 있다4.567917.클래스 의 예화 대상 은 클래스 의 정적 속성 에 접근 할 수 없 지만 정적 방법 에 접근 할 수 있 습 니 다
<?php
class Foo
{
public static $my_static = 'foo';
public function staticValue() {
return self::$my_static;
}
}
class Bar extends Foo
{
public function fooStatic() {
return parent::$my_static;
}
}
print Foo::$my_static . "
";
$foo = new Foo();
print $foo->staticValue() . "
";
print $foo->my_static . "
"; // Undefined "Property" my_static
print $foo::$my_static . "
";
$classname = 'Foo';
print $classname::$my_static . "
"; // As of PHP 5.3.0
print Bar::$my_static . "
";
$bar = new Bar();
print $bar->fooStatic() . "
";
?>
</programlisting>
</example>
<example>
<title> </title>
<programlisting role="php">
<![CDATA[
<?php
class Foo {
public static function aStaticMethod() {
// ...
}
}
Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod(); // PHP 5.3.0
?>
더 많은 PHP 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.본 논문 에서 말 한 것 이 여러분 의 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.