>  기사  >  php教程  >  PHP 객체 지향 여정: 정적 변수 및 메소드에 대한 심층적인 이해

PHP 객체 지향 여정: 정적 변수 및 메소드에 대한 심층적인 이해

黄舟
黄舟원래의
2016-12-12 17:06:071341검색

정적 키워드는 속성이나 메서드가 클래스의 특정 인스턴스가 아닌 클래스와 관련되어 있음을 선언합니다. 따라서 이러한 유형의 속성이나 메서드를 "클래스 속성" 또는 "클래스 메서드"라고도 합니다.

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

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


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