2012-06-06 3 views
4

부모 클래스 인 Color 및 children, ColorRGBA 및 ColorHSLA가 있습니다. Color 클래스에서이 자식들의 정적 함수를 사용하고 싶지만 "Class 'Color'를 찾을 수 없습니다."라는 오류가 나타납니다. 여기에 같은 문제가 있습니다 http://forums.codeguru.com/showthread.php?t=469995하지만 class Color;은 PHP에서 작동하지 않습니다.PHP : 서로 사용하는 클래스

Color.php :

include_once 'ColorRGBA.php'; 
include_once 'ColorHSLA.php'; 

class Color{ 
    public static function isValid(&$tokens, $i) { 
     return ColorRGBA::isValid($tokens, $i) || ColorHSLA::isValid($tokens, $i); 
    } 
} 

ColorHLSA.php 유사 ColorRGBA.php

include_once 'Color.php'; 

class ColorRGBA extends Color { 
    public static function isValid(&$t, &$i) { 
     ... 
    } 
} 

어떻게 클래스 계층 구조를 재 구축 또는 지침을 포함해야합니까? 아니면 내 코드를 작동시키는 다른 옵션이 있습니까?

답변

0

이러한 유형의 문제를 해결하려면 factory class을 구현하는 것이 좋습니다. 이것이 자신의 스타일이 아닌 경우이 문제를 해결하는 또 다른 우아한 방법은 __autoload()을 사용하는 것입니다.

코드 유지 관리. 얼마나 많은 색상을 도입 하느냐에 따라 어려울 것입니다. 왜 같은 것을 시도하지 : 나는`include_once 문 "Color.php"제거하면

class Color{ 
    public static function isValid($type, &$tokens, $i){ 
     $class_name = 'Color'.$type;    
     if (!class_exists($class_name)) { 
      throw new Exception('Missing '.$class_name.' class.'); 
     } 

     $class_name::isValid(&$tokens, $i); 
    } 
} 

PHP 3.5

+0

CSS 파일의 파서이므로, CSS4 표준이없는 한 RGBA 및 HSLA 색상 만 유효합니다. 당신은이 솔루션을 만들기 위해 영감을 얻었다'$ r = 'ColorRGBA'; $ h = 'ColorHSLA'; return $ r :: isValid ($ 토큰, $ i) || $ h :: isValid ($ 토큰, $ i);'완벽하게 작동합니다. 감사합니다. – user1440369

+2

@ user1440369 : CSS에도 이름이 지정된 색상이 있습니다. – hakre

+0

CSS에서 명명 된 색상의 RGB 값만 찾아 냈으므로이 기능을 ColorRGBA 클래스에 포함 시켰습니다. 그렇지 않으면이 기능을 다른 클래스로 분리해야합니까? – user1440369

0

ColorRGBA.php는 Color.php에, Color.php는 ColorRGBA.php에 포함 할 수 없습니다. 순환 의존성이 생길 것입니다. 그래서 클래스를 찾을 수 없습니다 오류가 발생합니다.

+0

을'ColorRGBA.php 및 ColorHSLA.php에서 오류가 여전히 존재한다. include_once include 리소스는 한 번만 포함하면 안됩니까? – user1440369

+0

한 번 포함하는 것이 아닙니다. 그것은 서로에 대한 파일을 포함하는 것입니다. 순환 종속성이라고합니다. ColorRGBA.php에서 ** include Color.php ** 문을 제거하고 ** Color ** 문을 확장하십시오. Color 클래스는 그대로 둘 수 있습니다. – robonerd

2

예 PHP에서 "C++"와 같은 "forward declaration"이 없습니다. 그렇기 때문에 class Color;은 PHP에서 유효하지 않습니다.

이제 "Class 'Color' not found."을 얻으시겠습니까? 문제는,이 라인이 라인 전에 실행

class ColorRGBA extends Color 

도착한다 :

class Color { 

이 그래서 Color이 참으로 정의되지에게. 이 문제를 해결하려면 다음을 수행 할 수있는 다음 Color 클래스가 이제 완전히 정의하고 ColorRGBA/ColorHSLA 클래스 isValid가 호출되는 경우에만 정의되어 있기 때문에이 작동

class Color{ 
    public static function isValid(&$tokens, $i) { 
     include_once 'ColorRGBA.php'; 
     include_once 'ColorHSLA.php'; 
     return ColorRGBA::isValid($tokens, $i) || ColorHSLA::isValid($tokens, $i); 
    } 
} 

합니다.

Color 클래스의 정의 뒤에 include_once을 넣을 수도 있습니다.

+0

기능 내부를 포함 해 고맙습니다. – user1440369