programing

PHP 네스트 함수의 용도는 무엇입니까?

kingscode 2023. 2. 1. 22:04
반응형

PHP 네스트 함수의 용도는 무엇입니까?

JavaScript에서 중첩된 함수는 매우 유용합니다. 클로저, 프라이빗 메서드 등..

중첩된 PHP 함수의 용도는 무엇입니까?누가 그걸 어디에 쓰나요?

여기 내가 한 작은 조사가 있다.

<?php
function outer( $msg ) {
    function inner( $msg ) {
        echo 'inner: '.$msg.' ';
    }
    echo 'outer: '.$msg.' ';
    inner( $msg );
}

inner( 'test1' );  // Fatal error:  Call to undefined function inner()
outer( 'test2' );  // outer: test2 inner: test2
inner( 'test3' );  // inner: test3
outer( 'test4' );  // Fatal error:  Cannot redeclare inner()

PHP 5.3을 사용하는 경우 익명 함수로 자바스크립트와 같은 동작을 더 많이 얻을 수 있습니다.

<?php
function outer() {
    $inner=function() {
        echo "test\n";
    };

    $inner();
}

outer();
outer();

inner(); //PHP Fatal error:  Call to undefined function inner()
$inner(); //PHP Fatal error:  Function name must be a string
?>

출력:

test
test

기본적으로는 없습니다.나는 항상 이것을 파서의 부작용으로 취급해 왔다.

에란 갈페린은 단지 일 뿐이다.outer()행행중중중중다다그들은 또한 개인적으로 범위를 조사하지 않는다; 그들은 늦었지만 전 세계적인 범위를 오염시킨다.또, 콜백으로서 외부 콜백은, 1 회 밖에 콜 할 수 없었습니다.이 에일리어스를 여러 번 호출하는 어레이에 적용하는 것이 어떤 도움이 되는지 아직 잘 모르겠습니다.

제가 발굴할 수 있는 유일한 '실제 세계'의 예는 IMO입니다. IMO는 한 번만 실행할 수 있고 더 깨끗하게 다시 쓰여질 수 있습니다.

수 있는 이 A를 입니다.[name]_includemethod는된 메서드를 하고 method를 조합합니다.

if (!function_exists ('somefunc')) {
  function somefunc() { }
}

체크합니다.

PHP의 OOP가 더 나은 선택인 것은 분명합니다.

[@Pierrede의 코멘트에 따라 리라이팅]레스피네

이것은 단순히 부작용일 뿐만 아니라 프로그램의 로직을 동적으로 수정하는 데 매우 유용한 기능입니다.절차상 PHP 시절부터 사용되었지만, 가능한 한 간단한 방법으로 특정 독립 실행형 기능에 대한 대체 구현을 제공하고자 한다면, OO 아키텍처에서도 유용할 수 있습니다.(대부분의 경우 OO가 더 나은 선택이지만, 이는 선택 사항이지 명령이 아니며, 일부 간단한 작업에는 별도의 작업이 필요하지 않습니다.)

예를 들어, 프레임워크에서 동적으로 또는 조건부로 플러그인을 로드하고 플러그인 작성자의 삶을 매우 쉽게 만들고 싶다면 플러그인이 재정의하지 않은 일부 중요한 기능에 대해 기본 구현을 제공할 수 있습니다.

<?php // Some framework module

function provide_defaults()
{
    // Make sure a critical function exists:
    if (!function_exists("tedious_plugin_callback"))
    {
        function tedious_plugin_callback()
        {
        // Complex code no plugin author ever bothers to customize... ;)
        }
    }
}

함수에 정의되어 있는 함수는 별로 쓸모가 없지만 조건부로 정의되어 있는 함수는 할 수 있습니다.예를 들어 다음과 같습니다.

if ($language == 'en') {
  function cmp($a, $b) { /* sort by English word order */ }
} else if ($language == 'de') {
  function cmp($a, $b) { /* sort by German word order; yes it's different */ }
} // etc

그리고 코드 전체에 언어 체크를 낭비하지 않도록 하기 위해 코드에서는 'cmp' 함수를 사용하면 됩니다.지금은 안 해봤지만 해야 한다는 주장들이 보여요.

위에서 설명한 바와 같이 단순히 네스트된 함수를 생성하여 함수 내에서 지역화된 반복 코드를 대체할 수 있습니다(부모 함수 내에서만 사용됨).익명 함수가 그 완벽한 예입니다.

