Доступность методов в подфункции - PullRequest
0 голосов
/ 11 февраля 2011

Ссылка на переменную параметра метода из подфункции этого метода, похоже, не работает, даже если указано global .

public function sortArray(&$array, $keyToCompare){// BOOL sortArray( ARR &$array, STR $keyToCompare )
    function cmpVals($pairA, $pairB){
        global $keyToCompare;
        return strcmp($pairA[$keyToCompare], $pairB[$keyToCompare]);
    }
    return uasort($array, 'cmpVals');
}

Можно ли даже ссылаться на параметр метода из подфункции? Если так ... как?

В моем конкретном примере выше я понимаю, что могу использовать замыкание для достижения той же цели, но я не хочу, чтобы скрипт зависел от PHP 5.3.

Ответы [ 3 ]

1 голос
/ 11 февраля 2011

По какой причине вы не можете сделать это статичным?

class YourClassName {
    public static $keyToCompare;
    public function sortArray(&$array, $keyToCompare){// BOOL sortArray( ARR &$array, STR $keyToCompare )
        self::$keyToCompare = $keyToCompare;
        function cmpVals($pairA, $pairB){
            $keyToCompare = YourClassName::$keyToCompare;
            return strcmp($pairA[$keyToCompare], $pairB[$keyToCompare]);
        }
        return uasort($array, 'cmpVals');
    }
}
1 голос
/ 11 февраля 2011

Похоже, вы уже используете ООП в PHP 5.3. Можно ли создать класс сортировщика?

class Sorter{

    private $key;

    function __construct($key){
        $this->key = $key;
    }

    private function compare($a, $b){
        return strcmp($a[$this->key], $b[$this->key]);
    }

    public function sort($a){
        uasort($a, array($this, 'compare'));
    }

}
0 голосов
/ 11 февраля 2011

Другая опция - анонимная функция:

public function sortArray(&$array, $keyToCompare){
    return uasort($array, function($pairA, $pairB) uses ($keyToCompare) {
        return strcmp($pairA[$keyToCompare], $pairB[$keyToCompare]);
    });
}

Не проверено, в поезде: D, но см. документацию для получения дополнительной информации.

К вашему сведению, передача по ссылке не нужна, поскольку вы не изменяете массив. PHP не будет делать копию, поэтому нет проблем с памятью, передаваемых по значению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...