Home > Backend Development > PHP Tutorial > How to use traits to achieve PHP code reuse

How to use traits to achieve PHP code reuse

伊谢尔伦
Release: 2023-03-12 13:40:02
Original
1399 people have browsed it

This article mainly introduces the examples of using traits to implement code reuse in PHP. This article explains the simple use of Traits, priority issues, multiple Trait conflict issues, and how as can be used to modifyAccess Control, the use of Trait in Trait, etc. Friends who need it can refer to

Traits were added after PHP5.4 to implement the code reuse mechanism. Traits are similar to classes, but cannot be instantiated. There is no need to inherit, just use the keyword use to introduce it in the class. Multiple Traits can be introduced, separated by ','.

(1) Trait is simple to use

<?php
 
trait A {
  public $var1 = &#39;test1&#39;;
  public function test1() {
    echo &#39;trait A::test1()&#39;;
  }
}
 
trait B {
  public $var2 = &#39;test2&#39;;
  public function test2() {
    echo &#39;trait B::test2()&#39;;
  }
}
 
class C {
  use A,B;
}
 
$c = new C();
echo $c->var1; //test1
$c->test2(); //trait B::test2()
Copy after login

(2) Priority issue
Trait will override the inherited method, and the current class will Override Trait methods.

trait A {
  public $var1 = &#39;test&#39;;
  public function test() {
    echo &#39;A::test()&#39;;
  }
  public function test1() {
    echo &#39;A::test1()&#39;;
  }
}
 
class B {
  public function test() {
    echo &#39;B::test()&#39;;
  }
  public function test1() {
    echo &#39;B::test1()&#39;;
  }
}
class C extends B{
  use A;
  public function test() {
    echo &#39;c::test()&#39;;
  }
}
 
$c = new C();
$c->test(); //c::test()
$c->test1(); //A::test1()
Copy after login

(3) Multiple Trait conflict issues
If the conflict is not resolved, a fatal error will occur;
Insteadof can be used to clarify which method in the conflict to use;
You can use the as operator to rename one of the conflicting methods;

trait A {
  public function test() {
    echo &#39;A::test()&#39;;
  }
}
 
trait B {
  public function test() {
    echo &#39;B::test()&#39;;
  }
}
 
class C {
  use A,B {
    B::test insteadof A;
    B::test as t;
  }
}
 
$c = new C();
$c->test(); //B::test()
$c->t(); //B::test()  可以用as另起名
Copy after login

(4) as can be used to modify method access control

trait HelloWorld {
  public function sayHello () {
    echo &#39;Hello World!&#39; ;
  }
}
 
// 修改 sayHello 的访问控制
class A {
  use HelloWorld { sayHello as protected; }
}
 
// 给方法一个改变了访问控制的别名
// 原版 sayHello 的访问控制则没有发生变化
class B {
  use HelloWorld { sayHello as private myPrivateHello ; }
}
 
$b = new A();
$b->sayHello(); //Fatal error: Call to protected method A::sayHello() from context &#39;&#39;
Copy after login

(5) Trait is used in Trait

trait A {
  public function test1() {
    echo &#39;test1&#39;;
  }
}
 
trait B {
  public function test2() {
    echo &#39;test2&#39;;
  }
}
 
trait C {
  use A,B;
}
 
class D {
  use C;
}
 
$d = new D();
$d->test2(); //test2
Copy after login

(6) Trait supports abstract methods, supports static methods, and cannot directly define static variables, but static variables Can be referenced by trait method .

trait A {
  public function test1() {
    static $a = 0;
    $a++;
    echo $a;
  }
 
  abstract public function test2(); //可定义抽象方法
}
 
class B {
  use A;
  public function test2() {
 
  }
}
 
$b = new B();
$b->test1(); //1
$b->test1(); //2
Copy after login

(7) Trait can define attributes, but the same name attribute cannot be defined in the class

trait A {
  public $test1;
}
 
class B {
  use A;
  public $test2;
}
Copy after login

The above is the detailed content of How to use traits to achieve PHP code reuse. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template