4

我有父类 Color 和子类 ColorRGBA 和 ColorHSLA。在 Color 类中,我想使用这些子项的静态函数,但出现错误“找不到 Class 'Color'”。这是同样的问题http://forums.codeguru.com/showthread.php?t=469995class Color;似乎在 PHP 中不起作用。

颜色.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) {
        ...
    }
}

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

4

3 回答 3

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

于 2012-06-06T18:10:48.897 回答
0

您不能在 Color.php 中包含 ColorRGBA.php,在 ColorRGBA.php 中包含 Color.php。你会得到循环依赖。这就是为什么你得到类未找到错误的原因。

于 2012-06-06T18:07:41.120 回答
0

为了解决这类问题,也许你应该考虑实现一个工厂类。如果这不是您的风格,那么解决此问题的另一种优雅方法是使用__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+

于 2012-06-06T18:16:45.677 回答