>백엔드 개발 >PHP 튜토리얼 >PHP의 특성 분석

PHP의 특성 분석

不言
不言원래의
2018-07-07 11:55:401453검색

이 글은 주로 PHP의 특성 분석을 소개하는데, 이는 어느 정도 참고할만한 가치가 있습니다. 이제 도움이 필요한 친구들이 참고할 수 있도록 하겠습니다.

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

Trait는 말 그대로 "특성"과 "특성"을 의미합니다. Trait 키워드를 사용하면 PHP의 클래스에 새로운 특성을 추가할 수 있다는 것을 이해할 수 있습니다.

Trait는 PHP와 같은 단일 상속 언어를 위해 준비된 코드 재사용 메커니즘입니다. 특성은 단일 상속 언어의 제한을 줄이고 개발자가 다양한 계층 내의 독립 클래스에서 메서드를 자유롭게 재사용할 수 있도록 설계되었습니다. 특성 및 클래스 구성의 의미는 복잡성을 줄이고 기존 다중 상속 및 Mixin 클래스와 관련된 일반적인 문제를 방지하는 방법을 정의합니다.

Trait는 클래스와 유사하지만 기능을 세밀하고 일관된 방식으로 결합하도록 설계되었습니다. 특성 자체를 통해 인스턴스화할 수 없습니다. 이는 전통적인 상속에 수평적 기능의 조합을 추가합니다. 즉, 애플리케이션의 여러 클래스 간에 상속이 필요하지 않습니다.

Usage: 클래스에서 use 키워드를 사용하여 결합할 Trait 이름을 선언합니다. 특정 Trait 선언은 Trait 키워드를 사용하여 인스턴스화할 수 없습니다.

1. 특성 기본

<?php
header("Content-type:text/html;charset=utf-8");
trait Test{public function hello1(){        
return "Test::hello1()";
    }
}class demo1{    
use Test;
}$obj = new demo1();echo $obj->hello1().&#39;<br />&#39;;//Test::hello1()

2. 우선순위

# 🎜 🎜#

<?php
class Base {    
public function sayHello() {        
echo &#39;Hello &#39;;
    }
}

trait SayWorld {    
public function sayHello() {
        parent::sayHello();        
        echo &#39;World!&#39;;
    }
}class MyHelloWorld extends Base {    
use SayWorld;
}$o = new MyHelloWorld();$o->sayHello();//Hello World!

<?php

trait HelloWorld {    
public function sayHello() {        
echo &#39;Hello World!&#39;;
    }
}class TheWorldIsNotEnough {    
use HelloWorld;    
public function sayHello() {        
echo &#39;Hello Universe!&#39;;
    }
}
$o = new TheWorldIsNotEnough();
$o->sayHello();//Hello Universe!

Members는 삽입된 SayWorld Trait의 MyHelloWorld 메소드에 의해 재정의됩니다. 해당 동작은 MyHelloWorld 클래스에 정의된 메서드와 일치합니다. 우선 순위는 현재 클래스의 메서드가 특성 메서드를 재정의하고, 특성 메서드가 기본 클래스의 메서드를 재정의하는 것입니다.

3. 다중 특성

여러 특성은 쉼표로 구분되어 use 문에 나열되며 모두 클래스에 삽입될 수 있습니다.

<?php

trait Hello {    
public function sayHello() {        
echo &#39;Hello &#39;.&#39;<br />&#39;;
    }
}

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

4. 충돌 해결

두 특성에 동일한 이름의 메서드를 삽입하면 실패합니다. 충돌을 명시적으로 해결하면 치명적인 오류가 발생합니다.

동일 클래스에 있는 여러 특성의 이름 충돌을 해결하려면

insteadof 연산자를 사용하여 사용할 충돌 방법을 명시적으로 지정해야 합니다.

<?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;
    }
}$obj = new Talker();$obj->smallTalk();//b$obj->bigTalk();//A

위 방법은 다른 방법만 제외할 수 있습니다.

as 연산자는 특정일 수 있습니다. 메소드 별칭을 소개합니다. as 연산자는 메서드 이름을 바꾸거나 해당 메서드에 영향을 주지 않습니다.

<?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;
        B::bigTalk as b_bigTalk;
        A::smallTalk as a_smallTalk;
    }
}$obj = new Talker();$obj->smallTalk();//b$obj->bigTalk();//A$obj->b_bigTalk();//B$obj->a_smallTalk();//a

5. 메소드의 액세스 제어를 수정합니다.

Use

as#🎜 🎜# 구문을 사용하여 메소드에 대한 액세스 제어를 조정할 수도 있습니다.

<?php

trait A{    private function smallTalk(){        echo &#39;a&#39;;
    }
}class Talker{    use A{
        smallTalk as public aaa;
    }
}$obj = new Talker();$obj->aaa();//a

6. 특성 그룹

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

<?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 Talker{    use HelloWorld;
}$obj = new Talker();$obj->sayHello();//Hello$obj->sayWorld();//World !

7.추상 멤버

사용되는 클래스에 필수 요구 사항을 부과하기 위해 특성이 지원됩니다. 추상적인 사용 방법.

<?php

trait Hello{    public function sayWorld(){        echo &#39;Hello &#39;.$this->getWorld();
    }    abstract public function getWorld();
}class Talker{    private $world;    use Hello;    public function getWorld(){        return $this->world;
    }    public function setWorld($val){        $this->world = $val;
    }
}$obj = new Talker();$obj->setWorld("Trait !");$obj->sayWorld();//Hello Trait !

8 특성 정적 멤버

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

<?php

trait HelloWorld{    public static function sayHelloWorld(){        echo &#39;Hello World !&#39;;
    }
}class Talker{    use HelloWorld;
}
Talker::sayHelloWorld();//Hello World !

<?php

trait Counter{    public function inc(){        static $c = 0;        $c++;        echo "$c\n";
    }
}class C1{    use Counter;
}class C2{    use Counter;
}$c1 = new C1();$c1->inc();//1$c1_1 = new C1();$c1_1->inc();//2$c2 = new C2();$c2->inc();//1

9, 속성

# 🎜🎜#Trait는 속성을 정의할 수도 있습니다.

<?php

trait PropertiesTrait {    public $x = 1;
}class PropertiesExample {    use PropertiesTrait;
}$example = new PropertiesExample;echo $example->x;//1

Trait 클래스는 속성을 정의한 후에는 동일한 이름의 속성을 정의할 수 없으며, 그렇지 않으면 치명적인 오류가 발생합니다. 한 가지 예외가 있습니다. 속성은 호환됩니다(동일한 액세스 가시성, 초기 기본값). PHP 7.0 이전에는 속성이 호환되면 E_STRICT 알림이 표시되었습니다.

위 내용은 모두의 학습에 도움이 되기를 바랍니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요!

관련 권장 사항:

PHP에서 Elasticsearch를 사용하는 방법


PHP 타이머 설명

위 내용은 PHP의 특성 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.