首先这个use和闭包没有关系,只是说在namespace下面引用类。
最近看了一下larevel框架,作为一个Yii的忠实粉丝,真的真的不想换,但没办法,还是要学习下最好语言的最好框架。
铺面而来的文件夹结构好多,说好的大道至简呢。
后看到很多class内部写了很多use,表示十分的费解。写里面和外面不知道有啥区别。
写在外面很容易理解,会直接遵循psr的autoload规范,写里面不清楚有啥区别。所以测试记录一下。
追着源码一路看下去发现,use类的声明都是通过Trait关键字声明的。官方给出的解释是
Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。
通俗一点理解,就是更加灵活的去继承复用了。
class Base {
public function sayHello() {
echo 'Hello ';
}
}
trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
class MyHelloWorld extends Base {
use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
上面的代码输出hello world!
多类继承冲突的解决
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;
}
}
网友评论