>  기사  >  백엔드 개발  >  PHP의 추상, 최종, 정적의 원리와 사용법에 대한 자세한 설명

PHP의 추상, 최종, 정적의 원리와 사용법에 대한 자세한 설명

coldplay.xixi
coldplay.xixi앞으로
2020-07-14 17:30:343661검색

PHP의 추상, 최종, 정적의 원리와 사용법에 대한 자세한 설명

이 문서의 예제에서는 PHP의 추상, 최종 및 정적의 원리와 사용법을 설명합니다. 참조를 위해 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다:

abstract(추상)

PHP 5는 추상 클래스와 추상 메서드를 지원합니다. abstract로 정의된 클래스는 인스턴스화할 수 없습니다. 적어도 하나의 메소드가 추상으로 선언된 경우 모든 클래스는 추상으로 선언되어야 합니다. abstract로 정의된 메서드는 호출 메서드(매개변수)만 선언하며 특정 함수 구현을 정의할 수 없습니다.

추상 클래스를 상속할 때 하위 클래스는 상위 클래스의 모든 추상 메소드를 정의해야 합니다 또한 이러한 메소드의 액세스 제어는 이전 클래스와 동일하거나 더 완화되어야 합니다. 학부모 수업 . 예를 들어 추상 메서드가 protected로 선언된 경우 하위 클래스에 구현된 메서드는 protected 또는 public(엄격성: private>protected>public)으로 선언해야 하지만 private으로 정의할 수는 없습니다. 또한 메서드의 호출 방법이 일치해야 합니다. 즉, 필수 매개변수의 유형과 수가 일관되어야 합니다. 예를 들어, 하위 클래스가 상위 클래스의 추상 메서드 선언에 포함되지 않은 선택적 매개 변수를 정의하는 경우 두 선언 간에 충돌이 없습니다. 이는 PHP 5.4 이후의 생성자에도 적용됩니다. PHP 5.4 이전의 생성자 선언은 다를 수 있습니다.

관련 학습 권장 사항:
초보부터 마스터까지 PHP 프로그래밍

요약:

    추상 클래스는 인스턴스화할 수 없습니다.
  • 클래스에 추상 메소드가 있는 경우 이 클래스도 인스턴스화해야 합니다. 추상적이어야 합니다.
  • 추상 클래스는 호출 메서드와 매개 변수만 선언할 수 있지만 특정 함수 구현은 정의할 수 없습니다.
  • 추상 클래스를 상속하는 하위 클래스는 추상 클래스의 모든 추상 메서드를 구현해야 합니다.
  • 추상 하위 클래스에 구현됨 메소드의 액세스 제어는 상위 클래스의 액세스 제어보다 엄격해야 합니다.
  • 하위 클래스에 구현된 메소드의 호출 메소드와 매개변수 수는 구현되는 메소드와 일치해야 합니다.
  • 예:
<?php
abstract class AbstractClass
{
  // 强制要求子类定义这些方法,不定义功能实现
  abstract protected function getValue();
  abstract protected function prefixValue($prefix);

  // 普通方法(非抽象方法),子类可以不重写
  public function printOut() {
    print $this->getValue() . "\n";
  }
}

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(&#39;FOO_&#39;) ."\n";

$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue(&#39;FOO_&#39;) ."\n";
?>
<?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"), "\n";
echo $class->prefixName("Pacwoman"), "\n";
?>

final

부모 클래스의 메서드가 final로 선언되면 자식 클래스는 해당 메서드를 재정의할 수 없습니다. 클래스가 final로 선언되면 상속될 수 없습니다.

이것이 더 이해하기 쉬우므로 자세한 내용은 다루지 않겠습니다.

static

클래스 특성이나 메서드를 정적으로 선언하면 클래스를 인스턴스화하지 않고도 직접 액세스할 수 있습니다. 정적 속성은 인스턴스화된 클래스의 개체를 통해 액세스할 수 없습니다(그러나 정적 메서드는 가능함).

PHP 4와 호환되기 위해 액세스 제어가 지정되지 않은 경우 속성과 메서드는 기본적으로 공개로 설정됩니다.

정적 메서드는 객체를 통해 호출할 필요가 없으므로 정적 메서드에서는 의사 변수 $this를 사용할 수 없습니다.

정적 속성은 -> 연산자를 통해 개체에서 액세스할 수 없습니다. $this 在静态方法中不可用。

静态属性不可以由对象通过 -> 操作符来访问。

用静态方式调用一个非静态方法会导致一个 E_STRICT 级别的错误。

就像其它所有的 PHP 静态变量一样,静态属性只能被初始化为文字或常量,不能使用表达式。所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值,也不能指向一个对象。

自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。

总结:

  • 静态方法无需实例化,可直接访问;

  • 类实例化的对象无法访问类中的静态属性,但是可以访问静态方法;

  • 伪变量 $this 在静态方法中不可用;

  • 静态属性不可以由对象通过 -> 操作符来访问;

  • 用静态方式调用一个非静态方法会导致一个 E_STRICT

    정적이 아닌 메서드를 정적으로 호출하면 E_STRICT 수준 오류가 발생합니다.
  • 다른 모든 PHP 정적 변수와 마찬가지로 정적 속성은 표현식이 아닌 리터럴이나 상수로만 초기화할 수 있습니다. 따라서 정적 속성은 정수 또는 배열로 초기화될 수 있지만 다른 변수나 함수 반환 값으로 초기화될 수 없으며 개체를 가리킬 수도 없습니다.

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

정적 메서드는 인스턴스화할 필요가 없으며 직접 액세스할 수 있습니다. 🎜🎜🎜🎜클래스에 의해 인스턴스화된 개체는 클래스의 정적 속성에 액세스할 수 없지만 정적 메서드에는 액세스할 수 있습니다. 의사 변수 $this는 정적 메서드에서 사용할 수 없습니다. 🎜🎜🎜🎜정적 속성은 -> 연산자를 통해 액세스할 수 없습니다. E_STRICT 수준 오류 🎜🎜🎜🎜정적 속성은 리터럴 또는 상수로만 초기화할 수 있으며 표현식은 사용할 수 없습니다(함수 반환 값 ​​/변수/객체 대신) 🎜🎜🎜🎜 변수 호출 클래스를 사용하여 동적으로 만듭니다. 그러나 이 변수의 값은 키워드 self, parent 또는 static일 수 없습니다. 🎜🎜🎜rreee

위 내용은 PHP의 추상, 최종, 정적의 원리와 사용법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 jb51.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제