如何正确使用类的属性作为其方法的参数

时间:2017-02-05 10:16:27

标签: php oop

我想在同一个类的公共方法调用的类中使用私有方法。

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... } }

1 个答案:

答案 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;
}
  • Fluent界面

或者您也可以使用流畅的界面。虽然这有点难以测试......

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...
    }
}