• 技术文章 >后端开发 >php教程

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

    不言不言2018-08-29 15:29:33原创961
    本篇文章给大家带来的内容是关于什么是性状?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('420 9th Avenue, New York, NY 10001 USA');

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

    相关推荐:

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

    以上就是什么是性状?php性状的应用场景的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:php性状
    上一篇:php常量和变量的简单介绍 下一篇:PHP如何调用FACE++ API实现url人脸比较(代码示例)
    大前端线上培训班

    相关文章推荐

    • PHP中使用cURL实现Get和Post请求的方法• php中命名空间与性状以及生成器新特性的详解• PHP命名空间、性状与生成器相关介绍• PHP命名空间、性状与生成器详解• PHP命名空间、性状与生成器案例详解

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网