클래스에서 프라이빗 메서드(또는 작은 코드 블록)를 작성한다고 하는 사람도 있습니다만, 초특정 태스크(부모 전용)를 모듈화할 필요가 있지만, 다른 클래스에서는 사용할 수 없는 경우, 이것은 상황을 혼란스럽게 하고 있습니다.좋은 소식은 다른 곳에서 해당 기능이 필요한 것으로 판명된 경우 수정은 매우 기초적이라는 것입니다(정의는 보다 중앙 위치로 이동).

일반적으로 JavaScript를 다른 C 기반 프로그래밍 언어를 평가하는 기준으로 사용하는 것은 좋지 않은 생각입니다.JavaScript는 PHP, Python, Perl, C, C++, Java와 비교했을 때 분명 자체 동물입니다.물론, 많은 일반적인 유사점이 있지만, 구체적이고 구체적인 세부사항(JavaScript 참조: 최종 가이드, 제6판, 제1장~12장)에서는 핵심 JavaScript를 고유하고 아름답고, 다르고, 단순하고, 복잡하게 동시에 만듭니다.그게 내 의견이야.

확실히 하자면, 네스트된 함수가 사적인 함수가 아니라는 거야.이 네스팅을 통해 사소한 것을 모듈화할 필요가 있을 때(부모 기능에만 필요) 혼란을 피할 수 있습니다.

나의 모든 php는 OO이지만, 특히 당신의 함수가 재귀적이고 반드시 객체가 아닐 때, 중첩된 함수에 대한 용도가 보입니다.즉, 네스트되어 있는 함수 외부에서 호출되지 않고 재귀적이며 이후 함수여야 합니다.

하나의 다른 방법을 사용할 수 있는 새로운 방법을 만드는 것은 의미가 없습니다.제가 보기엔 그게 어설픈 코드이고 OO의 요점은 아닙니다.그 함수를 다른 곳에서 호출할 생각이 없다면, 그 함수에 둥지를 틀어라.

웹 서비스 호출에서는 1000개의 함수로 가득 찬 라이브러리 상의 개별 함수를 네스트 방식으로 포함하여 동적으로 오버헤드(메모리 및 속도)가 훨씬 낮았습니다.일반적인 콜 스택의 깊이는 5~10콜일 수 있습니다.1 ~ 2kb 파일 12개를 동적으로 링크하는 것이 메가바이트를 포함하는 것보다 좋습니다.이 작업은 작은 유틸리티 랩핑 기능을 만드는 것만으로 수행되었습니다.포함된 함수는 콜 스택 위의 함수 내에 중첩됩니다.모든 웹 서비스 호출에 필요하지 않은 100개의 함수로 가득 찬 클래스와는 대조적으로 php의 내장된 느린 로딩 기능을 사용할 수도 있습니다.

php 7 의 경우는, 다음을 참조해 주세요.이 구현을 통해 중첩된 함수에 대한 명확한 정보를 얻을 수 있습니다.foo() 함수에 3개의 함수(too), boo() 및 zoo()가 중첩되어 있다고 가정합니다.boo()와 zoo()는 이름이 붙은 동일한 중첩 함수 xoo()를 가집니다.이 코드에서는 네스트된 함수의 규칙을 명확하게 코멘트하고 있습니다.

   function foo(){
        echo 'foo() is called'.'<br>';
        function too(){
            echo 'foo()->too() is called'.'<br>';
        }
        function boo(){
            echo 'foo()->boo() is called'.'<br>';
            function xoo(){
                echo 'foo()->boo()->xoo() is called'.'<br>';
            }
            function moo(){
                echo 'foo()->boo()->moo() is called'.'<br>';
            }
        }
        function zoo(){
            echo 'foo()->zoo() is called'.'<br>';
            function xoo(){     //same name as used in boo()->xoo();
                echo 'zoo()->xoo() is called'.'<br>';
            }
        #we can use same name for nested function more than once 
        #but we can not call more than one of the parent function
        }
    }

/****************************************************************
 * TO CALL A INNER FUNCTION YOU MUST CALL OUTER FUNCTIONS FIRST *
 ****************************************************************/
    #xoo();//error: as we have to declare foo() first as xoo() is nested in foo()

    function test1(){
        echo '<b>test1:</b><br>';
        foo(); //call foo()
        too();
        boo();
        too(); // we can can a function twice
        moo(); // moo() can be called as we have already called boo() and foo()
        xoo(); // xoo() can be called as we have already called boo() and foo()
        #zoo(); re-declaration error
        //we cannont call zoo() because we have already called boo() and both of them have same named nested function xoo()
    }

    function test2(){
        echo '<b>test2:</b><br>';
        foo(); //call foo()
        too();
        #moo(); 
        //we can not call moo() as the parent function boo() is not yet called
        zoo(); 
        xoo();
        #boo(); re-declaration error
        //we cannont call boo() because we have already called zoo() and both of them have same named nested function xoo()

    }

