<?php trait Geocodable{ /** @var string */ protected $address; /** @var GeocoderGeocoder */ protected $geocoder; /** @var GeocoderResultGeocoded */ protected $geocoderResult; public function setGeocoder(GeoCoderGeocoderInterface $gocoder) { $this->geocoder = $gocoder; } 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; } } //使用性状 class RetailStore { use Geocodable; //这里是类的实现 } $geocoderAdapter = new GeocoderHttpAdapterCurlHttpAdapter(); $geocoderProvider = new GeocoderProviderGoogleMapsProvider($geocoderAdapter); $geocoder = new GeocoderGeocoder($geocoderProvider); $store = new RetailStore(); $store->setAddress('420 9th Avenue, New York, NY 10001 USA'); $store->setGeocoder($gocoder); $latitude = $store->getLatitude(); $longitude = $store->getLongitude(); echo $latitude, ':', $longitude;