source

static 키워드 inside 함수

factcode 2022. 9. 15. 22:45
반응형

static 키워드 inside 함수

Drupal 7의 소스를 보고 있었는데, 전에 보지 못했던 것들을 발견했어요.처음에 php 매뉴얼에서 몇 가지 찾아보았지만, 이 예들은 설명되지 않았습니다.

키워드는 무엇입니까?static함수의 변수에 대해 수행할 수 있습니까?

function module_load_all($bootstrap = FALSE) {
    static $has_run = FALSE

그러면 함수가 지정된 변수의 값을 기억할 수 있습니다.$has_run(이 예에서는)를 사용합니다.

다음과 같이 다양한 용도로 사용할 수 있습니다.

function doStuff() {
  static $cache = null;

  if ($cache === null) {
     $cache = '%heavy database stuff or something%';
  }

  // code using $cache
}

이 예에서는if한 번만 실행됩니다.에의 복수의 콜이 있는 경우에서도,doStuff발생할 수 있습니다.

아직까지는 아무도 언급하지 않은 것 같습니다만, 같은 클래스의 다른 인스턴스 내의 스태틱 변수는 그대로입니다.따라서 OOP 코드를 작성할 때 주의하십시오.

다음 사항을 고려하십시오.

class Foo
{
    public function call()
    {
        static $test = 0;

        $test++;
        echo $test . PHP_EOL; 
    }
}

$a = new Foo();
$a->call(); // 1
$a->call(); // 2
$a->call(); // 3


$b = new Foo();
$b->call(); // 4
$b->call(); // 5

정적 변수가 현재 클래스 인스턴스의 상태만 기억하도록 하려면 다음과 같이 클래스 속성을 유지하는 것이 좋습니다.

class Bar
{
    private $test = 0;

    public function call()
    {
        $this->test++;
        echo $this->test . PHP_EOL; 
    }
}


$a = new Bar();
$a->call(); // 1
$a->call(); // 2
$a->call(); // 3


$b = new Bar();
$b->call(); // 1
$b->call(); // 2

다음 예시를 제시하겠습니다.

function a($s){
    static $v = 10;
    echo $v;
    $v = $s;
}

의 첫 번째 호출

a(20);

will 출력10,그리고나서$v되려고20. 변수$v는 정적(비동적) 변수이므로 함수 종료 후 수집되는 가비지가 아닙니다.변수는 스크립트가 완전히 종료될 때까지 해당 범위 내에 머무릅니다.

따라서 다음 콜은

a(15);

그런 다음 출력합니다.20를 설정하고 나서,$v되려고15.

스태틱은 클래스와 동일하게 동작합니다.변수는 함수의 모든 인스턴스에서 공유됩니다.이 예에서는 함수를 실행하면 $has_run이 TRUE로 설정됩니다.함수의 향후 모든 실행은 $has_run = TRUE가 됩니다.이는 카운트를 전달하는 대신 재귀 함수에서 특히 유용합니다.

정적 변수는 로컬 함수 범위에만 존재하지만 프로그램 실행이 이 범위를 벗어나도 값이 손실되지 않습니다.

http://php.net/manual/en/language.variables.scope.php 를 참조해 주세요.

양 선생의 대답을 더 늘어놓자면

정적 변수를 사용하여 클래스를 확장하면 개별 확장 클래스는 인스턴스 간에 공유되는 "소유" 참조된 정적을 유지합니다.

<?php
class base {
     function calc() {
        static $foo = 0;
        $foo++;
        return $foo;
     }
}

class one extends base {
    function e() {
        echo "one:".$this->calc().PHP_EOL;
    }
}
class two extends base {
    function p() {
        echo "two:".$this->calc().PHP_EOL;
    }
}
$x = new one();
$y = new two();
$x_repeat = new one();

$x->e();
$y->p();
$x->e();
$x_repeat->e();
$x->e();
$x_repeat->e();
$y->p();

출력:

1:1
2:1
1:2
1:3 <--x_filename>
1:4
1:5 <-- x_filename
2:2

http://ideone.com/W4W5Qv

함수의 static variable은 함수를 몇 번 호출해도 변수가 1개뿐임을 의미합니다.

<?php

class Foo{
    protected static $test = 'Foo';
    function yourstatic(){
        static $test = 0;
        $test++;
        echo $test . "\n"; 
    }

    function bar(){
        $test = 0;
        $test++;
        echo $test . "\n";
    }
}

$f = new Foo();
$f->yourstatic(); // 1
$f->yourstatic(); // 2
$f->yourstatic(); // 3
$f->bar(); // 1
$f->bar(); // 1
$f->bar(); // 1

?>

「」가 있습니다.static페이지 로드 기간 동안 함수가 호출될 때마다 변수가 값을 유지하는 것을 의미합니다.

를 두 번 때가 "로 설정되어 있으면"으로 되어 있습니다.$has_run로로 합니다.true 이 는 이 함수가 것을 알 수 있습니다.$has_run true★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

「 」의 static이 콘텍스트의 키워드에 대해서는, 다음의 PHP 메뉴얼을 참조해 주세요.http://php.net/manual/en/language.variables.scope.php

언급URL : https://stackoverflow.com/questions/6188994/static-keyword-inside-function

반응형