>백엔드 개발 >PHP 튜토리얼 >PHP 단일 상속 문제를 해결하기 위해 특성을 사용하는 PHP의 자세한 예

PHP 단일 상속 문제를 해결하기 위해 특성을 사용하는 PHP의 자세한 예

coldplay.xixi
coldplay.xixi앞으로
2020-06-09 11:59:462431검색

PHP 단일 상속 문제를 해결하기 위해 특성을 사용하는 PHP의 자세한 예

PHP Trait을 사용하여 PHP 단일 상속 문제를 해결하는 방법에 대한 자세한 설명

이 기사에서는 주로 PHP를 사용하여 PHP 단일 상속 문제를 해결하는 Trait을 소개하고, Trait을 사용하여 PHP에 대한 자세한 분석을 예제 형식과 결합합니다. PHP 단일 상속을 구현하는 Trait. 작동 팁과 주의 사항이 필요한 친구는 이를 참조할 수 있습니다.

이 문서에서는 PHP가 Trait을 사용하여 PHP 단일 상속 문제를 해결하는 예를 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 자세한 내용은 다음과 같습니다.

상속이란 무엇인가요?

상속은 실제로 객체지향 프로그래밍에 존재하는 두 클래스 간의 관계입니다. 상속을 통해 프로그램 구조를 보다 효과적으로 구성할 수 있고 클래스 간의 관계를 명확하게 할 수 있습니다. . 관계, 기존 수업을 최대한 활용하여 더욱 복잡하고 심층적인 개발을 완성합니다.

한 클래스가 다른 클래스의 모든 데이터와 작업을 소유하면 두 클래스 사이에 상속 관계가 있다고 합니다.

상속된 클래스를 상위 클래스라고 하며, 상위 클래스의 모든 데이터와 연산을 상속하는 클래스를 하위 클래스라고 합니다.

PHP에서 확장을 사용하여 하위 클래스와 상위 클래스 간의 상속 관계를 나타냅니다.

객체 지향 프로그래밍에서 상속을 사용하여 디자인 시스템의 클래스를 구성하면 프로그램의 추상화를 향상시키고 인간의 사고 방식에 더 가까워지며 프로그램 구조를 더 명확하게 만들고 코딩 및 유지 관리 작업량을 줄일 수 있습니다.

단일 상속은 모든 클래스에 단일 상위 클래스만 있고 해당 구조가 간단한 트리 구조로 표현될 수 있음을 의미합니다. 다중 상속은 클래스가 둘 이상의 상위 클래스를 가질 수 있으며 해당 클래스의 정적 데이터 속성과 작업이 상속된다는 의미입니다. 이러한 모든 상위 클래스로부터, 그리고 그 구조는 복잡한 네트워크 구조로 표현되어야 합니다.

PHP는 단일 상속만 지원하는 반면 다중 상속은 인터페이스나 특성을 통해 구현됩니다.

PHP의 단일 상속 예

// 单继承:一个子类只能有一个父类
class A{
  function show() {
    echo "A";
  }
}
 
class B{
  function show() {
    echo "B";
  }
}
 
class C extends A{
 
}
 
$c = new C;
$c->show();

Trait를 사용하여 PHP의 단일 상속 문제 해결

PHP 5.4.0부터 PHP는 특성이라는 코드 재사용 방법을 구현합니다.

Trait는 PHP와 같은 단일 상속 언어를 위해 준비된 코드 재사용 메커니즘입니다. Trait은 단일 상속 언어의 제한을 줄이고 개발자가 다양한 계층의 독립 클래스에서 methodTrait 및 클래스 조합을 자유롭게 재사용할 수 있도록 설계되었습니다. 복잡성을 줄이고 특성 자체로 인스턴스화할 수 없는 Mixin 클래스 및 전통적인 다중 상속과 관련된 일반적인 문제를 피하는 방법을 정의하는 의미론 명령문 클래스에 모두 삽입할 수 있는 여러 특성을 나열합니다.

