我想在同一个类的公共方法调用的类中使用私有方法。
withLabel()
这是否正确使用类属性作为参数?
它有效,但我不知道是否有更好的方法来做到这一点。我的目的是使用动态方法参数,而不需要将3个参数传递给class Foo
{
private $updateAll = true;
private $updateA = false;
private $updateB = false;
public function updateA()
{
$this->updateAll = false;
$this->updateA = true;
$this->updateB = false;
$this->update();
}
public function updateB()
{
$this->updateAll = false;
$this->updateA = false;
$this->updateB = true;
$this->update();
}
private function update()
{
// Code here...
if ($this->updateAll) {
// set all api call params
}
if ($this->updateA) {
// set api call param
}
if ($this->updateB) {
// set api call param
}
// Code here...
}
}
。
答案 0 :(得分:1)
您的代码没有错,应该可以正常工作,但它确实感觉有点奇怪...我认为以下任何一种方法都比您的代码更清晰,更灵活。我相信会有很多其他选项完全有效,这些只是一些想法......
正如在评论中向您建议的那样,我认为正常的方法实际上只是将参数添加到update()
方法......
class Updater
{
public function update($all = true, $a = false, $b = false)
{
// Code...
}
}
然而,在您的示例中,选项似乎是互斥的(2个选项的任意组合是多余的),因此您只需一个参数即可完美地完成任务!
class Updater
{
const UPDATE_ALL = 'all';
const UPDATE_A = 'a';
const UPDATE_B = 'b';
public function update($updateMode = self::UPDATE_ALL)
{
// Code...
}
}
如果您的示例不现实,并且您有一个具有许多不相互排斥的选项的场景,我会使用类似于命令模式的东西,其中负责定义操作选项的类是不同的来自执行操作的类......
class Updater
{
public function update(UpdateCommand $command)
{
// Code...
}
}
class UpdateCommand
{
public $paramA = false;
public $paramB = false;
// ...
public $paramZ = false;
}
或者您也可以使用流畅的界面。虽然这有点难以测试......
class Updater
{
private $paramA = false;
private $paramB = false;
// ...
private $paramZ = false;
public function withA()
{
$this->paramA = true;
return $this;
}
public function withB()
{
$this->paramB = true;
return $this;
}
// ...
public function withZ()
{
$this->paramZ = true;
return $this;
}
public function run()
{
// Code...
}
}