首页 >后端开发 >php教程 >什么是性状?php性状的应用场景

什么是性状?php性状的应用场景

不言
不言原创
2018-08-29 15:29:331849浏览

本篇文章给大家带来的内容是关于什么是性状?php性状的应用场景 ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

为什么使用性状?

       PHP语言使用种典型的继承模型。 在这种模型中,我们先编写一个通用的根类,实现基本的功能,然后护展这个根类,创建更具体的类,从直接父类继承实现。这叫做继承层次结构,  很多编程语言都使用了这个模式。

      大多数时候,这种典型的继承模型能良好运作。可是,如果想让两个无关的PHP类具有类似的行为,应该怎么做呢?例如,RetailStore和Car两个PHP类的作用十分不同,而且在继承层次结构中没有共同的父类。不过,这两个类都应该能使用地理编码技术转换成经纬度,然后在地图上显示。
       性状就是为了解决这种问题而诞生的。性状能把模块化的实现方式往人多个无关的类中。而且性状还能促进代码重用。
       为了解决这个问题,我的第一反应是创建 一个父类Geocodable (这么做不好),让Retalstore和Car都继承这个类。这种解决方法不好,因为我们强制让两个无关的类继承同一个祖先,而且很明显,这个祖先不属于各自的继承层次结构。
       我的最后的反应是创建Geocodable性状(这么做最好),定义井实现地理编码机国发孔这两个类原本法,然后把在Retailstore和Car两个类中混人这个性状。这么做不会搅古自然的继承层次结构。

例如

我们希望RetailStore和Car这两个类提供地理编码功能,而且认识到继承和接口都不最佳方案。我们选择的方案是创建Geocodable性状,返回经纬度,然后在地图中绘制。Geocedable性状的定义如下:

?php
trait Geocodable {
	/** @var string */
	protected $address;

	/** @var \Geocoder\Geocoder */
	protected $geocoder;
	/** @var \GeocoderlResult\Geocoded */
	protected $geocoderResult;
	public function setGeocoder(\Geocoder\GeocoderIntertace $geocoder){
		$this->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->getLongitude();
	}
	protected function geocodeAddress(){
		$this->geocoderResult = $this->geocoder->geocode($this->address);
		return true;
	}
}

       Geocodable性状只需定义实现地理编码功能所需的属性和方法,除此之外什么都不需,这个Geocodable性状定义了三个类属性:一个 表示地址(字符串),一个是地理编码器对象,一个是地理编码器处理后得到的结果对象。我们还定义了四个公开方法和一个受保护的方法。setGeocoder()方法用 于注入Geocoder对象; setAddress()方法用于设定地址; getlatitude()和getLongitude()方 法分别返回纬度和经度; geocodeAddress()方法把地址字符串传给Geocoder实例,获取经地理编码器处理得到的结果。
如何使用性状?

     PHP性状的使用方法很简单,把use MyTrait;语 句加到PHP类的定义体中即可。下面是个示例。显然,实际使用时要把MyTrait替换成相应的PHP性状名。

<?php
class MyClass{
    use MyTrait;
    //这是类的实现
}

建议:命名空间和性状都使用use关键字导人,可是导人的位置有所不同。命名空间、类、接口、函数和常量在类的定义体外导人,而性状在类的定义体内导人。这个区别虽然小,但很重要。并且使用use的前提是你已经include引入PHP文件。

我们只需做这么多。现在,每个Retailstore实例都能使用Geocodable性状提供的属性和方法了,即:

$store = new RetailStore();
$store->setddress(&#39;420 9th Avenue, New York, NY 10001 USA&#39;);

php解释器会在编译时把性状复制粘贴到类的定义体中。

相关推荐:

PHP命名空间、性状与生成器详解

以上是什么是性状?php性状的应用场景的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn