self :: PHP5.2

时间:2013-01-14 10:43:57

标签: php php-5.2

如何使这个向后兼容PHP5.2?它适用于5.3及更高版本

错误

Fatal error: Cannot call method self::utf8_dec() or method does not exist

private function utf8_decode($arr){
    array_walk_recursive($arr, 'self::utf8_dec'); // <----- error

    return $arr;
}

private function utf8_dec(&$value, $key){
    $value = utf8_decode($value);
}

3 个答案:

答案 0 :(得分:1)

请改为尝试:

array_walk_recursive($arr, array(__CLASS__, 'utf8_dec'));

我也会这样做:

private static function utf8_dec(&$value, $key) { // now is static!
    $value = utf8_decode($value);
}

我还建议看看如何在PHP中定义回调:http://php.net/manual/en/language.types.callable.php

答案 1 :(得分:0)

您可以直接使用该类的名称,而不是self。它不够灵活,但应该有效。

static private function utf8_decode($arr){
    array_walk_recursive($arr, 'YourClass::utf8_dec');

    return $arr;
}

static private function utf8_dec(&$value, $key){
    $value = utf8_decode($value);
}

此外,您还需要使用static关键字为方法添加前缀。

答案 2 :(得分:0)

它似乎不是类型(静态)的问题,而不是它被称为超出范围。如果你不使用严格模式,它应该工作,你不要说函数是静态的。

<?php
class test {
    public function __construct($arr) {
        print_r(self::utf8_decode($arr));
        print_r($this->utf8_decode($arr));

        print_r(self::utf8_decode_v2($arr));
        print_r($this->utf8_decode_v2($arr));
    }
    private static function utf8_decode($arr){
        array_walk_recursive($arr, 'self::utf8_dec'); 
        return $arr;
    }
    private function utf8_decode_v2($arr){
        array_walk_recursive($arr, array($this, 'utf8_dec')); 
        return $arr;
    }


    private function utf8_dec(&$value, $key){
        $value = utf8_decode($value);
    }
}
$a = new test(array('apple','pinaple','nut'));
?>