>  기사  >  백엔드 개발  >  PHP5.3의 정적 변수

PHP5.3의 정적 변수

巴扎黑
巴扎黑원래의
2016-12-01 11:40:171563검색

1. 정적 변수
1. 정적 변수는 범위 내에만 존재하는 변수입니다. 그러나 함수 실행이 완료된 후에는 해당 변수의 값이 손실되지 않습니다. 이 함수를 호출하더라도 변수는 원래 값을 계속 기억합니다.
2. 표현식의 계산된 결과를 정적 변수에 할당하는 것은 불법입니다. 표현식은 값이 변경되는 모든 문을 나타냅니다. 예를 들어 (1+1), $variable 및 anyfunc()는 모두 표현식입니다.
3. 전역 변수를 사용해도 동일한 결과를 쉽게 얻을 수 있기 때문에 정적 변수를 정의하는 것이 그다지 유용해 보이지 않을 수도 있습니다. 그러나 전역변수는 모든 함수에서 접근이 가능하므로, 독립적이어야 하는 두 개 이상의 함수가 동일한 이름의 변수를 사용하면 충돌이 발생하며, 전역변수를 도입하는 것에 비해 정적변수를 사용하는 경우에는 많은 양이 필요하지 않습니다. 구문의. 따라서 하나의 함수만 변수에 액세스해야 하는 경우 전역 변수 대신 정적 변수를 사용하는 것이 좋습니다.

2. 클래스에서 정적 요소 사용
4. 클래스에서 static 키워드에는 두 가지 주요 용도가 있습니다. 하나는 정적 멤버를 정의하는 데 사용되고 다른 하나는 다음과 같은 용도로 사용됩니다. 정적 메서드를 정의합니다.
5. 정적 멤버는 클래스 변수로, 클래스의 인스턴스가 아닌 전체 클래스에 속하는 것으로 간주될 수 있습니다. 일반 인스턴스 변수와 달리 정적 멤버는 하나의 변수 값만 유지하며 이 변수 ​​값은 모든 인스턴스에 유효합니다. 즉, 모든 인스턴스가 이 멤버를 공유합니다.
6.$this는 현재 클래스의 인스턴스만 나타내고 self::는 클래스 자체를 나타냅니다(뒤에 $ 추가)
7. 범위 한정 연산자::
범위 한정 연산자를 사용하면 다음을 사용할 수 있습니다. 두 개의 시스템 정의 범위: 자체 및 상위. 또한 php5.3은 정적 범위도 제공합니다. self는 현재 클래스의 범위를 나타내지만 $this와 달리 클래스의 특정 인스턴스를 나타내지는 않습니다. 이 연산자는 클래스 외부의 코드에서 사용할 수 없으며 상속 트리 계층 구조에서 해당 위치를 인식하지 못합니다. 즉, 확장 클래스에서 self 범위를 사용할 때 self는 기본 클래스에 선언된 메서드를 호출할 수 있지만 항상 확장 클래스에서 재정의된 메서드를 호출합니다. (자바의 메소드 커버리지와 동일, 상위를 사용하여 상위 클래스 메소드를 명시적으로 호출)

상위 클래스의 정적 변수를 다시 작성하고 하위 클래스에서 동일한 정적 변수를 정의

PHP 코드

class aaa

{

함수 bbb(){

echo '클래스 메소드를 호출하려면 이중 콜론::을 사용하세요!';

$a = new aaa()

$a->bbb() ;

//전화 2:

aaa::bbb()

?> >

두 메소드로 얻은 결과는 동일합니다.

일반 메소드 bbb도 클래스 이름::을 사용하여 직접 호출할 수 있는 이유를 모르겠습니다. Java의 코드와 다릅니다

Java 코드

Test.java

class Test{


//공통 메소드

public void eat(){

System.out.println("no-static!");

}

//정적 메서드

public static void show(){

System.out.println("static!")

}

//메인 메서드

public static void main(String args[]){

테스트 obj= new Test()

obj.eat(); !

obj.show();//메소드는 클래스에 속하며 클래스의 인스턴스에 물론 액세스할 수 있습니다. 그러나 eclipse와 같은 편집기에는 노란색 프롬프트가 표시됩니다. 클래스 이름을 사용하여 직접 호출

//(Test 유형의 정적 메소드 show()는 정적 방식으로 액세스해야 함)

Test.show( );//정적 출력

//Test.eat();//비정적 메서드 eat()를 정적 컨텍스트에서 참조할 수 없지만 PHP는 이를 허용할 수 있다고 보고하는 오류입니다. . .

}

}

개인적인 이해: 호출되는 일반 메소드에 $this->xx가 나타나지 않는 한($this는 현재 클래스의 인스턴스만 나타냄) 일반 메소드도 클래스에 직접 속한다고 간주할 수 있습니다. 클래스 이름으로 직접 호출하기 전에 정적으로 선언해야 하는 Java의 메소드와는 달리 클래스 이름으로 직접 호출할 수 있습니다(php6에서는 정적 메소드의 작동에 몇 가지 변경 사항을 적용했습니다. 정적 메서드에서는 :: 연산자가 더 이상 사용되지 않습니다! 이런 종류의 메서드는 제거될 예정입니다.)


상위 클래스가 하위 클래스의 메서드를 호출하도록 도와주세요.
정적 메서드 :: php5.3에서 제안된 범위를 사용하면 더 이상 self:: 및 parent::를 사용할 필요가 없습니다. 최종 구현 클래스를 가리키려면 static::을 사용할 수 있습니다. 이 한정자는 코드가 실행되기 직전에 상속 계층 구조에서 마지막 클래스의 멤버를 계산합니다. 이 프로세스를 지연 바인딩이라고 합니다. 용도가 보이지 않는 것 같습니다. 상위 클래스에서 직접 최종 구현 클래스의 새 개체를 만든 다음 호출하면 안 되나요? 하지만 최종 클래스가 무엇인지, 재정의된 메서드가 어떤 효과를 주는지 모른다면 이 방법이 유용할 것 같습니다. static::scope는 정적 메서드에도 적용할 수 있으므로 하위 클래스의 메서드를 부모 클래스에서 정적으로 호출할 수 있습니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.