목차
PHP的学习--Traits新特性
백엔드 개발 PHP 튜토리얼 PHP的学习--Traits新特性_PHP教程

PHP的学习--Traits新特性_PHP教程

Jul 13, 2016 am 10:11 AM
특성

PHP的学习--Traits新特性

 
 
自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。
 
Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits 和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。
 
Trait 和一个类相似,但仅仅旨在用细粒度和一致的方式来组合功能。Trait 不能通过它自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用类的成员不需要继承。
 
Trait 示例
 
 
trait ezcReflectionReturnInfo {
    function getReturnType() { /*1*/ }
    function getReturnDescription() { /*2*/ }
}
 
class ezcReflectionMethod extends ReflectionMethod {
    use ezcReflectionReturnInfo;
    /* ... */
}
 
class ezcReflectionFunction extends ReflectionFunction {
    use ezcReflectionReturnInfo;
    /* ... */
}
?>
 
优先级
从基类继承的成员被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。
 
优先顺序示例
 
 
class Base {
    public function sayHello() {
        echo 'Hello ';
    }
}
 
trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo 'World!';
    }
}
 
class MyHelloWorld extends Base {
    use SayWorld;
}
 
$o = new MyHelloWorld();
$o->sayHello();
?>
 
以上例程会输出:Hello World!
 
从基类继承的成员被插入的 SayWorld Trait 中的 sayHello 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。
 
另一个优先级顺序的例子
 
 
trait HelloWorld {
    public function sayHello() {
        echo 'Hello World!';
    }
}
 
class TheWorldIsNotEnough {
    use HelloWorld;
    public function sayHello() {
        echo 'Hello Universe!';
    }
}
 
$o = new TheWorldIsNotEnough();
$o->sayHello();
?>
 
以上例程会输出:Hello Universe!
 
多个 trait
通过逗号分隔,在 use 声明列出多个 trait,可以都插入到一个类中。
 
多个 trait 的用法的例子
 
 
trait Hello {
    public function sayHello() {
        echo 'Hello ';
    }
}
 
trait World {
    public function sayWorld() {
        echo 'World';
    }
}
 
class MyHelloWorld {
    use Hello, World;
    public function sayExclamationMark() {
        echo '!';
    }
}
 
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>
 
以上例程会输出:Hello World!
 
冲突的解决
如果两个 trait 都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。
 
为了解决多个 trait 在同一个类中的命名冲突,需要使用 insteadof 操作符来明确指定使用冲突方法中的哪一个。
 
以上方式仅允许排除掉其它方法,as 操作符可以将其中一个冲突的方法以另一个名称来引入。
 
冲突解决的例子
 
 
trait A {
    public function smallTalk() {
        echo 'a';
    }
    public function bigTalk() {
        echo 'A';
    }
}
 
trait B {
    public function smallTalk() {
        echo 'b';
    }
    public function bigTalk() {
        echo 'B';
    }
}
 
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;
    }
}
?>
 
在本例中 Talker 使用了 trait A 和 B。由于 A 和 B 有冲突的方法,其定义了使用 trait B 中的 smallTalk 以及 trait A 中的 bigTalk。
 
Aliased_Talker 使用了 as 操作符来定义了 talk 来作为 B 的 bigTalk 的别名。
 
修改方法的访问控制
使用 as 语法还可以用来调整方法的访问控制。
 
修改方法的访问控制的例子
 
 
trait HelloWorld {
    public function sayHello() {
        echo 'Hello World!';
    }
}
 
// 修改 sayHello 的访问控制
class MyClass1 {
    use HelloWorld { sayHello as protected; }
}
 
// 给方法一个改变了访问控制的别名
// 原版 sayHello 的访问控制则没有发生变化
class MyClass2 {
    use HelloWorld { sayHello as private myPrivateHello; }
}
?>
 
从 trait 来组成 trait
正如类能够使用 trait 一样,其它 trait 也能够使用 trait。在 trait 定义时通过使用一个或多个 trait,它能够组合其它 trait 中的部分或全部成员。
 
从 trait 来组成 trait的例子
 
 
trait Hello {
    public function sayHello() {
        echo 'Hello ';
    }
}
 
trait World {
    public function sayWorld() {
        echo 'World!';
    }
}
 
trait HelloWorld {
    use Hello, World;
}
 
class MyHelloWorld {
    use HelloWorld;
}
 
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
?>
 
以上例程会输出:Hello World!
 
Trait 的抽象成员
为了对使用的类施加强制要求,trait 支持抽象方法的使用。
 
表示通过抽象方法来进行强制要求的例子
 
trait Hello {
    public function sayHelloWorld() {
        echo 'Hello'.$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;
    }
}
?>
 
Trait 的静态成员
Traits 可以被静态成员静态方法定义。
 
静态变量的例子
 
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
?>
 
静态方法的例子
 
 
trait StaticExample {
    public static function doSomething() {
        return 'Doing something';
    }
}
 
class Example {
    use StaticExample;
}
 
Example::doSomething();
?>
 
静态变量和静态方法的例子
 
 
trait Counter {
    public static $c = 0;
    public static function inc() {
        self::$c = self::$c + 1;
        echo self::$c . "\n";
    }
}
 
