>백엔드 개발 >PHP 튜토리얼 >PHP의 정적 및 const

PHP의 정적 및 const

WBOY
WBOY원래의
2016-07-30 13:30:361277검색

정적 키워드는 클래스의 멤버 속성과 멤버 메서드가 정적임을 설명합니다. 정적 멤버의 이점은 무엇인가요? 앞서 우리는 인간을 "Person"이라고 선언했습니다. "Person" 클래스에 "Person"이라는 속성을 추가하면 "Person" 클래스를 사용하여 수백 개 이상의 인스턴스 객체를 인스턴스화할 수 있습니다. "국가" 속성을 사용합니다. 프로젝트가 중국인을 대상으로 개발된 경우 각 개체는 "중국"이라는 국가 속성을 갖게 됩니다. 정적 멤버이므로 메모리에 국가 속성이 하나만 있고 수백 개 이상의 개체가 이 속성을 공유하는 경우 정적 멤버는 클래스에 속하고 어떤 개체 인스턴스에도 속하지 않기 때문에 외부 액세스를 제한할 수 있습니다. 클래스가 처음 로드될 때 공간이 할당되며 클래스의 인스턴스와만 공유됩니다.

메모리 관점에서 분석해 보겠습니다. 메모리는 논리적으로 4개의 세그먼트로 나누어져 있으며, 개체는 "힙 메모리"에 배치되고, 개체의 참조는 "스택 메모리"에 배치됩니다. 클래스가 처음 로드될 때 배치되는 "초기화된 정적 섹션"에서 아래와 같이 힙 메모리의 모든 객체에서 공유할 수 있습니다.

PHP의 정적 및 const

클래스의 정적 변수는 전역 변수와 매우 유사하며 클래스의 모든 인스턴스에서 공유할 수 있습니다. 이는 전역 함수와 유사한 클래스의 정적 메서드에도 적용됩니다.

01 <?

02classPerson

03{

04 //下面是人的静态成员属性

05 publicstatic$myCountry= "中国";

06

07 // var $name; //人的名子

08

09 //这是人的静态成员方法

10 publicstaticfunctionsay() {

11 echo"我是中国人";

12 }

13}

14

15//输出静态属性

16echoPerson::$myCountry;

17

18//访问静态方法

19Person::say();

20

21//重新给静态属性赋&#20540;

22Person::$myCountry= "美国";

23echoPerson::$myCountry;

24?>

클래스가 처음 로드될 때 정적 멤버가 생성되므로 클래스 외부에 개체가 필요 없으며 위에서 언급한 클래스 이름을 사용하여 정적 멤버에 액세스할 수 있습니다. 정적 멤버는 이 클래스 의 모든 인스턴스 개체에서 공유됩니다. 그러면 개체를 사용하여 클래스의 정적 멤버에 액세스할 수 있나요? 위 그림을 보면 각 객체 내부에는 정적 멤버가 존재하지 않지만 각 객체를 공유할 수 있으므로 객체를 사용하여 멤버에 액세스하면 이러한 속성 정의가 없습니다. 객체 사용 Java와 같은 다른 개체 지향 언어에서는 개체를 사용하여 정적 멤버에 액세스할 수 있습니다. 회원 여러분, 프로젝트 작업 시 우리의 목적은 클래스 이름을 사용하여 액세스하는 것입니다.

클래스의 정적 메서드는 클래스의 정적 속성에만 액세스할 수 있습니다. 클래스의 정적 메서드는 클래스의 비정적 멤버에 액세스할 수 없습니다. 이 클래스의 메서드에서 이 클래스의 다른 멤버에 액세스하려면 참조 $this를 사용해야 하며 참조 포인터 $this는 이 메서드를 호출하는 개체를 나타냅니다. 정적 메서드는 개체와 함께 호출되지 않습니다. , 그리고 클래스 이름은 에 액세스하는 데 사용되므로 개체가 전혀 없으며 $this에 대한 참조가 없으면 클래스의 비정적 멤버에 액세스할 수 없습니다. 클래스의 정적 멤버는 객체가 필요하지 않습니다. 따라서 클래스의 정적 메서드는 클래스의 정적 속성에만 액세스할 수 있습니다. $this가 존재하지 않으므로 정적 메서드의 다른 정적 멤버에 액세스하려면 특수 클래스 "self를 사용합니다. "; self는 $this와 유사합니다. 단, self는 이 정적 메서드가 있는 클래스를 나타냅니다. 따라서 정적 메서드에서는 메서드가 위치한 클래스의 "클래스 이름"을 사용하거나, 특별한 상황이 아닌 경우 "self"를 사용하여 다른 정적 멤버에 액세스할 수 있습니다. 일반적으로 후자, 즉 "self::member 속성" 방법을 사용합니다.

01 <?

02classPerson

03{

04 //下面是人的静态成员属性

05 publicstatic$myCountry= "中国";

06

07 //这是人的静态成员方法, 通过self访问其它静态成员

08 publicstaticfunctionsay() {

09 echo"我是". self::$myCountry;

10 }

11}

12

13//访问静态方法

14Person::say();

15?>

비정적 메서드에서 정적 멤버에 접근할 수 있나요? 물론 가능하지만 "$this" 참조는 사용할 수 없습니다. 클래스 이름이나 "self:: 멤버 속성 형식"도 사용해야 합니다.

const는 상수를 정의하는 키워드입니다. PHP에서 상수를 정의하려면 "define()" 함수를 사용하지만, 클래스에서 상수를 정의하려면 C If와 마찬가지로 "const" 키워드를 사용합니다. 프로그램에서 #define 값이 변경되면 오류가 발생합니다. "const"로 수정된 멤버 속성의 액세스 방법은 "static"으로 수정된 멤버의 액세스 방법과 유사하며, "클래스 이름"은 다음과 같습니다. 메서드에 "self" 키워드도 사용됩니다. 그러나 "$" 기호를 사용할 필요는 없으며 객체를 사용하여 이에 액세스할 수 없습니다.

01 <?php

02classMyClass

03{

04 //定义一个常量constant

05 constconstant = 'constant value';

06

07 functionshowConstant() {

08 echoself::constant . " "; // 使用self访问,不要加“$”

09 }

10}

11

12echoMyClass::constant . " "; //使用类名来访问,也不加“$”

13

14$class= newMyClass();

15$class->showConstant();

16 // echo $class::constant;  是不允许的
17 ?>

위 내용은 PHP의 static과 const에 대한 내용을 포함하여 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

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