2013-03-29 47 views
-2

我很難將此PHP 5.3引入的匿名函數轉換爲使用早期版本的PHP。將匿名PHP函數轉換爲使用PHP <5.3

我得到的錯誤是: 意外的T_FUNCTION和$ testResult。這是匿名功能。任何人都可以將其轉換爲使用早期版本的PHP。代碼在一個類中。

下面是代碼:

abstract class geocoder { 
    public $ch = null; 
    public $xd = null; 
    public $xp = null; 

    public function __construct() { 
     $this->ch = curl_init(); 
     curl_setopt_array($this->ch, array (
      CURLOPT_BINARYTRANSFER => true, 
      #CURLOPT_FAILONERROR => true, 
      CURLOPT_FOLLOWLOCATION => false, 
      #CURLOPT_FORBID_REUSE => true, 
      #CURLOPT_MUTE => true, 
      CURLOPT_RETURNTRANSFER => true, 
      CURLOPT_TIMEOUT => 2, 
      #CURLOPT_COOKIEJAR => '/dev/null', 
      #CURLOPT_COOKIEFILE => '/dev/null', 
      #CURLOPT_INTERFACE => 'x.x.x.x', 
      CURLOPT_USERAGENT => 'curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5', 
      CURLOPT_HEADER => false)); 
    } 

    public function doreq($u) { 
     curl_setopt($this->ch, CURLOPT_URL, $u); 
     return curl_exec($this->ch); 
    } 

    abstract public function dogeocode($q); 
} 

class geocodeGMaps extends geocoder { 
    public function __construct() { 
     parent::__construct(); 
     #$this->xd = new DOMDocument(); 
     #$this->xp = new DOMXpath($this->xd); 
    } 

    public function testResult(&$res) { 
      switch (true) { 
       case !$res: 
        return 'Remote call HTTP request failed'; 
       case !($res = @json_decode($res, true)): 
        return 'Failed to parse JSON result'; 
       case !isset($res['status']): 
        return 'Remote call returned NULL status'; 
       case !($res['status'] == 'OK'): 
        return 'Remote call returned !OK status'; 
       case !isset($res['results']): 
       case !isset($res['results'][0]): 
        return 'NULL or empty result set'; 
       case !isset($res['results'][0]['geometry']['location_type']): 
        return 'NULL location type'; 
       case !($res['results'][0]['geometry']['location_type'] == 'ROOFTOP'): 
        return ''; 
       case !isset($res['results'][0]['geometry']['location']): 
       case !isset($res['results'][0]['geometry']['location']['lat']): 
       case !isset($res['results'][0]['geometry']['location']['lng']): 
        return 'No location returned in result'; 
       default: 
        return NULL; 
        break; 
      } 
      return NULL; 
    } 

    public function dogeocode($q) { 
     $res = @$this->doreq("http://maps.googleapis.com/maps/api/geocode/json?address=" . urlencode($q) . "&sensor=false"); 

     if ($testResult = testResult($res)) 
      throw new Exception ($testResult); 

     $comp = array('query' => &$q); 
     $map = array(
      'street_number' => 'street_number', 
      'route' => 'route', 
      'city' => 'locality', 
      'county' => 'administrative_area_level_2', 
      'state' => 'administrative_area_level_1', 
      'country' => 'country', 
      'zip' => 'postal_code'); 

     if (isset($res['results'][0]['address_components'])) { 
      foreach ($res['results'][0]['address_components'] as &$v) 
       foreach ($map as $k => &$l) 
        if (in_array($l, $v['types']) && !isset($comp[$k])) 
         $comp[$k] = $v['long_name']; 
     } 

     return array ('formatted' => (isset($res['results'][0]['formatted_address']) ? $res['results'][0]['formatted_address'] : NULL), 
        'components' => &$comp, 
        'latlng' => array ($res['results'][0]['geometry']['location']['lat'], 
           $res['results'][0]['geometry']['location']['lng'])); 
    } 
} 

在使這項工作在PHP 5.2任何人的幫助?

+0

什麼特別是不適用於早期版本? –

回答

1

只是做

function testResult(&$res) { 

    // ... code 

} 

然後:

if ($testResult = testResult($res)) 
    throw new Exception ($testResult); 

編輯:

現在,我可以看到這是一類,你需要移動新testResult功能出dogeocode,並使其成爲防止Fatal error: Cannot redeclare testResult()的新方法。然後您可以使用它:

if ($restResult = $this->testResult($res)) 
    throw new Exception ($testResult); 
+0

我試過了,但那不行。其實這個功能是在一個類中。我想盡一切辦法讓這項工作成功,但沒有成功。 – akshitsethi

+0

不以什麼方式工作?有錯誤嗎?意外的結果? – MichaelRushton

+0

我已經更新了代碼。希望這有助於理解代碼正在嘗試做什麼。 – akshitsethi