Возврат метода в PHP - PullRequest
       8

Возврат метода в PHP

3 голосов
/ 26 февраля 2020

У меня есть класс с именем Converter

class Converter {
  public function convert($value, $from, $to){
    $this->switchUnitCall($from)($value, $to);
  }

  private function switchUnitCall($from){
    switch($from){
      case 'm':
        return $this->fromM; break;
      case 'km':
        return $this->fromKM; break;
    }
  }

  private function fromM($value, $to){}
  private function fromKM($value, $to){}
}

Я хочу вернуть закрытый метод с именем fromM или fromKM вызывающей стороне, чтобы я мог вызвать fromM с другим пользовательские аргументы внутри метода convert.

Когда я запускаю приведенный выше код, я получаю ошибку Undefined property: Converter::$fromM

Мой вопрос, возможно ли вернуть метод в PHP? и как это делается? Спасибо.

Ответы [ 2 ]

3 голосов
/ 26 февраля 2020

Вы не можете вернуть метод, но вы можете использовать имя метода для его динамического вызова:

class Converter {
  public function convert($value, $from, $to){
    $method=$this->switchUnitCall($from);
    $this->$method($value, $to);
  }

  private function switchUnitCall($from){
    switch($from){
      case 'm':
        return "fromM"; break;
      case 'km':
        return "fromKM"; break;
    }
  }

  private function fromM($value, $to){}
  private function fromKM($value, $to){}
}
1 голос
/ 26 февраля 2020

Вы можете вернуть свой метод, но имейте в виду видимость указанного c метода и из какой области его можно вызвать. Эти два метода являются частными и могут быть вызваны только внутри данного класса.

Проблема с этим кодом заключается в том, что вы вызвали ваши методы как свойства, и, следовательно, ошибка для неопределенного свойства.

Их следует вызывать как методы с круглыми скобками и 2 обязательными переданными $this->fromM($value, $to), также вам необходимо передать аргументы $value и $to в switchUnitCall(), поскольку они также являются обязательными. Кроме того, эти два метода должны возвращать результат:

 class Converter {
      public function convert($value, $from, $to){
        $this->switchUnitCall($from, $value, $to);
      }

      private function switchUnitCall($from, $value, $to){
        switch($from){
          case 'm':
            return $this->fromM($value, $to); 
            break;
          case 'km':
            return $this->fromKM($value, $to); 
            break;
        }
      }

      private function fromM($value, $to){
       //return conversion
      }
      private function fromKM($value, $to){
       //return conversion
      }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...