나는이 문제에 약간 혼란 스럽다. 나는 레일즈에서 루비의 ActiveRecord와 매우 비슷한 행동을 시도하는 ORM 클래스를 디자인하고 있지만, 그 점은 그 옆에있다.PHP static :: self를 대체 할 수 있습니까 ::?
제가 말하고자하는 것은 제 클래스가 특히 데이터베이스와 테이블 처리를 위해 정적 속성 상속을 광범위하게 사용한다는 것입니다. 내 질문은, 내가 자기를 사용해야합니까 :: 전혀?
나는이 문제에 약간 혼란 스럽다. 나는 레일즈에서 루비의 ActiveRecord와 매우 비슷한 행동을 시도하는 ORM 클래스를 디자인하고 있지만, 그 점은 그 옆에있다.PHP static :: self를 대체 할 수 있습니까 ::?
제가 말하고자하는 것은 제 클래스가 특히 데이터베이스와 테이블 처리를 위해 정적 속성 상속을 광범위하게 사용한다는 것입니다. 내 질문은, 내가 자기를 사용해야합니까 :: 전혀?
자신에게 물어야합니다. "적절한 방법으로 문제를 타겟팅합니까?"
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::
에 액세스해야하는 경우 충분하지 않습니다.
기본적으로 모든 언어에서와 같이 일들이 평소와 같이 작동하도록하려면 정적 대신 사용해야합니다. 그리고 그러한 일들이 정말로 중요하지 않을 때 나는 호환성을 위해 자기를 사용할 수 있습니다. 그 맞습니까? – elite5472
맞습니다. 이전 버전과의 호환성을 원한다면 자아를 다루어야합니다. 그런 식으로 정적 멤버에 액세스하려는 경우 멤버를 래핑하는 정적 메서드를 수행해야합니다. – DarkThrone
알았어, 나를 위해 물건을 정리 해줘서 고마워. – elite5472
시도는 자기와의 차이 정적보고 울부 짖는 코드를 사용 :
<?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_ 클래스
- 자기 => 부모
- 정적 => 아이
나는 생각한다 '정적'은 처음부터 잘못된 접근법입니다. 그것은 당신의 코드를 테스트 할 수 없게 만든 것처럼 들린다. – PeeHaa