PHP 익명 함수에서 use의 용도는 무엇입니까

怪我咯
풀어 주다: 2023-03-11 17:50:01
원래의
2072명이 탐색했습니다.

익명 함수에서 사용하는 기능은 상위 범위에서 변수를 상속하는 것입니다.

다음 예는 가장 일반적인 사용법입니다. use를 사용하지 않으면 함수에서 $msg 변수를 찾을 수 없습니다.

<?php
$msg = [1,2,3];
$func = function()use($msg){
    print_r($msg);
};  

$func();
?>
로그인 후 복사

출력 실행

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
로그인 후 복사

상속변수의 타이밍에 대하여

상속변수의 동작은 함수가 정의될 ​​때 생성되는 걸까요, 아니면 함수가 호출될 때 생성되는 걸까요? 위 예제에서 코드의 순서를 조정하고 함수 정의 뒤에 $msg를 배치해 보겠습니다.

<?php
$func = function()use($msg){
    print_r($msg);
};  

$msg = [1,2,3];

$func();
?>
로그인 후 복사

실행 중인 출력

PHP Notice:  Undefined variable: msg in /search/ballqiu/c.php on line 4
로그인 후 복사

함수가 정의되면 상속된 변수의 동작이 생성되는 것을 볼 수 있습니다. 위의 예에서는

msg가 정의되어 있으므로 함수 실행 시 $msg는 정의되지 않은 변수입니다.


reference값 전달익명 함수를 사용할 때 참조를 사용하여 값을 전달하는 경우 익명 함수의 매개변수 값을 변경하면 해당 외부 변수에도 영향을 미친다는 것을 알고 있습니다. 예를 들면 다음과 같은 예입니다.

<?php
$msg = [1,2,3];
$func = function()use(&$msg){
    $msg[0]++;
    print_r($msg);
};


$func();

print_r($msg);
?>
로그인 후 복사

Runoutput

Array
(
    [0] => 2
    [1] => 2
    [2] => 3
)
Array
(
    [0] => 2
    [1] => 2
    [2] => 3
)
로그인 후 복사

그럼 어쨌든 익명 함수를 통해 외부 변수의 값을 변경하려면 참조로 사용할 값을 전달해야 겠죠? 다음 예를 보세요:

<?php
$msg = new ArrayObject([1,2,3], ArrayObject::ARRAY_AS_PROPS);
$func = function()use($msg){
    $msg[0]++;
    print_r($msg);
};

$func();
print_r($msg);
?>
로그인 후 복사

Run output

ArrayObject Object
(
    [storage:ArrayObject:private] => Array
        (
            [0] => 2
            [1] => 2
            [2] => 3
        )

)
ArrayObject Object
(
    [storage:ArrayObject:private] => Array
        (
            [0] => 2
            [1] => 2
            [2] => 3
        )

)
로그인 후 복사

object class

유형의 변수를 전달하면 참조로 전달되지 않더라도 익명 함수에서 변수 값이 변경되는 것을 볼 수 있습니다. 외부 관련 변수에도 영향을 미칩니다.
그런데 문제는 또 발생합니다. 사용할 객체 변수를 전달할 때 참조를 사용하는 것과 참조를 사용하지 않는 것 사이에 차이가 있나요? 예제를 살펴보겠습니다

<?php
$func = function()use($msg){
    echo $msg[0],"\n";
};

$msg = new ArrayObject([1,2,3], ArrayObject::ARRAY_AS_PROPS);
$func();
?>
로그인 후 복사

대신 참조 전달을 사용합니다

$func = function()use(&$msg){
    echo $msg[0],"\n";
};

运行输出1
로그인 후 복사

참조 전달을 사용할 때 변수가 함수 정의보다 뒤쳐지더라도 해당 외부 변수는 여전히 함수 내부에서 찾을 수 있으며, 변수는 정의되지 않습니다. 둘 사이에는 여전히 차이가 있습니다.


이에 대해 클래스의 익명 함수에서 사용

<?phpclass C{
    protected $_num = 0;    public function mkFunc(){
        $func = function(){
            echo $this->_num++, "\n";
        };        return $func;
    }    public function get(){
        echo $this->_num,"\n";
    }
}$obj = new C();$func = $obj->mkFunc();$func();$obj->get();?>
运行结果01
로그인 후 복사
익명 함수에서 이 내용은 사용하지 않고도 바로 찾을 수 있는 현재

객체

를 참조하고 있음을 알 수 있습니다. 그래도 위의 예에서 use를 사용해야 한다면 어떤 효과가 있을까요?

mkFunc를

public function mkFunc(){
    //唯一改动是此处加了use
    $func = function()use($this){
        echo $this->_num++, "\n";
    };    return $func;
}

运行输出
PHP Fatal error:  Cannot use $this as lexical variable
로그인 후 복사

에서

public function mkFunc(){
    $self = $this;    $func = function()use($self){
        echo $this->_num++, "\n";
    };    return $func;
}

运行结果01
로그인 후 복사

로 변경하여 사용해도 효과는 동일함을 알 수 있습니다.

위 내용은 PHP 익명 함수에서 use의 용도는 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!