命名空间
写一个分级的命名空间, 并实现类的自动加载
新建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来解决。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号