PHP代码复用:理解与使用Traits

版权申诉
0 下载量 25 浏览量 更新于2024-08-23 收藏 14KB DOCX 举报
"PHP实现代码复用的一个方法traits新特性_ PHP中的traits是一个在5.4.0版本引入的特性,主要是为了提供一种更灵活的代码复用机制,以弥补传统单继承系统的局限性。 Traits允许开发者将一组方法抽取出来,然后在多个类中进行复用,而无需关心传统的继承关系。这有助于避免多继承带来的复杂性和混入类(Mixin)可能导致的问题。 Trait的使用方式类似于类,但是它不能被实例化,只能被其他类包含和使用。这样,类可以通过`use`关键字来引入trait中的方法,从而在不改变类的继承结构的情况下添加功能。下面是一个trait的基本使用示例: ```php trait MyTrait { public function myMethod() { // 方法实现 } } class MyClass { use MyTrait; // 其他类方法 } ``` 在这个例子中,`MyClass`通过使用`MyTrait`,获得了`myMethod`方法。如果`MyClass`本身或其父类中已经有一个同名方法,那么PHP会根据优先级规则处理方法覆盖: - 类中的方法优先级最高,会覆盖trait和父类中的同名方法。 - trait中的方法优先级其次,会覆盖父类中的同名方法。 例如: ```php class Base { public function sayHello() { // 基类方法 } } trait SayWorldTrait { public function sayHello() { parent::sayHello(); echo 'World!'; } } class MyHelloWorld extends Base { use SayWorldTrait; } $obj = new MyHelloWorld(); $obj->sayHello(); // 输出:HelloWorld! ``` 在这个例子中,`SayWorldTrait`的`sayHello`方法覆盖了`Base`类的`sayHello`方法。当调用`$obj->sayHello()`时,首先执行了`Base`类中的`sayHello`,然后添加了`SayWorldTrait`中的额外逻辑,输出了“World!”。 traits为PHP提供了更细粒度的功能组合,使得开发者在设计代码时能够更好地复用和组织代码,同时保持类的单一职责和清晰的继承结构。在处理多个类需要共享相似功能的场景下,traits是一种非常实用的工具。

/usr/bin/ld: CMakeFiles/global_planning_node.dir/src/global_planning_node.cpp.o: in function main.cold': global_planning_node.cpp:(.text.unlikely+0x273): undefined reference to tf::TransformListener::~TransformListener()' /usr/bin/ld: CMakeFiles/global_planning_node.dir/src/global_planning_node.cpp.o: in function main': global_planning_node.cpp:(.text.startup+0xc64): undefined reference to tf::Transformer::DEFAULT_CACHE_TIME' /usr/bin/ld: global_planning_node.cpp:(.text.startup+0xc92): undefined reference to tf::TransformListener::TransformListener(ros::Duration, bool)' /usr/bin/ld: global_planning_node.cpp:(.text.startup+0xd7a): undefined reference to tf::Transformer::lookupTransform(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::_cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&, tf::StampedTransform&) const' /usr/bin/ld: global_planning_node.cpp:(.text.startup+0xe74): undefined reference to tf::TransformListener::~TransformListener()' collect2: error: ld returned 1 exit status make[2]: *** [CMakeFiles/global_planning_node.dir/build.make:246: /home/juan/catkin_ws/devel/.private/putn/lib/putn/global_planning_node] Error 1 make[1]: *** [CMakeFiles/Makefile2:207: CMakeFiles/global_planning_node.dir/all] Error 2 make[1]: *** Waiting for unfinished jobs.... /usr/bin/ld: CMakeFiles/local_obs_node.dir/src/local_obs.cpp.o: in function rcvVelodyneCallBack(sensor_msgs::PointCloud2<std::allocator<void> > const&)': local_obs.cpp:(.text+0xa0b): undefined reference to tf::Transformer::waitForTransform(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ros::Time const&, ros::Duration const&, ros::Duration const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) const' /usr/bin/ld: local_obs.cpp:(.text+0xc74): undefined reference to tf::TransformListener::transformPoint(std::cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, geometry_msgs::PointStamped<std::allocator<void> > const&, geometry_msgs::PointStamped<std::allocator<void> >&) const' /usr/bin/ld: CMakeFiles/local_obs_node.dir/src/local_obs.cpp.o: in function main.cold': local_obs.cpp:(.text.unlikely+0x37d): undefined reference to tf::TransformListener::~TransformListener()' /usr/bin/ld: CMakeFiles/local_obs_node.dir/src/local_obs.cpp.o: in function main':local_obs.cpp:(.text.startup+0x62a): undefined reference to tf::Transformer::DEFAULT_CACHE_TIME' /usr/bin/ld: local_obs.cpp:(.text.startup+0x64d): undefined reference to tf::TransformListener::TransformListener(ros::Duration, bool)' /usr/bin/ld: local_obs.cpp:(.text.startup+0x6dc): undefined reference to tf::TransformListener::~TransformListener()' collect2: error: ld returned 1 exit status make[2]: *** [CMakeFiles/local_obs_node.dir/build.make:246: /home/juan/catkin_ws/devel/.private/putn/lib/putn/local_obs_node] Error 1 make[1]: *** [CMakeFiles/Makefile2:612: CMakeFiles/local_obs_node.dir/all] Error 2 make: *** [Makefile:141: all] Error 2解释编译时出现这个问题的原因,并说说如何解决

2023-07-10 上传