PHP의 정적 변수는 함수 범위 내에서만 존재합니다. 즉, 정적 변수는 PHP의 스택에만 존재합니다. 변수 앞에 static 키워드를 추가하면 해당 변수는 정적 변수가 됩니다.
이 기사의 운영 환경: Windows 7 시스템, PHP 버전 7.1, DELL G3 컴퓨터
php 메소드의 정적 변수는 무엇입니까?
정적 변수에 대한 자세한 설명과 PHP의 정적 변수 사용
정적 변수는 함수 범위 내에서만 존재합니다. 즉, 정적 변수는 스택에만 존재합니다. 일반적으로 함수 내의 변수(예: 지역 변수)는 함수가 끝난 후 해제되지만 정적 변수는 해제되지 않습니다. 즉, 다음에 이 함수가 호출될 때 변수의 값이 유지됩니다.
변수 앞에 static 키워드를 추가하면 해당 변수는 정적 변수가 됩니다.
<?php function test() { static $nm = ; $nm = $nm * ; print $nm."<br />"; } // 第一次执行,$nm = test(); // 第一次执行,$nm = test(); // 第一次执行,$nm = test(); ?>
프로그램 실행 결과:
1
2
2
4
3
8
test() 함수가 실행된 후 변수 $nm의 값이 저장됩니다.
정적 속성은 정적 멤버 및 정적 메서드와 같은 클래스에서 자주 사용됩니다.
프로그램 목록: 클래스의 정적 멤버
정적 변수 $nm는 클래스의 인스턴스가 아니라 nowamagic 클래스에 속합니다. 이 변수는 모든 인스턴스에 유효합니다.
::은 범위 제한 연산자입니다. 여기서는 $this 범위 대신 self 범위가 사용됩니다. $this 범위는 클래스의 현재 인스턴스만 나타내고 self::는 클래스 자체를 나타냅니다.
<?php class nowamagic { public static $nm = ; function nmMethod() { self::$nm += ; echo self::$nm . '<br />'; } } $nmInstance = new nowamagic(); $nmInstance -> nmMethod(); $nmInstance = new nowamagic(); $nmInstance -> nmMethod(); ?>
프로그램 실행 결과:
1
3
2
5
프로그램 목록: 정적 속성
<?php class NowaMagic { public static $nm = 'www.nowamagic.net'; public function nmMethod() { return self::$nm; } } class Article extends NowaMagic { public function articleMethod() { return parent::$nm; } } // 通过作用于限定操作符访问静态变量 print NowaMagic::$nm . "<br />"; // 调用类的方法 $nowamagic = new NowaMagic(); print $nowamagic->nmMethod() . "<br />"; print Article::$nm . "<br />"; $nmArticle = new Article(); print $nmArticle->nmMethod() . "<br />"; ?>
프로그램 실행 결과:
www.nowamagic.net
www.nowamagic.net
www.nowamagic. net
www.nowamagic.net
프로그램 목록: 간단한 정적 생성자
PHP에는 정적 생성자가 없습니다. 정적 클래스를 초기화해야 할 수도 있습니다. 매우 간단한 방법이 있습니다. 클래스의 데모를 직접 호출하는 것입니다. 클래스 정의 () 메소드 뒤에.
<?php function Demonstration() { return 'This is the result of demonstration()'; } class MyStaticClass { //public static $MyStaticVar = Demonstration(); //!!! FAILS: syntax error public static $MyStaticVar = null; public static function MyStaticInit() { //this is the static constructor //because in a function, everything is allowed, including initializing using other functions self::$MyStaticVar = Demonstration(); } } MyStaticClass::MyStaticInit(); //Call the static constructor echo MyStaticClass::$MyStaticVar; //This is the result of demonstration() ?>
프로그램 실행 결과:
demo()의 결과입니다
다음은 PHP 정적 변수 사용에 대한 소개입니다.
static 키워드는 C# 프로그래밍에서 매우 일반적이며 선언을 수정하는 데 사용됩니다. 특정 개체가 아닌 형식 자체에 속하는 정적 멤버입니다. static 한정자는 클래스, 필드, 메서드, 속성, 연산자, 이벤트 및 생성자에 사용할 수 있지만 인덱서, 소멸자 또는 클래스 이외의 형식에는 사용할 수 없습니다. static으로 선언된 클래스, 함수 및 변수는 인스턴스 메서드나 변수를 참조할 수 없습니다. 또한 C#에서는 static 한정자가 클래스에 추가되면 그 안에 있는 모든 변수와 메서드는 static이어야 합니다. 정적 변수와 메서드는 인스턴스 개체가 아닌 클래스 이름을 통해 참조되어야 합니다.
그렇다면 PHP와 C#의 static 키워드의 차이점은 무엇인가요?
선언 범위
C#에 비해 PHP에서는 정적 변수의 사용 범위가 더 넓습니다. 클래스, 메서드 또는 변수 앞에 static 한정자를 추가할 수 있을 뿐만 아니라 내부에 static 키워드를 추가할 수도 있습니다. 함수의 변수. static 수정자가 추가된 변수의 값은 함수가 실행된 후에도 손실되지 않습니다. 즉, 변수는 다음에 함수가 호출될 때 여전히 원래 값을 기억합니다. 예:
<?php function test() { static $var=; $var+=; echo $var.' '; } test(); test(); test(); ?>
실행 결과는 다음과 같습니다.
3 5 7
여기서 주목해야 할 점은 변수 할당 작업은 변수가 처음 초기화될 때만 호출된다는 것입니다. 이후에 함수를 실행하면 이 작업이 호출되지 않습니다.
PHP의 함수도 일급 시민이기 때문에 C#과 달리 함수를 직접 정의하고 코드 어디에서나 직접 호출할 수 있는데 이는 자바스크립트와 다소 유사합니다. 따라서 이때는 전역 변수를 정의하는 것보다 함수 정적 변수를 사용하는 것이 변수 정의의 반복으로 인한 충돌을 피할 수 있어 더 유용합니다. C#의 함수는 직접 정의하고 호출할 수 없기 때문에 클래스에서 호스팅되어야 하므로 함수에 정적 변수가 필요한 경우 클래스에서 정의하기만 하면 동일한 효과를 얻을 수 있습니다.
메서드 호출
C#에서 정적 멤버를 호출하는 방식은 매우 간단하고 일관됩니다. 정적 멤버는 인스턴스 개체에 속하지 않으므로 메서드이든 변수이든 C#에서 정적 멤버에 액세스하는 방식입니다. 항상 클래스 이름 .method(변수)를 통해 이루어집니다. 그리고 C#에서는 정적 함수를 가상 메서드로 설정하거나 재정의할 수 없습니다. PHP는 이를 위해 보다 유연하고 다양한 지원을 제공합니다.
먼저 PHP의 인스턴스 메소드는 someobj->someFun()을 통해 호출된다는 것을 알고 있는데, C#처럼 SomeClass->someFun()을 통해 정적 함수를 호출할 수 있을까요? 대답은 '아니요'입니다. PHP에서 정적 멤버는 SomeClass::someFun()과 같이 ::을 통해서만 호출할 수 있습니다.
<?php class TestC { public static $var=; public $var=; function t() { self::$var+=; echo self::$var.' '; echo $this->var.' '; } public static function t() { self::$var+=; echo self::$var.' '; } } $t=new TestC(); $t->t(); TestC::t(); ?>
실행 결과는 다음과 같습니다.
3 1 5
C#과 다른 또 다른 점은 클래스의 메서드에서 정적 변수를 호출해야 하는 경우 self::를 전달해야 한다는 것입니다. $somVar 정적 변수(인스턴스 변수에는 앞의 $ 기호가 필요하지 않음), 정적 메서드 호출은 self::someFun()입니다(여기서는 $ 기호가 필요하지 않음). 위의 예와 같습니다.
另外,与C#最大的不同之处就是,PHP中,子类是可以覆盖父类的静态函数或变量的,不仅如此,(站在C#程序员的角度来看,我觉得PHP这点反而将事情搞复杂了),由于默认self::staticFun()调用的是子类的静态函数,这个时候如果我们想调用父类的静态变量怎么办呢?这里PHP提供了额外的parent来调用基类的静态成员。如:
<?php class TestC { public static $var=; public $var=; function t() { self::$var+=; echo self::$var.' '; echo $this->var.' '; } public static function t() { self::$var+=; echo self::$var.' '; } } $t=new TestC(); $t->t(); TestC::t(); ?>
运行结果如下:
3 5 ‘Hello'
最好,根据上面的例子我们很容易想到,子类访问父类可以使用parent关键字,那么父类如何访问子类的静态方法呢?这里给出static的另外一个用法,这里如果将调用的静态方法前面的作用域换成static的话,PHP会根据该类的继承层次来计算最终的静态方法。如:
<?php class Test { function t() { static::t(); } public static function t() { echo self::'Test '; } } class Test extends Test { static function t() { echo self::'Test '; } } $t=new Test(); $t->t(); Test::t(); ?>
运行结果如下:
Test2 Test2
这里t实例在t1方法调用t2静态方法时,会根据其实例找到最终的静态方法并输出Test2。
总结
从上面的分析,我们不难看出,对于静态成员的使用,PHP提供了比C#更为强大的功能或灵活性,但从我的角度来看,这种灵活性不见得就更好,从某种角度来看,如果类的继承层次过于复杂,它可能会让我产生混淆。当然,同样的工具不同人使用效果会完全不一样,既然PHP提供了更多样的选择,那么相信如果使用恰当的话,PHP中的static可能会提供比C#中更为强大而简便的使用方式。
推荐学习:《PHP视频教程》
위 내용은 PHP 메소드의 정적 변수는 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!