将类中的常规函数声明为方法的任何方式


Any way to declare a regular function within a class as a method?

我有一个场景,我试图合并几个人的PHP工作,有些是面向对象的,有些不是。我想把函数的库文件拉到一个类中,并使这些函数可用于引用类的其他文件。我知道我可以直接调用库函数,但是这样我就必须更新所有的依赖文件来做同样的事情。例子:

class do_something {
  function test_state() {
    ...
  }
  if ($this->test_state($var)) {
    ...
  }
}

其中testrongtate()与库文件中的同名函数相同,从而产生冗余代码以保持同步。可以改成:

class do_something {
  if (test_state($var)) {
    ...
  }
}

但是这会产生前面提到的$this->testrongtate()对依赖于类的文件不可用的问题。我希望能够做到的是:

class do_something {
  public function test_state() = test_state();
  if ($this->test_state($var)) {
    ...
  }
}

显然,这是我试图做的一个非常粗略和不正确的例子…在OOP中是否有任何方法可以进行这种重新赋值,使与函数同名的方法在类中可用?

您可以使用变通方法来模拟这一点。实际上,您通常希望这种方法将闭包绑定到PHP中的对象。它利用PHP中神奇的__call方法将方法调用重定向到普通函数(注意:没有可用的$this)。

 class do_something {
     function __call($func, $args) {
         if (isset($this->$func) && is_callable($this->$func)) {
             return call_user_func_array($this->$func, $args);
         }
     }
 }

然后你可以通过一个简单的赋值来"注册"你想要允许的函数(或闭包):

 $do_something->function_name = "global_function_name";
 $do_something->or_even = array("other_class", "method");

但是,这并不能使它们成为合适的方法。

您将创建您的基本实用程序类,然后extend它。有关详细信息,请参阅PHP的继承手册条目。我并不是说这是针对你的具体情况的最佳解决方案,但我认为它回答了你想要解决的问题。

你的要求是不可能直接实现的,但可以通过一个快速(可怕的)hack来伪造:

class do_something {
  public function test_state($param) {
    return test_state($param);
  }
...
  $this->test_state($param);
...
}

祝你重构顺利!