>백엔드 개발 >PHP 튜토리얼 >PHP의 범위 결정 연산자(::) 활용

PHP의 범위 결정 연산자(::) 활용

不言
不言원래의
2018-06-21 09:31:142190검색

이 글에서는 특정 참조 값을 갖는 PHP의 범위 결정 연산자(::)의 사용을 주로 소개합니다. 이제 모든 사람과 공유합니다. 필요한 친구들이 참조할 수 있습니다.

Joomla 소스 코드를 보고 깨달았습니다. 오늘 도착. 이 연산자는 클래스의 비정적 메서드에도 액세스할 수 있는 것으로 나타났습니다. 정말 놀랍지 않습니다. 나는 항상 범위 확인 연산자가 클래스의 정적 메서드와 정적 멤버 변수에만 액세스할 수 있다고 생각했습니다.

스코프 해상도 연산자(::)
오늘 줌라 소스코드를 보다가 깨달았습니다. 이 연산자는 클래스의 비정적 메서드에도 액세스할 수 있는 것으로 나타났습니다. 정말 놀랍지 않습니다. 나는 항상 범위 확인 연산자가 클래스의 정적 메서드와 정적 멤버 변수에만 액세스할 수 있다고 생각했습니다.
믿을 수 없다면 이를 증명할 수 있는 간단한 테스트 코드가 아래에 있습니다.

class A{ 
private $_name = 'A'; 
function __construct(){ 
echo &#39;A construct <br />&#39;; 
} 
function test(){ 
echo &#39;A test() <br />&#39;; 
} 
} 
class B extends A{ 
private $_name = &#39;B&#39;; 
function __construct(){ 
parent::__construct(); 
echo &#39;B construct <br />&#39;; 
} 
function test(){ 
echo &#39;B test()&#39;; 
} 
} 
A::test(); 
echo &#39;######### <br />&#39;; 
B::test();

이 코드를 입력한 결과는 다음과 같습니다.

A test() 
######### 
B test()

클래스 A의 test()와 클래스 B의 테스트는 정적 메서드는 아니지만 "클래스 이름::메서드 이름(매개변수 목록)"을 사용할 수 있습니다. 스타일은 다음과 같습니다. 올바르게 호출되었습니다. 그 효과는 클래스의 인스턴스를 새로 만든 다음 이 인스턴스를 사용하여
test 메서드를 호출하는 것과 같습니다.
하지만 테스트 메서드에서 name 속성을 인쇄하고 ::로 직접 호출해야 한다면 어떻게 될까요? 먼저 위 코드를 수정해 보겠습니다.

class A{ 
private $_name = &#39;A&#39;; 
function __construct(){ 
echo &#39;A construct <br />&#39;; 
} 
function test(){ 
echo &#39;A test() <br />&#39;, $this->$_name,&#39;<br />&#39;; 
} 
} 
class B extends A{ 
private $_name = &#39;B&#39;; 
function __construct(){ 
parent::__construct(); 
echo &#39;B construct <br />&#39;; 
} 
function test(){ 
echo &#39;B test()&#39;, $this->_name,&#39;<br />&#39;; 
} 
} 
A::test(); 
echo &#39;######### <br />&#39;; 
B::test();

위 코드를 실행한 결과는 다음과 같습니다.

Fatal error: Using $this when not in object context in D:\www\test\scoperefe.php on line 9 
[html]

몇몇 친구들이 그러더군요. 물론 클래스 A를 전혀 인스턴스화하지 않았습니다. $this->_name을 사용하여 멤버 변수 $_name에 직접 액세스할 수 없습니다. 그러면 이를 self::$_name으로 변경할 수 있습니까?
위 코드를 수정하고

[code] 
class A{ 
private $_name = &#39;A&#39;; 
function __construct(){ 
echo &#39;A construct <br />&#39;; 
} 
function test(){ 
echo &#39;A test() <br />&#39;, self::$_name,&#39;<br />&#39;; 
} 
} 
class B extends A{ 
private $_name = &#39;B&#39;; 
function __construct(){ 
parent::__construct(); 
echo &#39;B construct <br />&#39;; 
} 
function test(){ 
echo &#39;B test()&#39;, $this->_name,&#39;<br />&#39;; 
} 
} 
A::test(); 
echo &#39;######### <br />&#39;; 
B::test();

위 코드를 실행하면 결과는 다음과 같습니다.

A test() Fatal error: Access to undeclared static property: A::$_name in D:\www\test\scoperefe.php on line 9

오, self 키워드를 사용하여 현재의 비정적 메서드에 액세스할 수 없다는 것이 밝혀졌습니다. 수업.
이제 이 메서드를 올바르게 호출하려면 다음 두 가지 방법이 있습니다.
1. 먼저 클래스를 인스턴스화한 다음 $this->_name을 사용하여 개체를 직접 호출합니다.
2. _name 정적으로 설정합니다.
모든 사람이 위의 문제를 올바르게 처리할 수 있다고 믿습니다.
실제로 제가 정말 말하고 싶은 것은:
인스턴스화 없이 메서드를 호출할 수 있다면 static 키워드를 사용하여 이 메서드를 수정하는 것이 좋습니다. 메서드를 구현할 때 클래스의 정적 멤버 변수만 호출됩니다. 이렇게 하면 위에서 발생한 문제가 발생하지 않습니다.
방법이 정적 방법으로 설정되지 않은 경우. 그런 다음 가장 안전한 방법은 인스턴스 개체를 사용하여 호출하는 것입니다. 어느 시점에서 메서드 구현을 수정해야 할 수도 있으므로
비정적 멤버를 호출해야 할 수도 있습니다. 클래스의 변수(대부분 메서드 구현을 수정할 때 클래스 이름으로 직접 호출하는 것과 같은 것이 있다는 사실을 잊어버렸기 때문입니다.)
개인적인 소견입니다.

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되었으면 좋겠습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요!

관련 권장 사항:

PHP에서 Yii 프레임워크의 구성 요소 동작에 대한 속성 주입 및 메서드 주입에 대해

PHP 사용자 정의 직렬화 인터페이스 사용 분석에 대해 Serialized

위 내용은 PHP의 범위 결정 연산자(::) 활용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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