命名空间分级管理和trait----2019-10-10
程序员文章站
2022-03-11 13:41:58
...
写一个分级的命名空间, 并实现类的自动加载
<?php spl_autoload_register(function($className){ $path = str_replace('\\', DIRECTORY_SEPARATOR, $className); $path = __DIR__.'\\'. $path.'.php'; // echo $path; if(file_exists($path)) include $path; } ); echo \inctest\inc\test\test::getInfo(),'<hr>'; use \inctest\inc\test as myNamespace; //为命名空间起一个别名 echo myNamespace\test::getInfo(),'<hr>'; echo \inctest\test::getInfo(),'<hr>'; echo \inctest\test1::getInfo1(),'<hr>';
结果:
2. 写一个trait类, 理解它的功能与使用场景
<?php namespace test; trait one { public function one() { return '这是trait one中的方法1'; } public function two() { return '这是trait one中的方法2'; } } trait two { public function one() { return '这是trait two中的方法1'; } public function two() { return '这是trait two中的方法2'; } } trait three { public function A() { return '这是trait three中的方法A'; } public function B() { return '这是trait three中的方法B'; } } class A { use three; public function one() { return '这是类A中的方法one'; } public function two() { return '这是类A中的方法two'; } public function A() { return '这是类A中的方法A'; } public function B() { return '这是类A中的方法B'; } } class B extends A { use one { one::one insteadof two; one::two insteadof two; } use two { two::one as first; two::two as second; } public function A() { return '这是类B中的方法A'; } } $B = new B(); echo $B->one(),'<hr>'; echo $B->two(),'<hr>'; echo $B->first(),'<hr>'; echo $B->second(),'<hr>'; echo $B->A(),'<hr>'; echo $B->B(),'<hr>';
运行结果:
总结:
1.在使用命名空间和自动加载时,因为使用类名来组成require或者include引入的文件名称,所以在加载有命名空间的类的时候,这个类的命名空间需要和该类所在脚本的路径统一,并且尽量一个脚本只有一个类。使用use关键字是在类加载完成后,在调用类的时候,可以给类的命名空间起一个别名减少代码量。
2.trait的使用目的目的是为了克服php单继承的缺点,trait的语法和类的语法完全一样,只是在trait中不能写构造方法,并且不能实例化trait。子类、父类和trait的方法和属性优先级:子类在调用方法时,自身的方法优先级最高,1、当trait是在子类中use的引入的时候,trait中的方法优先级大于父类中的方法,此时优先级子类>trait>父类;2、当trait是在父类中用use引入的时候,父类中的方法优先级大于trait中的方法,此时优先级子类>父类>trait。当不同的trait中有同名方法的时候,可以用insteadof关键字来确定使用哪一个trait中的该方法,其他的trait中的该方法可以用as关键字来起一个别名进行应用。