在php5.4,性状可实现代码重用机制。特性类似于类,但没有继承就不能实例化。它只需要被引入到使用类使用中。

(1)性状的简单利用


< PHP

特质{
公共'test1 var1 =美元;
公共函数test1(){
echo'trait::test1();
}
}

性状B {
公共'test2 var2 =美元;
公共职能test2(){
echo'trait B::test2();
}
}

C类{
使用A,B;
}

新的C();
echo $ C -> var1; / /试验
$ C -> test2(); / /特质B:test2()


(2)优先问题

该特性将覆盖继承的方法,当前类重写特征方法。




特质{
公共$ var1 =测试;
公共功能测试(){
echo'a::测试();
}
公共函数test1(){
echo'a::test1();
}
}

B类{
公共功能测试(){
echo'b::测试();
}
公共函数test1(){
echo'b::test1();
}
}
类C扩展B {
使用;
公共功能测试(){
echo'c::测试();
}
}

新的C();
测试()
$ C -> test1(); / /::test1()



(3)多性状冲突问题

如果冲突没有解决,就会产生致命的错误。

而不是可以用来显式地使用冲突的方法;

AS运算符用于命名冲突方法之一;




特质{
公共功能测试(){
echo'a::测试();
}
}

性状B {
公共功能测试(){
echo'b::测试();
}
}

C类{
使用A,B,{
B::试验来代替;
B::测试为t;
}
}

新的C();
测试()
可以使用以下方式命名



(4)可以用来修改方法访问控制




特质的HelloWorld {
公共函数sayHello(){
echo'hello世界!;
}
}

修改sayHello / /访问控制
类{
使用HelloWorld {sayHello保护;}
}

对已更改的访问控制别名的方法
原来打招呼 / /访问控制是不可改变的
B类{
使用HelloWorld {sayHello私人myprivatehello;}
}

美元=新的A();
$ B -> sayHello(); / /致命错误:调用受保护的方法sayHello()::从语境



(5)特质使用特质。




特质{
公共函数test1(){
echo'test1;
}
}

性状B {
公共职能test2(){
echo'test2;
}
}

特质C {
使用A,B;
}

D类{
使用C;
}

d =新的d();
美元D -> test2(); / / test2



(6)特征支持抽象方法,支持静态方法,不能直接定义静态变量,但静态变量可以用特征方法来引用。




特质{
公共函数test1(){
静态$ = 0;
美元+;
回声$;
}

摘要公共功能(个); / /定义抽象方法
}

B类{
使用;
公共职能test2(){

}
}

新的b();
$ B -> test1(); / / 1
$ B -> test1(); / / 2



(7)特性可以定义属性,但不能在类中定义相同的名称属性。




特质{
公众1美元;
}

B类{
使用;
公共测试2美元;
}