使用Reflection进行静态对象创建

时间:2013-04-22 13:41:08

标签: php oop reflection

class HueHue {
    private $hue;

    public function show(){
        echo $this->hue;
    }

    public static function parse($string){
        // parse it all
        $HueHue = new HueHue();
        $reflector = new ReflectionClass($HueHue);
        $hue = $reflector->getProperty('hue');
        $hue->setAccessible(true);
        $hue->setValue($HueHue, $parsed_string);
    }
}

这是“坏”吗?我真的更喜欢这个而不是制作public function setHue($parsed_string),而parse()必须是静态的,因为我讨厌做new然后设置并获得......

结束游戏只是HueHue::parse('something here')->show();,我真的不希望private $hue可以设置。

任何反馈意见。

2 个答案:

答案 0 :(得分:5)

  

这是“坏”吗?

你做的是什么并不坏。它不是世界上最干净的东西,但同时如果它解决了问题,那么它就是好的。我会修改@ Xeoncross的修改,因为它更清洁,避免反射。

但是,我认为为什么你正在做 坏。

如果您要创建一个对象只是为了输出格式化字符串,您可能想要首先重新考虑为什么要使用对象。如果您的大部分用法是:

HueHue::parse($hue)->show();

那为什么不只是制作一个跳过对象步骤的函数呢?

function parseHue($hue) {
    // parse it
    return $parsed_hue;
}

然后使用:

echo parseHue($hue);

或者,如果由于某种原因需要值对象(在您的问题中未指出),则将解析器拆分为单独的对象,并使队列成为构造函数参数。

class Hue {
    private $hue;
    public function __construct($hue) {
        $this->hue = $hue;
    }
    public function show() {
        echo $this->hue;
    }
}

class HueParser {
    public function parse($string) {
        // parse it!
        return new Hue($parsed_hue);
    }
}

解耦的原因是您现在可以多态切换解析器。因此,对解析器的使用者进行单元测试可以将其换成模拟器。

更不用说它保持适当的关注点分离,所以如果你想更新解析器逻辑(例如考虑新的格式),你可以在不改变消费者(调用解析器的人)的情况下做到这一点。 )或最终用户(获得Hue对象的人)......

答案 1 :(得分:1)

如果它是同一个类,你不需要反射。

class HueHue {
    private $hue;

    public function show(){
        echo $this->hue;
    }

    public static function parse($string)
    {
        $HueHue = new Static();
        $HueHue->hue = $string;
        return $HueHue;
    }
}

HueHue::parse($hue)->show();