instead of
来指定使用哪个类的哪个方法,或者使用as
来为冲突的方法重命名,见下面示例1;as
来修改方法的访问控制;Interface中只有方法的定义,没有实现。
__CLASS__
的值是use
trait的类名,而不是调用trait
中方法的类。例:父类中进行use
,在子类的实例中进行调用trait
的方法,__CLASS__
的值是父类的类名。use
,引用trait时,如果省略初始\
,则表示是相对当前namespace的相对路径;在引入类时,省略初始\
则表示引入根命名空间下的类。__CLASS__
的特性,可以实现单例的trait。见下面示例2<?php
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;
}
}
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);
}
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。