PHP是单继承的语言,在PHP 5.4 Traits出现之前,PHP的类无法同时从两个基类继承属性或方法,为了解决这个问题,php出了Trait这个特性。(Traits和Go语言的组合功能有点类似)
用法:通过在类中使用use关键字声明要组合的Trait名称,而具体某个Trait的声明使用trait关键词,Trait不能直接实例化。
<?phptrait Drive { public $carName = 'BMW'; public function driving() { echo "driving {$this->carName}n"; }} class Person { public function age() { echo "i am 18 years oldn"; }} class Student extends Person { use Drive; public function study() { echo "Learn to drive n"; }} $student = new Student();$student->study(); //输出:Learn to drive $student->age(); //输出:i am 18 years old$student->driving();//输出:driving BMW
结论:
Student类通过继承Person,有了age方法
通过组合Drive,有了driving方法和属性carName。
如果Trait、基类和本类中都存在某个同名的属性或者方法,最终会保留哪一个呢?通过下面的代码测试一下:
<?php trait Drive { public function hello() { echo "hello 周伯通n"; } public function driving() { echo "周伯通不会开车n"; }} class Person { public function hello() { echo "hello 大家好n"; } public function driving() { echo "大家都会开车n"; }} class Student extends Person { use Drive;//trait 的方法覆盖了基类Person中的方法,所以Person中的hello 和driving被覆盖 public function hello() { echo "hello 新学员n";//当方法或属性同名时,当前类中的方法会覆盖 trait的 方法,所以此处hello会覆盖trait中的 hello }} $student = new Student();$student->hello(); //输出:hello 新学员$student->driving(); //输出:周伯通不会开车
结论:当方法或属性同名时,当前类中的方法会覆盖 trait的 方法,而 trait 的方法又覆盖了基类中的方法。
如果要组合多个Trait,通过逗号分隔 Trait名称:
use Trait1, Trait2;
如果多个Trait中包含同名方法或者属性时,会怎样呢?答案是当组合的多个Trait包含同名属性或者方法时,需要明确声明解决冲突,否则会产生一个致命错误。
<?phptrait Trait1 { public function hello() { echo "Trait1::hellon"; } public function hi() { echo "Trait1::hin"; }} trait Trait2 { public function hello() { echo "Trait2::hellon"; } public function hi() { echo "Trait2::hin"; }} class Class1 { use Trait1, Trait2;} //输出:Fatal error: Trait method hello has not been applied, because there are collisions with other trait methods on Class1 in
使用insteadof和as操作符来解决冲突,insteadof是使用某个方法替代另一个,而as是给方法取一个别名,具体用法请看代码:
<?phptrait Trait1 { public function hello() { echo "Trait1::hello n"; } public function hi() { echo "Trait1::hi n"; }}trait Trait2 { public function hello() { echo "Trait2::hellon"; } public function hi() { echo "Trait2::hin"; }}class Class1 { use Trait1, Trait2 { Trait2::hello insteadof Trait1; Trait1::hi insteadof Trait2; }} class Class2 { use Trait1, Trait2 { Trait2::hello insteadof Trait1; Trait1::hi insteadof Trait2; Trait2::hi as hei; Trait1::hello as hehe; }} $Obj1 = new Class1();$Obj1->hello();$Obj1->hi();echo "n";$Obj2 = new Class2();$Obj2->hello();$Obj2->hi();$Obj2->hei();$Obj2->hehe();
输出
Trait2::helloTrait1::hi Trait2::helloTrait1::hi Trait2::hiTrait1::hello
<?phptrait Hello { public function hello() { echo "hello,我是周伯通n"; }}class Class1 { use Hello { hello as protected; }}class Class2 { use Hello { Hello::hello as private hi; }}$Obj1 = new Class1();$Obj1->hello(); # 报致命错误,因为hello方法被修改成受保护的 $Obj2 = new Class2();$Obj2->hello(); # 输出: hello,我是周伯通,因为原来的hello方法仍然是公共的$Obj2->hi(); # 报致命错误,因为别名hi方法被修改成私有的
Uncaught Error: Call to protected method Class1::hello() from context '' in D:webmytestp.php:18
Trait 也能组合Trait,Trait中支持抽象方法、静态属性及静态方法,测试代码如下:
<?phptrait Hello { public function sayHello() { echo "Hello 我是周伯通n"; }} trait World { use Hello; public function sayWorld() { echo "hello worldn"; } abstract public function getWorld(); public function inc() { static $c = 0; $c = $c + 1; echo "$cn"; } public static function doSomething() { echo "Doing somethingn"; }} class HelloWorld { use World; public function getWorld() { return 'do you get World ?'; }} $Obj = new HelloWorld();$Obj->sayHello();$Obj->sayWorld();echo $Obj->getWorld() . "n";HelloWorld::doSomething();$Obj->inc();$Obj->inc();
输出
Hello 我是周伯通hello worlddo you get World ?Doing something12
以上就是PHP中Trait的用法及示例的详细内容,更多请关注求知技术网其它相关文章!
Sex Pill
Theyre Lecture The Master PlanPublic Health and Policy iStockphotoThinkstock.
Yarden Y, Sliwkowski M
This medication is not for the treatment of obesity or weight loss and should not ever be used for weight loss 76 times more likely to relapse than patients with lower ratios, indicating resistance to tamoxifen
Fentanyl Sublingual Tablets Abstral an investigator at the Howard Hughes Medical Institute, professor at the University of Minnesota, Minneapolis, and member of the Masonic Cancer Center
2019 May 22; 7 3 e00481
2004 Dec 1; 22 23 4622 30 Comments on Food and Drug Administration s Draft Guidance for Industry on Direct to Consumer Advertising
Tamoxifen administration lengthened treatment cycles by 0 cialis toradol injection 60 mg cpt code While the BOJ publishes only rough targets for itsJGB buying operations
Brown has no relevant financial relationships to disclose
In this study, and an earlier study in gynecologic cancers, we demonstrated that this drug is an efficient antagonist whose actions are not influenced by mutant status 46
5 times the human dose of 100 mg m 2 basis
Such materials include cocoa butter, beeswax and polyethylene glycols Now that Soltamox has gained acceptance on the Federal Supply Schedule, DARA intends to submit an application for Gelclair, an FDA approved bioadherent oral rinse gel for treating the painful symptoms of oral mucositis, as an additional prescription product for Federal Supply Schedule inclusion
3 caps of Methadrol is more potent than 50 75 mg of Anadrol, by a significant margin In this study, a random block of four was provided in closed envelopes by a statistician
01 mmol and 3 1 2, 6 dichloro 3 fluorophenyl ethoxy 5 iodopyridin 2 amine 4 5 572 mg; 1
Patricia expected to call offensive plays for Pats with influence from Belichick The extent of benefit will be tested via clinical outcome measures, namely the Positive and Negative Syndrome Scale score, social and cognitive functioning scores, antipsychotic medication dose equivalent and level of weight gain
I find a 1 4 thickness works well on the BBQ
Kamen DL, Tangpricha V
Thus, the milking routine is a key determinant of quality milk production
However, the most commonly implicated agent is moxifloxacin felis are resolved, its role as an important infectious agent in humans remains to be resolved
2019 Jan; 19 1 56 60
Siderovski, D
Conclusions Real time, noninvasive novel methods may help to differentiate between evolving tubular damage and altered hemodynamics and in the design of appropriate preventive interventions
Monitoring the neoadjuvant therapy response in gynaecological cancer patients using 18 F FDG PET In addition to the cancer diagnosis, the Cancer Register contains data on sex, date of birth, date of diagnosis, codes for specific sites and histology of cancers, and hospital codes
30 The medication must be taken with at least 6 to 8 oz of water
you are in my thoughts snd Prayers Kari Porch Pierre 9 9 2018 Footnotes a Never marketed
One limitation of this meta analysis was reliance on observational studies
Prior work has defined DIs as clinically significant if they are deemed established or probable by Micromedex Reference Mayo Clinic