2010-01-23 4 views
6

여러 자식 클래스에서 호출해야하는 클래스에 정적 함수가 있습니다. 호출 자식 클래스에서 해당 함수에서 상수가 필요합니다. 이 상수를 다른 곳에서 사용할 수있게하려면 자식 클래스에 상수 값을 반환하는 함수가 있어야합니다 (php 5.2.9).부모의 정적 함수에서 사용할 수없는 호출 된 자식 상수

그러나 부모 클래스에서 함수에 직접 액세스하지 않고 해당 상수에 액세스 할 수 없습니다. 그것은 PHP 5.2.9에서도 가능합니까? 아니면 인수로 전달해야합니까?

이것은 간단한 코드 버전 :

abstract class ParentClass { 
    static function DoSomething() { 
     $not_working = self::show_const(); 
     $not_working_either = self::SOME_CONST; 

     return 'working'; 
    } 
} 

class ChildClass extends ParentClass { 
    const SOME_CONST = 'some string'; 

    function show_const() { 
     return self::SOME_CONST; 
    } 
} 

$result = ChildClass::DoSomething(); 

편집 : 발생하는 에러이다

  • 통화 정의 방법에 ParentClass에 :: show_const() (함수)
  • 정의되지 않은 클래스 상수 'SOME_CONST'(self :: SOME_CONST 사용)
+0

생성되고있어 사용자들은? –

답변

13

불행히도, 여러분이하려는 것은 5.3 이전 버전에서 작동하지 않을 것입니다. 여기에있는 문제는 초기 정적 바인딩 대 늦은 정적 바인딩입니다. self 키워드는 조기에 바인딩되므로 기호를 해석하는 데 사용되는 클래스 만 찾습니다. 마법 상수 __CLASS__ 또는 함수 get_class()도 작동하지 않으며 초기 정적 바인딩도 수행합니다. 이러한 이유로 PHP 5.3은 static::some_method()으로 사용될 때 static 키워드를 늦은 바인딩이라는 의미로 확장했습니다.

그래서 5.3이 작동 것이다 : 오류 메시지가 무엇을

abstract class ParentClass { 
    public static function DoSomething() { 
    return static::show_const(); 
    // also, you could just do 
    //return static::SOME_CONST; 
    } 
} 

class ChildClass extends ParentClass { 
    const SOME_CONST = 'some string'; 
    public static function show_const() { 
    return self::SOME_CONST; 
    } 
} 

$result = ChildClass::DoSomething(); 
+0

고마워, 나는 그것을 두려워했다. 그건 그렇고, 상수를 반환하는 함수를 사용하는 유일한 이유는 PHP <5.3 ... – jeroen

+0

+1 개체에 사용할 수있는 유일한 방법 인 것 같습니다 - 정적 :: methodName() 구문 나에게 뉴스 야. :-) –

+0

+1 LSB가 부족하면 PHP에서 OO 코드를 개발할 수 있습니다 (5.3 이전). – nategood

2

당신은 ChildClass에 부모 클래스를 :: 확장 할 필요가

class ChildClass extends ParentClass { 

편집 :

당신이하지 않는 부모 클래스에서 하위 클래스의 일정 및 방법을 참조하려는 자식 클래스의 상수가 존재한다는 것을 알아라. 범위 문제입니다. 자식은 부모의 메서드와 상수를 참조 할 수 있지만 그 반대는 아닙니다.

+0

예에서 오류가 있습니다. 문제를 해결했습니다. – jeroen

+0

+1 간결하게 표현되었습니다. –

+0

분명히 당신이 맞다. 작동하지 않기 때문에, 실제로는 부모 클래스가 아니라 자식 클래스를 호출하고있다. (함수는 부모 클래스에있다.) 그래서 그것은 속성이 나에게 논리적 인 것처럼 보일 것이다. 사용할 수 있습니다. 어쨌든 고마워! – jeroen