摘要:完成一部分接口的功能,同时也完成一部分父类的功能。这时,两个类有了同样的功能获取当前对象的经纬度属性。因为这两个类确实是完全不相关的,并不应该继承同一祖先。创建接口,让这两个类均实现这两个接口。
trait完成一部分接口的功能,同时也完成一部分父类的功能。
举个例子来说明trait的需求场景:
当有两个class:RetailStore和Car类,这两个类,他们并不继承同一个父类,是两个不同的子类。现在有一个需求,需要这两个类都显示他们的经纬度属性。这时,两个类有了同样的功能:获取当前对象的经纬度属性。
解决这个问题有3个办法:
创建一个父类Geocodable,让两者都继承该类。然而这种方法并不好。因为这两个类确实是完全不相关的,并不应该继承同一祖先。
创建Geocodable接口,让这两个类均实现这两个接口。这种方法相对好一点,两个类均能保持自己的继承层次接口,只在当前的这两个类中实现这个接口,完成相同的功能。但是,我们要在这两个类中实现相同的功能,代码有重复,这样并不好。
最好的办法:创建Geocodabletrait,定义并实现经纬度相关方法,然后把在RetailStore和Car两个类中混入这个trait。这么做,即不会破坏继承层次结构,同时又实现复用。
创建Trait定义trait:
geocoder = $geocoder; } public function setAddress($address) { $this->address = $address; } public function getLatitude() { if (isset($this->geocoderResult) === false) { $this->geocodeAddress(); } return $this->geocoderResult->getLatitude(); } public function getLongitude() { if (isset($this->geocoderResult) === false) { $this->geocodeAddress(); } return $this->geocoderResult->getLonnitude(); } protected function geocodeAddress() { $this->geocoderResult = $this->geocoder->geocode($this->address); return true; } }如何使用class RetailStore { use Geocodable; }这样,每一个RetailStore类都可以使用Geocodable的特性了。
setAddress("your set address"); $store->setGeocoder($geocoder); $latitude = $store->getLatitude(); $longitude = $store->getLongitude(); echo $latitude, ":", $longitude;参考
Modern PHP
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/21651.html
摘要:判断是否存在构造函数,不存在直接实例化,存在则通过来获取输入函数,并有相应的方法解决依赖参数问题,实现依赖注入。 Laravel 框架关键技术解析·读书笔记(一) 第一章 入口文件 请求访问的入口文件,主要完成几部分工作,分别是: 自动加载函数的添加 服务器实例化与服务注册 路由加载 请求实例化与路由分发 相应生成与发送 其中,自动加载函数用于包含引用文件,改文件是composer...
摘要:在阅读文档的时候看到一个类是以声明的。是一种代码复用技术,为的单继承限制提供了一套灵活的代码复用机制。下面把的代码做一个修改以上代码会输出。可以看出优先级的顺序为,当前类的优先级基类。 在阅读laravel文档的时候看到一个类 是以 Trait声明的。平时在工作中从来没有用过,于是就去看了下官方文档。原来这个类早在php5.4.0就有了。可惜在项目中从来没有用过。 Trait看...
摘要:关于作者程序开发人员,不拘泥于语言与技术,目前主要从事和前端开发,使用和,端使用混合式开发。和组合的语义定义了一种减少复杂性的方式,避免传统多继承和类相关典型问题。它为传统继承增加了水平特性的组合也就是说,应用的几个之间不需要继承。 关于作者 程序开发人员,不拘泥于语言与技术,目前主要从事PHP和前端开发,使用Laravel和VueJs,App端使用Apicloud混合式开发。合适和...
摘要:是一种为类似的单继承语言而准备的代码复用机制。因为中的变量环境是基于函数的,所以会输出博客链接代码复用机制,本文后续如有更新将会在博客更新。 提到 php 的代码复用,我们可能第一时间会想到继承,但是这种单继承语言一旦派生的子类过多,那么会产生一系列的问题,比如依赖父类、耦合性太大、破坏了类的封装性。那么有没有更好的方法来实现代码复用呢? 自 PHP 5.4.0 起,PHP 实现了另外...
阅读 3774·2021-10-12 10:12
阅读 1428·2021-10-11 10:58
阅读 2264·2021-10-09 10:01
阅读 2551·2021-09-24 09:48
阅读 2682·2021-09-09 11:38
阅读 3512·2019-08-30 15:44
阅读 1709·2019-08-30 14:22
阅读 504·2019-08-29 12:42