转换匿名PHP函数以使用PHP< 5.3

时间:2013-03-29 20:08:39

标签: php

我很难将这个PHP 5.3引入的匿名函数转换为与早期版本的PHP一起使用。

我得到的错误是: $ testResult上出现意外的T_FUNCTION。这是匿名函数。任何人都可以将其转换为与早期版本的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中完成这项工作吗?

1 个答案:

答案 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);