여기서 test1()을 호출하면 다음과 같이 출력됩니다.

test1:
foo() is called
foo()->too() is called
foo()->boo() is called
foo()->too() is called
foo()->boo()->moo() is called
foo()->boo()->xoo() is called

test2()를 호출하면 다음과 같이 출력됩니다.

test2:
foo() is called
foo()->too() is called
foo()->zoo() is called
zoo()->xoo() is called

단, 재선언 오류를 피하기 위해 text1()과 test2()를 동시에 호출할 수는 없습니다.

중첩된 함수의 실용성이 없음을 시사하는 경우.네, 그들은 쓰이고 이것은 예시입니다.

예를 들어 my_file.php라는 파일이 있다고 가정합니다.이 파일은 Ajax 결과를 가져오는 데 사용됩니다.그러나 Ajax를 통해 결과를 얻고 싶지 않지만 충돌 없이 같은 페이지에 두 번 포함시키고 싶은 경우가 있다면 어떻게 해야 할까요?

ajax file my_file.php 라고 합니다.

<?php
// my_file.php used for ajax

$ajax_json_in = 10; 

function calculations($a, $b)
{   $result = $a + $b;
    return $result;
}

$new_result = $ajax_json_in * calculations(1, 2);

$ajax_json_out =  $new_result; 
   
?>

다음 예제에서는 충돌 없이 위의 파일을 두 번 포함합니다.HTML에 직접 포함시켜야 하는 경우가 있기 때문에 Ajax 호출을 원하지 않을 수 있습니다.

<?php
// include the above file my_file.php instead of ajaxing it

function result1 
{
    $ajax_json_in = 20; 
    include("my_file.php");
    return $ajax_json_out; 
}


function result2 
{
    $ajax_json_in = 20; 
    include("my_file.php");
    return $ajax_json_out;
}

?>

파일을 포함하면 파일의 기능이 중첩됩니다.파일은 ajax 콜과 inline includes!!

그래서 네스트된 함수는 실생활에서 사용됩니다.

좋은 하루 되세요.

오래된 투고인 것은 알지만 계층 객체 구축 등 로컬에서 필요한 기능만 재귀 호출에 깔끔하게 접근하기 위해 네스트된 함수를 사용합니다(부모 함수는 한 번만 호출됩니다).

function main() {
    // Some code

    function addChildren ($parentVar) {
        // Do something
        if ($needsGrandChildren) addChildren ($childVar);
    }
    addChildren ($mainVar); // This call must be below nested func

    // Some more code
}

예를 들어 JS와 비교한 php에서 주목해야 할 점은 중첩된 함수에 대한 호출은 아래 함수 선언 후에 이루어져야 한다는 것입니다(함수 호출이 부모 함수 내의 어느 곳에 있을 수 있는 JSSS와 비교).

이 특성을 실제로 사용한 것은 프라이머리 프로세스의 동작에 기초하기 때문에 프라이머리 함수 내에서 작은 재귀 함수를 실행하는 것이 편리할 때 뿐이지만 다른 파일로 옮기고 싶지 않습니다.다른 "베스트 프랙티스" 방법이 있다는 것은 알지만, 파서를 볼 때마다 개발자가 그 기능을 볼 수 있도록 하고 싶습니다.어쨌든 수정해야 할 부분은...

중첩된 함수는 메모화(성능 향상을 위한 함수 결과 캐싱)에서 유용합니다.

<?php
function foo($arg1, $arg2) {
    $cacheKey = "foo($arg1, $arg2)";
    if (! getCachedValue($cacheKey)) {
        function _foo($arg1, $arg2) {
            // whatever
            return $result;
        }
        $result = _foo($arg1, $arg2);
        setCachedValue($cacheKey, $result);
    }
    return getCachedValue($cacheKey);
}
?>

중첩된 함수는 중첩된 함수가 상위 함수 내에서 선언된 변수를 사용하려는 경우 유용합니다.

<?php
ParentFunc();
function ParentFunc()
{
  $var = 5;
  function NestedFunc()
  {
    global $var;
    $var = $var + 5;
    return $var;
  };
  echo NestedFunc()."<br>";
  echo NestedFunc()."<br>";
  echo NestedFunc()."<br>";
}
?>

언급URL : https://stackoverflow.com/questions/415969/what-are-php-nested-functions-for

반응형