PHP:彼此使用的类

时间:2012-06-06 18:01:39

标签: php

我有父类Color和children,ColorRGBA和ColorHSLA。在Color类中我想使用这些子函数的静态函数,但是我找不到错误“Class'Color'。”这是同样的问题http://forums.codeguru.com/showthread.php?t=469995,但class Color;似乎在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) {
        ...
    }
}

我应该如何重建我的类层次结构或包含指令?或者还有其他选择如何使我的代码工作?

3 个答案:

答案 0 :(得分:2)

在PHP中是的,没有像C ++那样的“前向声明”。这就是为什么class Color;在PHP中无效。

现在为什么要"Class 'Color' not found."?问题是,这一行

class ColorRGBA extends Color

在该行之前执行:

class Color {

所以Color确实没有定义。要解决此问题,您可以执行以下操作:

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类现已完全定义,ColorRGBA / ColorHSLA类仅在调用isValid时定义。

您也可以在include_once类的定义之后添加Color

答案 1 :(得分:0)

您不能在Color.GB中包含ColorRGBA.php,而在ColorRGBA.php中也不能包含Color.php。您将获得循环依赖。这就是为什么你找不到类错误。

答案 2 :(得分:0)

要解决此类问题,也许您应该考虑实施factory class。如果这不是你的风格,另一个优雅的方法是使用__autoload()

至于代码的维护。根据您介绍的颜色数量,这将很困难。为什么不尝试类似的东西:

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 +