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
함수의 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
'source' 카테고리의 다른 글
웹 브라우저에 푸시 알림을 보내는 방법 (0) | 2022.09.15 |
---|---|
어떻게 내 타입 힌트에 기능 형식을 지정할 수 있을까요? (0) | 2022.09.15 |
문자열을 여러 개의 단어 경계 구분 기호를 사용하여 단어로 분할 (0) | 2022.09.15 |
Windows: XAMPP vs WampServer vs EasyPHP vs 대체 (0) | 2022.09.15 |
MySql TEXT 열을 인덱싱하시겠습니까? (0) | 2022.09.15 |