php call function with parameters in array




PHP7 method_exists 잡히지 않은 오류:함수 이름은 문자열이어야합니다. (2)

이는 간접 변수 및 메소드 처리에 대한 평가 순서가 호환되지 않기 때문입니다.

간접 변수, 속성 및 메서드 처리 변경

변수, 속성 및 메서드에 대한 간접 액세스는 특수 사례의 이전 혼합과 달리 왼쪽에서 오른쪽 순서로 엄격하게 평가됩니다. 아래 표는 평가 순서가 어떻게 변경되었는지 보여줍니다.

아니요,이 줄을 변경하지 않아도됩니다.

$item['function']($item, $default);

여기서는 특별한 평가가 없으므로 배열 요소를 함수 이름으로 사용하고 함수를 호출합니다. 당신은 그것을 바꿀 수 있고, 코드는 여전히 제대로 작동 할 것이지만, 반드시 필요하지는 않습니다.

그러나 이미 올바르게 했으므로 다음을 변경해야합니다.

$this->$item['function']($item, $default);

에:

$this->{$item['function']}($item, $default);
       ↑                 ↑

table 에서 볼 수 있듯이 :

                    Old and new evaluation of indirect expressions
      Expression            PHP 5 interpretation         PHP 7 interpretation
-------------------------------------------------------------------------------
  $$foo['bar']['baz'] |     ${$foo['bar']['baz']}  |    ($$foo)['bar']['baz']
  $foo->$bar['baz']   |     $foo->{$bar['baz']}    |    ($foo->$bar)['baz']
  $foo->$bar['baz']() |     $foo->{$bar['baz']}()  |    ($foo->$bar)['baz']()
  Foo::$bar['baz']()  |     Foo::{$bar['baz']}()   |    (Foo::$bar)['baz']()

PHP 7은 먼저 객체 프라퍼티에 접근하기를 원한다고 가정하고, 그 프라퍼티로부터 인덱스에 접근하기를 원한다. 그 값을 메소드 이름으로 사용하여 메소드를 호출한다. (왼쪽에서 오른쪽 순서).

변수 및 인덱스를 속성 이름으로 사용하려면 중괄호를 사용하여이를 나타낼 수 있습니다.

이 오류가 발생합니다.

치명적인 오류 : 캐치되지 않은 오류 : 함수 이름은에서 문자열이어야합니다.

이 코드의 경우 :

if (function_exists($item['function'])) {
    $item['function']($item, $default);
} elseif (method_exists($this, $item['function'])) {
    $this->$item['function']($item, $default);
}

코드를 변경하면

if (function_exists($item['function'])) {
    $item['function']($item, $default);
} elseif (method_exists($this,$item['function'])) {
    $this->{$item['function']}($item, $default);
}

그 오류를 해결했지만, 내 질문은,이 라인

 $item['function']($item, $default);

또한로 변환 될

{$item['function']}($item, $default);

또는 그대로 남겨 둘 수 있습니까?


$funName = $item['function'];

그리고 대신 (배열없이) 배열을 사용하십시오.

@Svetlio, 이전 버전이 아니라 호환 가능!

왜 사람들이 이것을 오해하고 있습니까? 당신은 모두 할당하기 위해 한 줄을 더 쓰기에는 너무 게으른가?





php-7