-2

この PHP 5.3 で導入された匿名関数を、以前のバージョンの PHP で動作するように変換するのに苦労しています。

私が得ているエラーは次のとおりです。予期しない 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でこれを機能させるのを手伝ってくれる人はいますか?

4

1 に答える 1

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);
于 2013-03-29T20:09:49.653 に答える