>  기사  >  백엔드 개발  >  PHP에서 정적 변수를 사용하는 방법에 대한 예제 요약

PHP에서 정적 변수를 사용하는 방법에 대한 예제 요약

伊谢尔伦
伊谢尔伦원래의
2017-06-30 10:08:011521검색

static 키워드는 클래스의 특정 인스턴스가 아닌 클래스와 관련된 속성 또는 메서드를 선언합니다. 따라서 이러한 유형의 속성 또는 메서드를 "클래스 속성" 또는 "클래스"라고도 합니다. 방법".

액세스 제어 권한이 허용되면 이 클래스의 객체를 생성하지 않고도 클래스 이름과 콜론 두 개 "::"를 사용하여 직접 호출할 수 있습니다.

static 키워드를 사용하여 변수와 메서드를 수정할 수 있습니다.

인스턴스화 없이 클래스의 정적 속성과 정적 메서드에 직접 액세스할 수 있습니다.

static의 속성 및 메서드는 정적 속성 및 메서드에만 액세스할 수 있으며 비static속성 및 메서드에는 액세스할 수 없습니다. 정적 속성과 메서드가 생성될 때 호출할 수 있는 이 클래스의 인스턴스가 아직 없을 수 있기 때문입니다.

정적 속성은 메모리에 단 하나의 복사본만 가지며 모든 인스턴스에서 공유됩니다.

현재 클래스의 정적 멤버에 액세스하려면 self:: 키워드를 사용하세요.
정적 속성 공개 기능

클래스의 모든 인스턴스는 클래스의 정적 속성을 공유합니다.

즉, 메모리에 인스턴스가 여러 개 있더라도 정적 속성의 복사본은 하나만 있습니다.

다음 예에서는 개인 및 정적 수정을 통해 카운터 $count 속성이 설정됩니다. 이러한 방식으로 외부 세계는 $count 속성에 직접 액세스할 수 없습니다. 프로그램 실행 결과, 여러 인스턴스가 동일한 정적 $count 속성을 사용하고 있음을 알 수 있습니다.

<?php
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
정적 속성이 직접 호출됩니다.

정적 속성은 인스턴스화 없이 직접 사용할 수 있으며 클래스는 아직 생성되지 않았습니다. 아직 생성되지 않았지만 직접 사용할 수 있습니다.

사용된 메소드는 클래스 이름::정적 속성 이름입니다.

<?php
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() 함수를 제공합니다.

<?php
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임을 보여줍니다.
정적 메소드로 정적 메소드를 호출하는 방법

먼저 예를 들어 정적 메서드가 다른 정적 메서드를 호출하는 경우 클래스 이름을 직접 사용합니다.

<?php
// 实现最大值比较的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::를 사용하여 현재 클래스의 다른 정적 메서드를 호출할 수도 있습니다. (제안)

<?php
// 实现最大值比较的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
정적 메서드가 정적 속성을 호출함

클래스 이름::정적 속성 이름을 사용하여 정적 속성을 호출합니다. 수업 .

<?php
//
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::를 사용하세요. (제안)

<?php
//
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::를 사용하여 호출할 수 없습니다.

<?php
//
class Circle{
    public $pi = 3.14;
    public static function circleAcreage($r){
      return $r * $r * self::pi;
    }
}
$r = 3;
echo " 半径 $r 的圆的面积是 " . Circle::circleAcreage($r);
?>

프로그램 실행 결과:
1

치명적인 오류: 7행의 E:PHPProjectstest.php에 정의되지 않은 클래스 상수 'pi'

비정적 속성 값을 얻기 위해 $this를 사용할 수도 없습니다.

<?php
//
class Circle{
    public $pi = 3.14;
    public static function circleAcreage($r){
      return $r * $r * $this->pi;
    }
}
$r = 3;
echo " 半径 $r 的圆的面积是 " . Circle::circleAcreage($r);
?>

프로그램 실행 결과:
1

치명적인 오류: 7행 E:PHPProjectstest.php의 object 컨텍스트에 없을 때 $this 사용
정적 메서드가 비정적 메서드 호출

PHP5에서는 사용할 수 없습니다. 정적 메서드에서 비정적 메서드를 호출하려면 $this 식별자를 사용합니다.

<?php
// 实现最大值比较的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 중 최대값이 다음과 같이 표시됩니다.
치명적인 오류: 10행 E:test.php의 객체 컨텍스트에 없을 때 $this 사용

a 클래스는 self::가 호출되면 시스템이 자동으로 이 메서드를 정적 메서드로 변환합니다.

다음 코드가 실행되어 결과가 나왔습니다. Max 메서드는 시스템에 의해 정적 메서드로 변환되기 때문입니다.

<?php
// 实现最大值比较的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 被系统自动转换成静态方法了。

<?php
// 实现最大值比较的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

위 내용은 PHP에서 정적 변수를 사용하는 방법에 대한 예제 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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