2013-03-12 2 views
7

저는 최근에 PHP 게임을 강화 해 왔습니다. 자바 스크립트에서부터, 객체 모델이 좀 더 이해하기 쉽다는 것을 알게되었습니다.PHP 속성 액세스 및 달러 기호

필자가 문서에서 찾을 수없는 몇 가지 단점을 분명히하기를 원했습니다. PHP에서 클래스를 정의 할 때

, 당신과 같이 속성을 정의 할 수 있습니다 :

class myClass { 

    public $myProp = "myProp"; 
    static $anotherProp = "anotherProp"; 

} 

을 우리가 사용하지 않고 $myClass->myProp ($myClass라는 변수에 참조 myClass 가정)를 사용하여 액세스 할 수 있습니다 $myProp의 공용 변수로 달러 기호의.

::을 사용하여 정적 변수에만 액세스 할 수 있습니다. 따라서 $myClass::$anotherProp과 같은 정적 변수에 달러 기호로 액세스 할 수 있습니다.

질문 : 왜 달러 기호 ::->이 아닌 달러 기호를 사용해야합니까?

class SethensClass { 

    static public $SethensProp = "This is my prop!"; 

} 

$myClass = new SethensClass; 
echo $myClass::$SethensProp; 
+1

흥미로운 ... 하나의 upvote와 하나의 닫기 요청. – Sethen

+0

[귀하의 다른 질문] (http://stackoverflow.com/q/17681253/20578)에 대한 의견을 보내서 죄송합니다. (일련의 개별 질문으로 질문하는 경우 개인적으로 괜찮을 것으로 생각됩니다. 예 : http : //stackoverflow.com/questions/15270843/what-does-plus-operator-mean-in-underscore-js)하지만 "최선의 관행은 이렇게 말합니다"와 같은 말은 조금 의미가 없습니다. 왜 * 왜 * 당신이 무언가가 "모범 사례"라고 생각하는지 설명 할 수 없다면 어떻게 그 것이 "최고"인지 어떻게 알 수 있습니까? 다른 상황은 상황에 따라 다릅니다. –

+0

@ PaulD.Waite 괜찮습니다. 개발로 전진하려는 개발자는 특정 라이브러리가 최상의 학습 방법을 따라 학습하는 데 도움이되는지 여부를 묻는 질문에 마음이 허용됩니다. 큰 지역 사회를 위해 그것을 지원하지 않는 것은 매우 실망 스럽습니다. 나는 특정 라이브러리가 베스트 프랙티스를 사용하여 작성되었다고 생각하지 않으며, 내가 잘못하고 있지 않다는 것을 확인하려고 노력하고있다. 그래서 코드를 제공 할 때 그것이 최선이라는 것을 확신 할 수있다. – Sethen

답변

14
class constant:: 범위 연산자로 액세스 할

없이 달러 기호, 그래서 :

편집

이 내가 일하는 것이 가정 (및 수행) 할 코드 정적 클래스 속성과 클래스 상수를 구별하기 위해서는 $이 필요합니다.

class myClass { 
    public static $staticProp = "static property"; 

    const CLASS_CONSTANT = 'a constant'; 
} 

echo myClass::CLASS_CONSTANT; 
echo myClass::$staticProp; 

그래서 변수에 액세스하려면 $이 필요합니다. 그러나 $$myClass::staticProp과 같은 클래스 이름의 시작 부분에 배치 할 수 없습니다. 클래스 이름으로 변수를 사용할 수도 있기 때문에 클래스 이름을 파서에서 식별 할 수 없기 때문입니다. 그러므로 반드시 속성에 첨부해야합니다.

$myClass = "SomeClassName"; 
// This attempts to access a constant called staticProp 
// in a class called "SomeClassName" 
echo $myClass::staticProp; 

// Really, we need 
echo myClass::$staticProp; 
+0

+1 +1이에요 –

+0

'$ myClass'는'$ myClass = new myClass'를 나타냅니다. – Sethen

+0

그러면 감각이 없습니다. $ staticProp은 인스턴스 변수가 아닌 클래스 변수이므로 클래스 인스턴스에서 호출 할 수 없습니다. –

0

Greedy!

때때로 기본 클래스의 함수 및 변수를 참조하거나 인스턴스가 아직없는 클래스의 함수를 참조하는 것이 유용합니다. :: 연산자가이 용도로 사용되고 있습니다.

<?php 
class A 
{ 
    function example() 
    { 
     echo "I am the original function A::example().<br>\n"; 
    } 
} 

class B extends A 
{ 
    function example() 
    { 
     echo "I am the redefined function B::example().<br>\n"; 
     A::example(); 
    } 
} 

// there is no object of class A. 
// this will print 
// I am the original function A::example().<br> 
A::example(); 

// create an object of class B. 
$b = new B; 

// this will print 
// I am the redefined function B::example().<br> 
// I am the original function A::example().<br> 
$b->example(); 
?> 

위의 예는 클래스 A의 함수 example()를 호출하지만, 우리는 $ A-> 예() 또는 이와 유사한을 기록 할 수 없도록 클래스 A의 어떤 객체는 존재하지 않는다. 대신 example()을 '클래스 함수'라고 부릅니다. 즉, 클래스 자체의 함수로, 해당 클래스의 객체가 아닙니다.

클래스 함수가 ​​있지만 클래스 변수가 없습니다. 사실, 통화 할 때 전혀 대상이 없습니다. 따라서 클래스 함수는 어떤 객체 변수도 사용할 수 없지만 (지역 변수와 전역 변수를 사용할 수 있습니다), $ this를 전혀 사용할 수 없습니다.

위의 예에서 클래스 B는 example() 함수를 다시 정의합니다. :: - 연산자를 사용하여 클래스 A의 example() 구현을 구체적으로 언급하지 않는 한, 클래스 A의 원래 정의는 음영 처리되어 더 이상 사용할 수 없습니다.이렇게하려면 A :: example()을 작성하십시오 (실제로 parent :: example()를 작성해야합니다).

이 컨텍스트에는 현재 개체가 있으며 개체 변수가있을 수 있습니다. 따라서 WITHIN 개체 함수에서 사용하면 $ this와 개체 변수를 사용할 수 있습니다.