>백엔드 개발 >PHP 튜토리얼 >PHP에서 정적 클래스와 정적 변수의 사용법과 차이점

PHP에서 정적 클래스와 정적 변수의 사용법과 차이점

怪我咯
怪我咯원래의
2017-07-10 11:43:111219검색

이 글은 주로 PHP에서 정적 클래스와 정적 변수의 사용법에 대한 차이점을 소개합니다. PHP에서 정적 클래스와 정적 변수의 정의, 기능 및 사용법을 예제와 함께 자세히 분석합니다.

이 예제는 PHP에서 정적 클래스와 정적 변수 사용의 차이점을 분석합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.

static은 정적 객체 또는 정적 변수를 정의하는 것입니다. static으로 정의된 변수나 클래스 메서드의 특성에 대해서는 이 기사의 관련 예제를 읽어보면 알 수 있습니다.

Create. object

$ object = new Class(), 그리고 변수/메서드에 액세스할 수 있는 경우 "->"를 사용하여 $object->attribute/function을 호출합니다. 2. : class::attribute/ 함수, 정적이든 비정적이든 전제조건이 있습니다.

A. 변수인 경우 해당 변수에 액세스할 수 있어야 합니다.

B. 메소드가 접근 가능하다는 것 외에, 메소드도 충족해야 합니다.

① 정적 메소드인 경우 특별한 조건은 없습니다.

② 비정적 메소드인 경우 $를 사용하지 않고 메소드를 변경해야 합니다. 즉, 비정적 변수/메서드가 호출되지 않습니다. 물론 정적 변수/메서드를 호출하는 데에는 문제가 없습니다.

그럼 $object->…를 사용하는 것과 클래스를 사용하는 것의 차이점을 살펴보겠습니다. ::...:

1. $object->...를 사용하려면

constructor

를 실행하여 객체를 생성해야 합니다.2. 생성자를 실행하지 않고 class::...를 호출합니다.

3. 클래스::...를 사용하여 생성자를 실행하지 않고 비정적 메서드/변수를 호출하여 객체를 생성합니다.

그러면 이상한 점은 2와 3이 동일하기 때문에 나오는 것입니다. 정적 메소드/변수의 존재 이유는 무엇입니까?

정적: 클래스 멤버 또는 메서드를 정적으로 선언하면 클래스를 인스턴스화하지 않고도 직접 액세스할 수 있습니다. 정적 메서드는 개체를 통해 정적 멤버에 액세스할 수 없습니다. 그러나 클래스의 객체 인스턴스는 공유될 수 있습니다.

예제, 코드는 다음과 같습니다.


코드는 다음과 같습니다.

<?php 
Class Person{ 
    // 定义静态成员属性 
    public static $country = "中国"; 
    // 定义静态成员方法 
    public static function myCountry() { 
        // 内部访问静态成员属性 
        echo "我是".self::$country."人<br />"; 
    } 
} 
class Student extends Person { 
    function study() { 
        echo "我是". parent::$country."人<br />"; 
    } 
} 
// 输出成员属性值 
echo Person::$country."<br />";  // 输出:中国 
$p1 = new Person(); 
//echo $p1->country;   // 错误写法 
// 访问静态成员方法 
Person::myCountry();   // 输出:我是中国人 
// 静态方法也可通过对象访问: 
$p1->myCountry(); 
 
// 子类中输出成员属性值 
echo Student::$country."<br />"; // 输出:中国 
$t1 = new Student(); 
$t1->study();    // 输出:我是中国人 
?>

예제를 실행하면 다음과 같습니다.

China

저는 중국인입니다.
나는 중국인입니다
China
나는 중국인입니다

요약: 클래스 내의 정적 멤버 속성이나 메서드에 액세스하려면 self::($slef가 아님)를 사용하세요. 코드는 다음과 같습니다.


코드는 다음과 같습니다. :

slef:: $country
slef:: myCountry()

하위 클래스에 있는 상위 클래스의 정적 멤버 속성이나 메서드에 액세스하려면 parent::($parent가 아님)를 사용하세요. 코드는 다음과 같습니다.


코드는 다음과 같습니다.

parent:: $country
parent:: myCountry()