<?php
  trait Reader{
   public function add($var1,$var2){
     return $var1+$var2;
   }
  }
  trait writer {
   public function multiplication($var1,$var2){
     return $var1*$var2;
   }
  }
  class File {
   use Reader;
   use writer;
   public function calculate($var1,$var2){
     echo "Ressult of addition:".$this->add($var1,$var2) ."\n";
     echo "Ressult of multiplication:".$this->multiplication($var1,$var2);
   }
  }
  $o = new File();
  $o->calculate(5,3);

충돌 해결

두 특성이 동일한 이름의 메서드를 삽입하는 경우 충돌이 명시적으로 해결되지 않으면 치명적인 오류가 발생합니다.

동일한 클래스에 있는 여러 특성의 이름 충돌을 해결하려면 대신 연산자를 사용하여 사용할 충돌 방법을 명시적으로 지정해야 합니다.

위 메서드에서는 다른 메서드만 제외할 수 있습니다. as 연산자는 메서드에 대한 별칭을 도입할 수 있습니다. as 연산자는 메서드의 이름을 바꾸거나 해당 메서드에 영향을 주지 않습니다. 예:

<?php
trait Hello {
  public function sayHello() {
    echo &#39;Hello &#39;;
  }
}
 
trait World {
  public function sayWorld() {
    echo &#39;World&#39;;
  }
}
 
class MyHelloWorld {
  use Hello, World;
  public function sayExclamationMark() {
    echo &#39;!&#39;;
  }
}
 
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();

특성에서 특성 구성

클래스가 특성을 사용할 수 있는 것처럼 다른 특성도 특성을 사용할 수 있습니다. 특성을 정의할 때 하나 이상의 특성을 사용하면 다른 특성의 일부 또는 전체 구성원을 결합할 수 있습니다.

<?php
trait A {
  public function smallTalk() {
    echo &#39;a&#39;;
  }
  public function bigTalk() {
    echo &#39;A&#39;;
  }
}
 
trait B {
  public function smallTalk() {
    echo &#39;b&#39;;
  }
  public function bigTalk() {
    echo &#39;B&#39;;
  }
}
 
class Talker {
  use A, B {
    B::smallTalk insteadof A;
    A::bigTalk insteadof B;
  }
}
 
class Aliased_Talker {
  use A, B {
    B::smallTalk insteadof A;
    A::bigTalk insteadof B;
    B::bigTalk as talk;
  }
}

Trait의 추상 멤버

사용된 클래스에 대한 요구 사항을 적용하기 위해 특성은 추상 메서드 사용을 지원합니다.

<?php
trait Hello {
  public function sayHello() {
    echo &#39;Hello &#39;;
  }
}
 
trait World {
  public function sayWorld() {
    echo &#39;World!&#39;;
  }
}
 
trait HelloWorld {
  use Hello, World;
}
 
class MyHelloWorld {
  use HelloWorld;
}
 
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();

Trait의 정적 멤버

Traits는 정적 멤버와 정적 메서드로 정의할 수 있습니다.

<?php
trait Hello {
  public function sayHelloWorld() {
    echo &#39;Hello&#39;.$this->getWorld();
  }
  abstract public function getWorld();
}
 
class MyHelloWorld {
  private $world;
  use Hello;
  public function getWorld() {
    return $this->world;
  }
  public function setWorld($val) {
    $this->world = $val;
  }
}
<?php<br>// 静态成员
trait Counter {
  public function inc() {
    static $c = 0;
    $c = $c + 1;
    echo "$c\n";
  }
}
 
class C1 {
  use Counter;
}
 
class C2 {
  use Counter;
}
 
$o = new C1(); $o->inc(); // echo 1
$p = new C2(); $p->inc(); // echo 1
<?php
// 静态方法
trait StaticExample {
  public static function doSomething() {
    return &#39;Doing something&#39;;
  }
}
 
class Example {
  use StaticExample;
}
 
Example::doSomething();

추천 튜토리얼: "

PHP 비디오 튜토리얼

"

위 내용은 PHP 단일 상속 문제를 해결하기 위해 특성을 사용하는 PHP의 자세한 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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