class C1 {
    use Counter;
}
 
class C2 {
    use Counter;
}
 
C1::inc(); // echo 1
C2::inc(); // echo 1
?>
 
属性
Trait 同样可以定义属性。
 
定义属性的例子
 
 
trait PropertiesTrait {
    public $x = 1;
}
 
class PropertiesExample {
    use PropertiesTrait;
}
 
$example = new PropertiesExample;
$example->x;
?>
 
如果 trait 定义了一个属性,那类将不能定义同样名称的属性,否则会产生一个错误。如果该属性在类中的定义与在 trait 中的定义兼容(同样的可见性和初始值)则错误的级别是 E_STRICT,否则是一个致命错误。
 
冲突的例子
 
 
trait PropertiesTrait {
    public $same = true;
    public $different = false;
}
 
class PropertiesExample {
    use PropertiesTrait;
    public $same = true; // Strict Standards
    public $different = true; // 致命错误
}
?>
 
Use的不同
不同use的例子
 
namespace Foo\Bar;
use Foo\Test;  // means \Foo\Test - the initial \ is optional
?>
 
namespace Foo\Bar;
class SomeClass {
    use Foo\Test;   // means \Foo\Bar\Foo\Test
}
?>
 
第一个use是用于 namespace 的 use Foo\Test,找到的是 \Foo\Test,第二个 use 是使用一个trait,找到的是\Foo\Bar\Foo\Test。
 
__CLASS__和__TRAIT__
__CLASS__ 返回 use trait 的 class name,__TRAIT__返回 trait name
 
 
 
 
trait TestTrait {
    public function testMethod() {
        echo "Class: " . __CLASS__ . PHP_EOL;
        echo "Trait: " . __TRAIT__ . PHP_EOL;
    }
}
 
class BaseClass {
    use TestTrait;
}
 
class TestClass extends BaseClass {
 
}
 
$t = new TestClass();
$t->testMethod();
 
//Class: BaseClass
//Trait: TestTrait
 
Trait单例
 
 
 
 
trait singleton {    
    /**
     * private construct, generally defined by using class
     */
    //private function __construct() {}
    
    public static function getInstance() {
        static $_instance = NULL;
        $class = __CLASS__;
        return $_instance ?: $_instance = new $class;
    }
    
    public function __clone() {
        trigger_error('Cloning '.__CLASS__.' is not allowed.',E_USER_ERROR);
    }
    
    public function __wakeup() {
        trigger_error('Unserializing '.__CLASS__.' is not allowed.',E_USER_ERROR);
    }
}
 
/**
* Example Usage
*/
 
class foo {
    use singleton;
    
    private function __construct() {
        $this->name = 'foo';
    }
}
 
class bar {
    use singleton;
    
    private function __construct() {
        $this->name = 'bar';
    }
}
 
$foo = foo::getInstance();
echo $foo->name;
 
$bar = bar::getInstance();
echo $bar->name;
 
调用trait方法
虽然不很明显,但是如果Trait的方法可以被定义为在普通类的静态方法,就可以被调用
 
实例如下
 