외부 정적 멤버

속성 및 메서드에 대한 액세스

는 클래스 이름/하위 클래스 이름::, 코드는 다음과 같습니다.
코드는 다음과 같습니다.

Person::$country
Person::myCountry()
Student::$country

그러나 정적 메서드는 일반 개체를 통해서도 액세스할 수 있습니다.

예 , 정적 변수를 선언하는 경우 코드는 다음과 같습니다.



코드는 다음과 같습니다.

<?PHP 
   function foo(){ 
   static $int = 0;// correct 
   static $int = 1+2;   // wrong (as it is an expression) 
   static $int = sqrt(121); // wrong (as it is an expression too) 
   $int++; 
   echo $int; 
   } 
?>

예, 정적 변수를 사용하는 예, 코드는 다음과 같습니다.


코드는 다음과 같습니다.

<?PHP 
   function Test() 
   { 
   static $w3sky = 0; 
   echo $w3sky; 
   $w3sky++; 
   } 
?>

이제 Test() 함수가 호출될 때마다 $w3sky의 값이 출력되고 1씩 증가합니다.

정적 변수는

재귀 함수

를 처리하는 방법도 제공합니다. 반복적으로 10까지 계산되는 이 간단한 함수를 사용하여 무한하게 반복될 수 있으므로 재귀 함수를 작성할 때는 주의해야 합니다. 예제, 정적 변수 및 재귀 함수의 코드는 다음과 같습니다.


코드는 다음과 같습니다.

<?PHP 
   function Test() 
   { 
   static $count = 0; 
    
   $count++; 
   echo $count; 
   if ($count < 10) { 
   Test(); 
   } 
   $count--; 
   } 
?>

참고:

표현식

의 결과가 다음과 같은 경우 정적 변수를 선언할 수 있습니다. 값을 할당하기 위해 선언에 사용되면 구문 분석 오류가 발생합니다.


PHP에서는 클래스 메서드/변수에 액세스하는 두 가지 방법이 있습니다.
1. $object = new Class() 개체를 만든 다음 "->"를 사용하여 $object->attribute/function을 호출합니다. 변수/메서드에 액세스할 수 있는 경우에 한합니다.
2. 정적이든 비정적이든 클래스 메서드/변수: class::attribute/function을 직접 호출합니다. 하지만 전제 조건이 있습니다:
A. 변수인 경우 해당 변수에 액세스할 수 있어야 합니다.
B. 메서드인 경우 액세스 가능한 메서드 외에도 다음을 충족해야 합니다.
b1) 정적 메서드인 경우 특별한 조건이 없습니다.
b2) 비정적 메서드인 경우 , 메소드에서 $this 를 사용하지 않도록 변경해야 합니다. 즉, 비정적 변수/메서드 호출이 없으며, 물론 정적 변수/메서드 호출에는 문제가 없습니다.

그럼 $object->...를 사용하는 것과 class::...를 사용하는 것의 차이점을 살펴보겠습니다.
1. $object->...를 사용할 때 객체를 생성하려면 생성자를 실행해야 합니다. . class:: ... 사용 정적 메서드/변수를 호출할 때 객체를 생성하기 위해 생성자를 실행할 필요가 없습니다.
3. 비정적 메서드/변수를 호출하려면 class::...를 사용하세요. 객체를 생성하기 위해 생성자를 실행할 필요가 없습니다.

그러면 이상한 점이 나옵니다. 2와 3이 동일하므로 정적 메소드/변수가 존재하는 이유는 무엇입니까?
다음과 같이 차이점이 분명히 존재합니다.
1. 정적 변수
정적 멤버는 하나의 변수 값만 유지하며 이 변수 ​​값은 모든 인스턴스에 유효합니다. 즉, 모든 인스턴스가 이 멤버를 공유합니다.
2. 정적 메서드
정적 메서드는 class::...를 사용하여 직접 호출할 수 있지만, 비정적 메서드는 앞서 언급한 것처럼 class::.. 메서드를 사용하여 호출하기 전에 특정 제한 사항을 충족해야 합니다.

위 내용은 PHP에서 정적 클래스와 정적 변수의 사용법과 차이점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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