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被设置.
任何反馈意见.
这是"坏"吗?
什么你做的也不错.它不是世界上最干净的东西,但同时如果它解决了问题,那么它就是好的.我会修改@ 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对象的人)...