trait Foo { 
    function bar() { 
        return 'baz'; 
    } 
 
echo Foo::bar(),"\\n"; 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/927607.htmlTechArticlePHP的学习--Traits新特性 自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。 Traits 是一种为类似 PHP 的单继承语言而准备的代码复用...
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

win7 홈 버전과 win7 최종 버전의 차이점 소개 win7 홈 버전과 win7 최종 버전의 차이점 소개 Jul 12, 2023 pm 08:41 PM

Win7 Ultimate 버전, Win7 Professional 버전, Win7 Home 버전 등과 같은 Win7 시스템 버전이 많다는 것은 누구나 알고 있습니다. 많은 사용자가 Home 버전과 Ultimate 버전 사이에서 얽혀 어떤 버전을 선택해야 할지 모릅니다. 그래서 오늘은 Win7 Family Meal과 Win7 Ultimate의 차이점에 대해 말씀드리겠습니다. 1. Different Home Basic Edition을 경험해 보세요. 일상적인 작업을 더 빠르고 간단하게 만들어 가장 자주 사용하는 프로그램과 문서에 더 빠르고 편리하게 액세스할 수 있습니다. Home Premium은 좋아하는 TV 프로그램, 사진, 비디오 및 음악을 쉽게 즐기고 공유할 수 있는 최고의 엔터테인먼트 경험을 제공합니다. Ultimate Edition은 각 에디션의 모든 기능을 통합하고 Windows 7 Home Premium의 모든 엔터테인먼트 기능과 전문 기능을 갖추고 있습니다.

Spring MVC의 주요 개념을 익히십시오: 이러한 중요한 기능을 이해하십시오 Spring MVC의 주요 개념을 익히십시오: 이러한 중요한 기능을 이해하십시오 Dec 29, 2023 am 09:14 AM

SpringMVC의 주요 기능 이해: 이러한 중요한 개념을 익히려면 특정 코드 예제가 필요합니다. SpringMVC는 개발자가 MVC(Model-View-Controller) 아키텍처 패턴을 통해 유연하고 확장 가능한 구조를 구축하는 데 도움이 되는 Java 기반 웹 애플리케이션 개발 프레임워크입니다. 웹 애플리케이션. SpringMVC의 주요 기능을 이해하고 익히면 웹 애플리케이션을 보다 효율적으로 개발하고 관리할 수 있습니다. 이 기사에서는 SpringMVC의 몇 가지 중요한 개념을 소개합니다.

5g의 3가지 특징은 무엇인가 5g의 3가지 특징은 무엇인가 Dec 09, 2020 am 10:55 AM

5G의 세 가지 특징은 다음과 같습니다. 1. 고속, 실제 응용 분야에서 5G 네트워크의 속도는 4G 네트워크의 10배 이상입니다. 2. 낮은 대기 시간: 5G 네트워크의 대기 시간은 약 수십 밀리초로 인간의 반응 속도보다 빠릅니다. 3. 폭넓은 연결성, 5G 네트워크의 출현은 다른 기술과 결합하여 만물인터넷(Internet of Everything)의 새로운 장면을 창출할 것입니다.

필요와 기능에 따라 해당 Go 버전을 선택하세요. 필요와 기능에 따라 해당 Go 버전을 선택하세요. Jan 20, 2024 am 09:28 AM

인터넷의 급속한 발전으로 프로그래밍 언어는 끊임없이 진화하고 업데이트되고 있습니다. 그 중 오픈소스 프로그래밍 언어인 Go 언어는 최근 몇 년간 많은 주목을 받고 있습니다. Go 언어는 간단하고 효율적이며 안전하고 개발 및 배포가 용이하도록 설계되었습니다. 높은 동시성, 빠른 컴파일, 메모리 안전성 등의 특징을 갖고 있어 웹 개발, 클라우드 컴퓨팅, 빅데이터 등 분야에서 널리 사용됩니다. 그러나 현재 다양한 버전의 Go 언어를 사용할 수 있습니다. 적합한 Go 언어 버전을 선택할 때 요구 사항과 기능을 모두 고려해야 합니다. 머리

Golang에 클래스와 유사한 객체지향 기능이 있나요? Golang에 클래스와 유사한 객체지향 기능이 있나요? Mar 19, 2024 pm 02:51 PM

Golang(Go 언어)에는 전통적인 의미의 클래스 개념이 없지만, 클래스와 유사한 객체지향 기능을 구현할 수 있는 구조체라는 데이터 형식을 제공합니다. 이 기사에서는 구조를 사용하여 객체 지향 기능을 구현하는 방법을 설명하고 특정 코드 예제를 제공합니다. 구조의 정의와 사용법 먼저 구조의 정의와 사용법을 살펴보자. Golang에서는 type 키워드를 통해 구조를 정의한 다음 필요한 곳에 사용할 수 있습니다. 구조에는 속성이 포함될 수 있습니다.

C++ 함수 유형 및 특성 C++ 함수 유형 및 특성 Apr 11, 2024 pm 03:30 PM

C++ 함수에는 단순 함수, const 함수, 정적 함수 및 가상 함수 유형이 있습니다. 기능에는 인라인 함수, 기본 매개변수, 참조 반환 및 오버로드된 함수가 포함됩니다. 예를 들어,calculateArea 함수는 π를 사용하여 주어진 반경의 원의 면적을 계산하고 이를 출력으로 반환합니다.

자바의 특징은 무엇인가 자바의 특징은 무엇인가 Aug 09, 2023 pm 03:05 PM

Java의 특징은 다음과 같습니다. 1. 간단하고 배우기 쉽습니다. 2. 코드를 더 쉽게 재사용하고 유지 관리할 수 있습니다. 3. 플랫폼 독립적이며 다양한 운영 체제에서 실행 가능합니다. 4. 자동 가비지를 통한 메모리 관리 수집 메커니즘 메모리 관리 5. 변수는 사용하기 전에 해당 유형을 선언해야 합니다. 6. 악성 코드의 무단 액세스 및 실행을 방지할 수 있는 보안. 8. 예외 처리를 통해 프로그램 충돌을 방지할 수 있습니다. 9. 다수의 개발 라이브러리 및 프레임워크 10. 오픈 소스 생태계.

Golang 미들웨어의 주요 기능과 응용 시나리오를 마스터하세요. Golang 미들웨어의 주요 기능과 응용 시나리오를 마스터하세요. Mar 20, 2024 pm 06:33 PM

빠르고 효율적인 프로그래밍 언어인 Golang은 웹 개발 분야에서도 널리 사용됩니다. 그 중 중요한 디자인 패턴인 미들웨어는 개발자가 코드를 더 잘 구성하고 관리할 수 있도록 도와주며, 코드의 재사용성과 유지 관리성을 향상시킬 수 있습니다. 이 기사에서는 Golang의 미들웨어의 주요 기능과 응용 시나리오를 소개하고 특정 코드 예제를 통해 사용법을 설명합니다. 1. 미들웨어의 개념 및 기능 미들웨어는 플러그인 구성요소로서 애플리케이션의 요청-응답 처리 체인에 위치하여 사용됩니다.

See all articles