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
可以设置。
任何反馈意见。
答案 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();