有什么方法可以将类中的常规函数​​声明为方法吗?

时间:2011-11-03 17:57:56

标签: php function methods

我有一个场景,我正在尝试合并几个人的PHP工作,其中一些是OOP而另一些则不是。我想将函数的库文件拉到一个类中,并使这些函数可用于引用该类的其他文件。我知道我可以直接调用库函数,但是我必须更新所有相关文件来做同样的事情。例如:

class do_something {
  function test_state() {
    ...
  }

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

其中test_state()与库文件中的同名函数相同,使冗余代码保持同步。这可以改为:

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

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

class do_something {
  public function test_state() = test_state();

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

显然,这是我正在尝试做的一个非常粗略和错误的例子......在OOP中是否有任何方式进行这种重新分配,使得该方法与该类中可用的函数同名?

3 个答案:

答案 0 :(得分:2)

您可以使用变通方法来模拟此问题。实际上,您经常希望这种方法可以在PHP中将对象关闭到对象上。它利用PHP中的魔术__call方法将方法调用重定向到普通函数(注意:没有$这个可用)。

 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");

但同样,这并没有使它们成为正确的方法。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

你所要求的是不可能的直接,但可以用快速(可怕的)黑客伪造:

class do_something {
  public function test_state($param) {
    return test_state($param);
  }

...

  $this->test_state($param);
...

}

祝你重构好运!