命名空间
写一个分级的命名空间, 并实现类的自动加载
新建test.php
<?php
namespace test\one\two\three;
class Test1{
public static function demo() {
return __METHOD__;
}
}
class Test2{
public static function demo(){
return __METHOD__;
}
}
新建ceshi.php
<?php//命名空间的别名引用
namespace cs;
include __DIR__ . '/test.php';
use test\one\two\three\Test1 as T;
echo T::class;
//结果:test\one\two\three\Test1
echo '<hr>';
// 如果省略as ,那么当前类的别名就是当前类的去掉空间名称的类名
use test\one\two\three\Test1;
echo Test1::class;
//结果:test\one\two\three\Test1
// use
// 默认从全局开始, 可以省略掉: \
// as 给当前的空间名称起一个别名
// 防止当前空间名称命名冲突
使用use实现类的自动加载。
trait类
介于父类和子类之间,解决PHP的单继承的一种代码复用机制。
实例
<?php namespace cs; // 两个 trait 都插入了一个同名的方法,解决方法 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{ // insteadof单词的意思为代替 B::smallTalk insteadof A; //可以理解为trait B里面的smallTalk方法代替trait A里面的,优先级高 A::bigTalk insteadof B; //可以理解为trait A里面的bigTalk方法代替trait B里面的,优先级高 } } $obj = new Talker(); $obj ->smallTalk(); //结果:b $obj ->bigTalk(); //结果:A echo '<br>'; class Aliased_Talker { use A, B { B::smallTalk insteadof A; //B的smalltalk方法优先级高于A的 A::bigTalk insteadof B; //A的bigtalk方法优先级高于B的 B::bigTalk as Btalk; //如果想要运行B的bigTalk可以单独设置别名 A::smallTalk as atalk; //如果想要运行B的bigTalk可以单独设置别名 } } $obj1 = new Aliased_Talker(); $obj1 ->smallTalk(); //结果:b $obj1 ->bigTalk(); //结果:A $obj1 ->Btalk(); //结果:B $obj1 ->atalk(); //结果:a ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
结果:
bA
bABa
总结:
trait介于父类和子类之间,子类继承父类,use trait,子类有trait的方法,创建子类对象,运行方法是运行的子类里面的,如果子类里面没有这个方法,会运行trait里面的,如果trait里面没有就会运行父类里面的。
子类use的多个trait的里面有相同的方法,可以使用insteadof或者as来解决。