정적 키워드는 속성이나 메서드가 클래스의 특정 인스턴스가 아닌 클래스와 관련되어 있음을 선언합니다. 따라서 이러한 유형의 속성이나 메서드를 "클래스 속성" 또는 "클래스 메서드"라고도 합니다.
액세스 제어 권한이 허용되면 이 클래스의 객체를 생성하지 않고도 클래스 이름과 콜론 두 개 "::"를 사용하여 직접 호출할 수 있습니다.
static 키워드를 사용하여 변수와 메소드를 수정할 수 있습니다.
인스턴스화 없이 클래스의 정적 속성과 정적 메서드에 직접 액세스할 수 있습니다.
정적 정적 속성 및 메서드에만 액세스할 수 있으며, 비정적 속성 및 메서드는 클래스별로 액세스할 수 없습니다. 정적 속성과 메서드가 생성될 때 호출할 수 있는 이 클래스의 인스턴스가 아직 없을 수 있기 때문입니다.
정적 속성은 메모리에 복사본이 하나만 있으며 모든 인스턴스에서 공유됩니다.
현재 클래스의 정적 멤버에 액세스하려면 self:: 키워드를 사용하세요.
정적 속성의 공개 특성
클래스의 모든 인스턴스는 클래스의 정적 속성을 공유합니다.
즉, 메모리에 인스턴스가 여러 개 있더라도 정적 속성의 복사본은 하나만 있습니다.
다음 예에서는 카운터 $count 속성이 비공개 및 정적으로 설정됩니다. 그루밍. 이러한 방식으로 외부 세계는 $count 속성에 직접 액세스할 수 없습니다. 프로그램 실행 결과, 여러 인스턴스가 동일한 정적 $count 속성을 사용하고 있는 것을 볼 수 있습니다.
<? class user{ private static $count = 0 ; //记录所有用户的登录情况. public function __construct(){ self::$count = self::$count + 1; } public function getCount(){ return self::$count; } public function __destruct(){ self::$count = self::$count -1; } } $user1 = new user(); $user2 = new user(); $user3 = new user(); echo "now here have ".$user1->getCount()." user"; echo "<br>"; unset( $user3); echo "now here have ".$user1->getCount()." user"; ?>
프로그램 실행 결과:
1
2
현재 사용자는 3명입니다
현재 사용자는 2명입니다.
jb51.net
정적 속성은 직접 호출됩니다
정적 속성은 인스턴스화 없이 직접 사용할 수도 있고, 클래스가 생성되기 전에 직접 사용할 수도 있습니다.
사용된 메소드는 클래스 이름::정적 속성 이름입니다.
<? class Math{ public static $pi = 3.14; } //求一个半径3的园的面积。 $r = 3; echo "半径是 $r 的面积是<br>"; echo Math::$pi * $r * $r ; echo "<br><br>"; //这里我觉得 3.14 不够精确,我把它设置的更精确。 Math::$pi = 3.141592653589793; echo "半径是 $r 的面积是<br>"; echo Math::$pi * $r * $r ; ?>
프로그램 실행 결과:
1
2
3
4
반경이 3인 면적은
28.26입니다.
반경은 3입니다.
영역은
28.2743338823
클래스가 생성되지 않으며 정적 속성을 직접 사용할 수 있습니다. 정적 속성은 언제 메모리에 생성되나요? PHP에서 관련 정보를 본 적이 없습니다. 설명을 위해 Java의 개념을 인용하는 것도 보편적이어야 합니다.
클래스 호출 시 생성되는 정적 속성 및 메서드. 클래스가 호출된다는 것은 클래스가 생성되거나 클래스의 정적 멤버가 호출된다는 의미입니다.
정적 메서드
정적 메서드는 클래스를 인스턴스화하지 않고 직접 사용할 수 있습니다.
사용된 메소드는 클래스 이름:: 정적 메소드 이름입니다.
수학적 계산을 수행하기 위해 이 수학 수업을 계속 작성해 보겠습니다. 우리는 최대값을 계산하는 방법을 설계합니다. 이는 수학적 연산이기 때문에 이 클래스를 인스턴스화할 필요가 없습니다. 이 방법을 사용하면 훨씬 더 편리할 것입니다.
우리는 이 클래스를 단지 정적 메소드를 보여주기 위해 디자인했습니다. PHP는 숫자 값을 비교하는 max() 함수를 제공합니다.
<? class Math{ public static function Max($num1,$num2){ return $num1 > $num2 ? $num1 : $num2; } } $a = 99; $b = 88; echo "显示 $ a 和 $ b 中的最大值是"; echo "<br>"; echo Math::Max($a,$b); echo "<br>";echo "<br>";echo "<br>"; $a = 99; $b = 100; echo "显示 $ a 和 $ b 中的最大值是"; echo "<br>"; echo Math::Max($a,$b); ?>
프로그램 실행 결과:
$ a 및 $ b 표시 최대값은
99
$ a 및 $ b 표시
최대값은
100
정적 메서드가 정적 메서드를 호출하는 방법
첫 번째 예에서는 정적 메서드가 다른 정적 메서드를 호출할 때 클래스 이름을 직접 사용합니다.
<? // 实现最大值比较的Math类。 class Math{ public static function Max($num1,$num2){ return $num1 > $num2 ? $num1 : $num2; } public static function Max3($num1,$num2,$num3){ $num1 = Math::Max($num1,$num2); $num2 = Math::Max($num2,$num3); $num1 = Math::Max($num1,$num2); return $num1; } } $a = 99; $b = 77; $c = 88; echo "显示 $a $b $c 中的最大值是"; echo "<br>"; echo Math::Max3($a,$b,$c); ?>
프로그램 실행 결과:
1
2
99 77 88에 표시된 최대값은
99
self :: 현재 클래스에서 다른 정적 메서드를 호출합니다. (제안)
<? // 实现最大值比较的Math类。 class Math{ public static function Max($num1,$num2){ return $num1 > $num2 ? $num1 : $num2; } public static function Max3($num1,$num2,$num3){ $num1 = self::Max($num1,$num2); $num2 = self::Max($num2,$num3); $num1 = self::Max($num1,$num2); return $num1; } } $a = 99; $b = 77; $c = 88; echo "显示 $a $b $c 中的最大值是"; echo "<br>"; echo Math::Max3($a,$b,$c); ?>
프로그램 실행 결과:
1
2
99 77 88 중 표시되는 최대값은
99
Static 메소드가 static을 호출함
특성은 클래스 이름::정적 속성 이름을 사용하여 이 클래스의 정적 속성을 호출합니다.
<? // class Circle{ public static $pi = 3.14; public static function circleAcreage($r){ return $r * $r * Circle::$pi; } } $r = 3; echo " 半径 $r 的圆的面积是 " . Circle::circleAcreage($r); ?>
프로그램 실행 결과:
1
반지름이 3인 원의 면적은 28.26
self::를 사용하여 호출 이 클래스의 정적 속성. (제안)
<? // class Circle{ public static $pi = 3.14; public static function circleAcreage($r){ return $r * $r * self::$pi; } } $r = 3; echo " 半径 $r 的圆的面积是 " . Circle::circleAcreage($r); ?>
프로그램 실행 결과:
1
반경이 3인 원의 면적은 28.26
정적 메서드는 비정적 속성을 호출할 수 없습니다
정적 메서드는 비정적 속성을 호출할 수 없습니다. 비정적 속성은 self::를 사용하여 호출할 수 없습니다.
<? // class Circle{ public $pi = 3.14; public static function circleAcreage($r){ return $r * $r * self::pi; } } $r = 3; echo " 半径 $r 的圆的面积是 " . Circle::circleAcreage($r); ?>
프로그램 실행 결과:
1
치명적인 오류: 정의되지 않은 클래스 상수 'pi'
E:PHPProjectstest.php 7행
또한 $this를 사용하여 비정적 속성의 값을 가져올 수 없습니다.
<? // class Circle{ public $pi = 3.14; public static function circleAcreage($r){ return $r * $r * $this->pi; } } $r = 3; echo " 半径 $r 的圆的面积是 " . Circle::circleAcreage($r); ?>
프로그램 실행 결과:
1
치명적인 오류: 객체 컨텍스트에 없을 때 $this를 사용합니다.
E:PHPProjectstest.php 7행
정적 메서드가 비정적 메서드 호출
PHP5에서는 $this 식별자를 정적 메서드에서 사용하여 비정적 메서드를 호출할 수 없습니다.
<? // 实现最大值比较的Math类。 class Math{ public function Max($num1,$num2){ echo "bad<br>"; return $num1 > $num2 ? $num1 : $num2; } public static function Max3($num1,$num2,$num3){ $num1 = $this->Max($num1,$num2); $num2 = $this->Max($num2,$num3); $num1 = $this->Max($num1,$num2); return $num1; } } $a = 99; $b = 77; $c = 188; echo "显示 $a $b $c 中的最大值是"; echo "<br>"; echo Math::Max3($a,$b,$c); ?>
프로그램 실행 결과:
99 77 188 중 최대값이 표시됩니다.
치명적인 오류: 없을 때 $this 사용
10행 E:test.php의 객체 컨텍스트
클래스의 비정적 메서드가 self::에 의해 호출되면 시스템은 자동으로 이 메서드를 정적 메서드로 변환합니다.
다음 코드를 실행하여 결과를 얻었습니다. Max 메서드는 시스템에 의해 정적 메서드로 변환되기 때문입니다.
<? // 实现最大值比较的Math类。 class Math{ public function Max($num1,$num2){ return $num1 > $num2 ? $num1 : $num2; } public static function Max3($num1,$num2,$num3){ $num1 = self::Max($num1,$num2); $num2 = self::Max($num2,$num3); $num1 = self::Max($num1,$num2); return $num1; } } $a = 99; $b = 77; $c = 188; echo "显示 $a $b $c 中的最大值是"; echo "<br>"; echo Math::Max3($a,$b,$c); ?>
프로그램 실행 결과:
1
2
아래 예에서는 99 77 188에 표시된 최대값이
188
입니다. , 정적 메서드 Max3가 self::를 사용하여 비정적 메서드 Max를 호출하도록 하고, 비정적 메서드 Max가 $this를 통해 비정적 속성 $pi를 호출하도록 합니다.
실행시 오류가 보고되었습니다. 이 오류는 이전 예제 3-1-9.php와 동일합니다. 이번에는 비정적 메소드 Max가 비정적 속성을 호출하는 오류를 보고했습니다. 정적 방법.
여기서 정의한 비정적 메서드 Max는 시스템에 의해 자동으로 정적 메서드로 변환된다는 사실이 입증되었습니다.
<? // 实现最大值比较的Math类。 class Math{ public $pi = 3.14; public function Max($num1,$num2){ echo self::$pi; //这里的调用看来不应该有问题. return $num1 > $num2 ? $num1 : $num2; } public static function Max3($num1,$num2,$num3){ $num1 = self::Max($num1,$num2); $num2 = self::Max($num2,$num3); $num1 = self::Max($num1,$num2); return $num1; } } $a = 99; $b = 77; $c = 188; echo "显示 $a $b $c 中的最大值是"; echo "<br>"; echo Math::Max3($a,$b,$c); ?>
程序运行结果:
1
2
显示 99 77 188 中的最大值是
Fatal error: Access to
undeclared static property: Math::$pi in E:PHPProjectstest.php on line 7