使用Reflection进行静态对象创建

loc*_*ost 0 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

结束游戏是公正的HueHue::parse('something here')->show();,我真的不想private $hue被设置.

任何反馈意见.

irc*_*ell 5

这是"坏"吗?

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

但是,我认为,为什么你在做它坏的.

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

HueHue::parse($hue)->show();
Run Code Online (Sandbox Code Playgroud)

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

function parseHue($hue) {
    // parse it
    return $parsed_hue;
}
Run Code Online (Sandbox Code Playgroud)

然后使用:

echo parseHue($hue);
Run Code Online (Sandbox Code Playgroud)

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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