2011-01-17 4 views
46

나는이 문제에 약간 혼란 스럽다. 나는 레일즈에서 루비의 ActiveRecord와 매우 비슷한 행동을 시도하는 ORM 클래스를 디자인하고 있지만, 그 점은 그 옆에있다.PHP static :: self를 대체 할 수 있습니까 ::?

제가 말하고자하는 것은 제 클래스가 특히 데이터베이스와 테이블 처리를 위해 정적 속성 상속을 광범위하게 사용한다는 것입니다. 내 질문은, 내가 자기를 사용해야합니까 :: 전혀?

+0

나는 생각한다 '정적'은 처음부터 잘못된 접근법입니다. 그것은 당신의 코드를 테스트 할 수 없게 만든 것처럼 들린다. – PeeHaa

답변

94

자신에게 물어야합니다. "적절한 방법으로 문제를 타겟팅합니까?"

self::static::은 두 가지 다른 작업을 수행합니다. 예를 들어 self:: 또는 __CLASS__은 현재 클래스에 대한 참조이므로 특정 범위에서 정의되므로 전달에서 정적 호출이 필요하지 않습니다.

상속은 어떻게됩니까?

class A { 
    public static function className(){ 
     echo __CLASS__; 
    } 

    public static function test(){ 
     self::className(); 
    } 
} 

class B extends A{ 
    public static function className(){ 
     echo __CLASS__; 
    } 
} 

B::test(); 

이이 인쇄됩니다 이것은 예상 된 동작

class A { 
    public static function className(){ 
     echo __CLASS__; 
    } 

    public static function test(){ 
     static::className(); 
    } 
} 

class B extends A{ 
    public static function className(){ 
     echo __CLASS__; 
    } 
} 


B::test(); 

을 가지고 static::와 다른 손에

A 

를 인쇄합니다라고

B 

. 런타임에 참조 된 인 클래스 호출의 제한을 해결합니다..

그걸 염두에두면 이제 문제를보고 해결할 수 있다고 생각합니다. 정적 멤버를 여러 명 상속하고 부모 및 자식 멤버 self::에 액세스해야하는 경우 충분하지 않습니다.

+8

기본적으로 모든 언어에서와 같이 일들이 평소와 같이 작동하도록하려면 정적 대신 사용해야합니다. 그리고 그러한 일들이 정말로 중요하지 않을 때 나는 호환성을 위해 자기를 사용할 수 있습니다. 그 맞습니까? – elite5472

+7

맞습니다. 이전 버전과의 호환성을 원한다면 자아를 다루어야합니다. 그런 식으로 정적 멤버에 액세스하려는 경우 멤버를 래핑하는 정적 메서드를 수행해야합니다. – DarkThrone

+0

알았어, 나를 위해 물건을 정리 해줘서 고마워. – elite5472

6

시도는 자기와의 차이 정적보고 울부 짖는 코드를 사용 :

<?php 
class Parent_{ 
    protected static $x = "parent"; 
    public static function makeTest(){ 
     echo "self => ".self::$x."<br>"; 
     echo "static => ".static::$x;  
    } 
} 

class Child_ extends Parent_{ 
    protected static $x = "child"; 
} 

echo "<h4>using the Parent_ class</h4>"; 
Parent_::makeTest(); 

echo "<br><h4>using the Child_ class</h4>"; 
Child_::makeTest(); 
?> 

를하고이 결과를 얻을 다음 PARENT_ 클래스

를 사용

  • 자기 => 부모
  • 정적 => 부모

사용하여 CHILD_ 클래스

  • 자기 => 부모
  • 정적 => 아이
관련 문제