특성 사용법
풀어 주다: 2016-07-29 09:15:16
원본 출처: http://blog.csdn.net/longlongmylove/article/details/7521379
php5.4 새로운 기능 소개1. 특성
특성은 코드 재사용을 위해 5.4에 추가된 새로운 방법입니다. PHP는 단일 상속 언어입니다. Java와 같은 코드 재사용을 달성하기 위해 하나의 클래스에서 여러 기본 클래스를 확장할 수 없습니다. 이제 Traits는 이 코드 재사용 문제를 해결하여 개발자가 여러 다른 클래스에서 코드 재사용을 구현할 수 있습니다.
특성과 클래스의 의미론적 정의는 코드의 복잡성을 줄이고 다중 상속 문제를 방지하는 것입니다. 특성은 클래스와 유사하지만 통합되고 세분화된 방식으로 함수 집합을 제공하는 데만 사용됩니다. 특성은 특성 내부에서 인스턴스화할 수 없습니다. 즉, 클래스와 유사한 생성자 __construct(가 없습니다. ). 특성은 PHP 기존 상속의 확장 역할을 하며 수평 통합을 구현하므로 애플리케이션 클래스에서는 더 이상 상속이 필요하지 않습니다. 1)
을 사용하여 클래스에서 키워드 'use'를 사용하여 특성을 참조하는 방법입니다. 여러 특성은 ','로 구분됩니다. 예제 코드는 다음과 같습니다.
[php] view
일반 사본
- 특성 ezcReflectionReturnInfo {
- 함수 getReturnType() {
- }
- 함수 getReturnDescription() {
- }
- }class ezcReflectionMethod 확장 ReflectionMethod {
- 사용 ezcReflectionReturnInfo
- /* … */
- }
- 클래스 ezcReflectionFunction 확장 ReflectionFunction { ezcReflectionReturnInfo;
- /* ... */
- } ?>
-
- 2) 우선순위기본 클래스의 멤버 함수는 Traits의 함수 적용 범위를 의미합니다. 이는 현재 클래스의 멤버 함수가 Traits의 함수를 재정의한다는 의미입니다.
[php] 보기
일반 사본
- class 기본 {
- 공개 함수 sayHello() {
- 에코 '안녕하세요';
- }
- }
-
- 특성 SayWorld {
- 공개 기능 sayHello() {
- parent::sayHello();
- 에코 "World!n";
- }
- }
-
- class MyHelloWorld 확장 Base {
- 사용 SayWorld;
- }
-
- 수업 MyHelloWorldExt 확장 Base {
- 사용 SayWorld;
- 공개 함수 sayHello() {
- /**
- * 5.4의 새로운 변경 사항은 다음과 같습니다. 5.4 이전 버전에서는 다음 메시지가 표시됩니다.
- * PHP 치명적인 오류: 문자열 오프셋을 배열로 사용할 수 없습니다
- * 5.4에서 개선되어 문자열에서 인덱스 번호의 문자를 반환합니다.
- */
- $str = "아르빈";
- 에코 $str[0][0];// 에코 'A';
- }
-
- 공개 함수 shortArray() {
- $array = ['첫 번째', 2, 3, 4];//5.4中的数组简单语법
- 에코 $array[0];//5.4中的数组解引用取数组元素方法
- }
- }
-
- $o = 새 MyHelloWorld( );
- $o->sayHello();
- $oe = new MyHelloWorldExt();
- $oe->sayHello();
- 에코 "n";
- $oe->shortArray();
[php] 보기
일반 사본
- 输출:
- Hello World!
- 아
- 먼저
3) 다중 특성클래스 선언에 다중 특성을 추가할 수 있으며, 다중 특성은 ","로 구분됩니다.
[php] 보기
일반 사본
- 특성 안녕하세요 {
- public function sayHello() {
- echo '안녕하세요' 🎜>
특성세계 { - 공개
- 함수 sayWorld() {
- 에코 '세계'
- class MyHelloWorld { 사용
- Hello World
- }
-
- $o = new
- MyHelloWorld() $o
- ->안녕하세요( );
-
$o
- ->sayWorld() ?> 출력 결과: 4) 다중 특성 충돌 동일한 클래스에 두 개의 특성이 추가된 경우 명시적인 처리 없이 동일한 함수 이름을 사용하면 오류가 생성됩니다. 같은 클래스의 Tratis에서 같은 이름을 가진 두 함수 간의 충돌을 해결하려면 대신 연산자를 사용하여 올바른 함수를 선택해야 합니다.
메서드의 고유성과 배타성으로 인해 내부 충돌을 해결하기 위해 충돌하는 함수 뒤에 'as' 연산자를 사용할 수 있습니다. - [php] 보기
일반 사본
- 특성 A {
- 공개 기능 smallTalk() {
- 에코 '아';
- }
- 공개 기능 bigTalk() {
- 에코 'A';
- }
- }
-
- 특성 B {
- 공개 기능 smallTalk() {
- 에코 'b';
- }
- 공개 기능 bigTalk() {
- 에코 'B';
- }
- }
-
- 수업 화자 {
- 사용 A, B {
- A 대신 B::smallTalk;
- B 대신 A::bigTalk;
- }
- }
-
- class Aliased_Talker {
- 사용 A, B {
- A 대신 B::smallTalk;
- B 대신 A::bigTalk;
- B::bigTalk 대화;
- }
- }
- ?>
상면적例子中,Talker使用 특성 A 와 B,因此两者中상동적函数name称存재冲突。
alker中定义了smallTalk取自Traits B ,bigTalk取自Traits A.
Aliased_Talker중간 Commun过使는 操작품 B중의 bigTalk통신 来确保Traits B중의 bigTalk통신 过别nametalk来实现으로 사용됩니다.
5)改变函数访问权限
我们可以使는语法来改变특성으로 사용됩니다.中函数的访问权限属性。
[php] 보기
일반 사본
- 특성 HelloWorld {
- 공개 함수 sayHello() {
- 에코 'Hello World!';
- }
- }
-
- // sayHello의 공개 상태 변경,改变sayHello的访问权限。
- 클래스 MyClass1 {
- 사용 HelloWorld { sayHello 보호됨 ; }
- }
-
- // 별칭 메서드가 변경됨 가시성
- // sayHello 가시성 변경되지 않음,设置别namemyPrivateHello。
- class MyClass2 {
- 사용 HelloWorld { sayHello 비공개 myPrivateHello; }
- }
- ?>
6) 특성은 새로운 특성을 형성합니다
많은 클래스와 마찬가지로 특성은 클래스에서 사용할 수 있고 특성은 특성에서 사용할 수 있습니다. 하나 이상의 특성은 하나의 특성에 정의될 수 있으며, 이러한 특성은 일부 또는 전체 구성원으로 다른 특성에 정의될 수 있습니다.
[php] 보기
일반 사본
- 특성 안녕하세요 {
- public function sayHello() {
- echo '안녕하세요'
- } 🎜>
-
- 특성 세계 {
- 공개
- 함수 sayWorld() { 에코
- '세상!' } >특성 HelloWorld {
- 사용
- Hello, World
- }
-
- 클래스 MyHelloWorld {
- 사용
- HelloWorld
- } 🎜>$o =
- 새 MyHelloWorld()
- $o ->sayHello();
?> 위 루틴은 다음을 출력합니다: - [php] view
일반 사본
Hello World!
- 7) Abstract Trait 멤버 특정 메소드를 강제로 구현하기 위해 Traits에서 추상 메소드를 사용할 수 있습니다. 예:
- [php] 보기
일반 사본
- 특성 안녕하세요 {
- 공개 함수 sayHelloWorld() {
- 에코 '안녕하세요'.$this->getWorld();
- }
- 추상 공개 함수 getWorld();
- }
-
- 수업 MyHelloWorld {
- 비공개 $world;
- 사용 안녕하세요;
- 공개 함수 __construct($world) {
- $this->world = $world;
- }
- 공개 기능 getWorld() {
- return $this->world;
- }
- }
-
- /**
- * 여기에서는 새로운 5.4 기능 클래스 인스턴스 역참조 작업이 사용됩니다.
- * ( new class())->method();
- */
- (신규 MyHelloWorld('아르빈'))->sayHelloWorld();
- ?>
-
- 该实例输出:
- 안녕하세요 Arvin
8)静态Trait成员在Traits中不能定义static 静态变weight,但是可以定义在Tratis的函数中。Tratis中样可以定义静态函数.
[php] 보기
일반 사본
- trait Counter {
- public function inc() {
- static $c = 0;//静态变量
- $c += 1;
- echo "$c\n";
- }
- /**
- * 静态方法
- */
- public static function doSomething() {
- echo 'Doing something';
- }
- }
-
- class C1 {
- use Counter;
- }
-
- (new C1())->inc(); // echo 1
- C1::doSomething();
- ?>
- 输出为:
- 1
- Doing something
9) Traits 定义属性如果在一个trait中定义了一个属性,则在引用该trait的类中不能定义同名的属性,如果该类中定义有和trait中已定义属性具有相同的名字和访问可见性,则是一个E_STRICT 提示,否则抛出语法错误。<?php
trait PropertiesTrait {
public $x = 1;
public $y = 2;
}
class PropertiesExample {
use PropertiesTrait;
public $x = 1;
//public $y = 3;
}
$example = new PropertiesExample;
echo $example->x, $example->y;
?>
输出:
12
로그인 후 복사
在最后贴上php5.4.0部分新功能changelog:Added short array syntax support ([1,2,3]), see UPGRADING guide for full details.
Added binary numbers format (0b001010).
Added support for Class::{expr}() syntax.
Added support for Traits.//本文的主要内容
Added closure $this support back.
Added array dereferencing support.//数组解引用支持,上文中有实例
Added callable typehint.
Added indirect method call through array. #47160.
Added DTrace support.//传说DTrace是一个性能分析工具,可以跟踪出函数调用点,返回点等数据
Added class member access on instantiation (e.g. (new foo)->bar()) support.//类新实例解引用操作,上文中有实例
로그인 후 복사
本文旨在抛砖引玉,希望大家一起继续探究php5.4的新功能。^_^
以上就介绍了Traits的用法,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
-
2024-10-22 09:46:29
-
2024-10-13 13:53:41
-
2024-10-12 12:15:51
-
2024-10-11 22:47:31
-
2024-10-11 19:36:51
-
2024-10-11 15:50:41
-
2024-10-11 15:07:41
-
2024-10-11 14:21:21
-
2024-10-11 12:59:11
-
2024-10-11 12:17:31