Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP类:每次调用方法时都调用特定函数_Php_Oop - Fatal编程技术网

PHP类:每次调用方法时都调用特定函数

PHP类:每次调用方法时都调用特定函数,php,oop,Php,Oop,我想在PHP中每次调用方法时都调用一个函数 例如: $a = new a(); $a->function1(); 这将进行两次函数调用:basicFunction()然后function1() 该类的任何后续方法调用也是如此。这在面向对象的PHP中可能吗?在PHP中没有类似的东西。但是,您可以使用以下命令模拟此行为: 用法: $obj = new YourClass(); $obj->someFunction(); // this calls baseSomeFunction an

我想在PHP中每次调用方法时都调用一个函数

例如:

$a = new a();
$a->function1();
这将进行两次函数调用:
basicFunction()
然后
function1()


该类的任何后续方法调用也是如此。这在面向对象的PHP中可能吗?

在PHP中没有类似的东西。但是,您可以使用以下命令模拟此行为:

用法:

$obj = new YourClass();
$obj->someFunction(); // this calls baseSomeFunction and executes the code
                      // in the __call() method

在“magic”方法前面加上
base
这样的前缀可以确保没有人可以调用您的私有函数,并将此访问权限限制为只访问已加前缀的函数。您应该更改此前缀以满足您的需要。

当然可以,但它会带来一些开销。magic方法调用将处理不存在的方法,因此您可以执行以下操作:

class myClass {
    public function __call($name, $arguments) {

        $this->doSomething();
        $this->$name($arguments);
    }

    private function calledmethod() { ... }
然后你会打电话:

$class->calledmethod();
由于方法
calledmethod
不是公共的,因此会调用\u调用,然后运行“base”方法,然后
calledmethod

我不得不问,你为什么要这样做?如果你描述你试图解决的实际问题,可能会有一个更优雅的解决方案。

你必须使用 例如:

class Foo{
    public function __call($method_name, $arguments){
        $this->basicFunction();
        return call_user_func_array(array($this, $method_name), $arguments);
    }


    private function basicFunction(){}
    protected function function1(){}
}

使用
\u调用
如下神奇功能:

class a {
  private function function1() { ... }
  public function __call($name, $args) {
       /* do stuff */;
       return call_user_func_array(array($this, $name), $args);
  }
}

但是请注意,如果从类内部调用function1(),这将不起作用。然后必须重命名function1(),并使用不同的名称调用它。其思想是,只有当函数不存在或无法看到时才会调用
\u call

最简单的方法是只调用该方法

public function function1 {
    $this->basicFunction();
    // …
}
你可能想要的是这样的东西。然而,这在PHP中并不常见。最显著的用途是在

对于其他可用于PHP OOP的更常见方法,请查看

这将允许您在运行时添加任意行为和控制流



(meta)顺便问一下,我们真的需要四个答案来建议使用
\u call
?我建议各老年退休金计划审查各自的答案,找出细微的差异,并就哪一个答案最好达成一致。其他三个可以撤回他们的答案。

我认为函数名中的
-
无效。这将不会返回函数输出。@难以捉摸:修复,最近js太多,谢谢@cypher:OP从来没有说过任何关于返回值的事情。我想说的是,返回原始被调用函数的值几乎是隐含的,因为他没有说他希望他的函数的任何方法都不会返回值。@Erik:
-
在JavaScript的变量名中是允许的吗?我不知道。我知道你可以像这样使用每个字符串:
window['some-function-name']()
,但那会有点痛苦,对吧?如果function1()是公共的,就不会使用\uu调用。我现在可以调用每个私有方法。我可以调用这个类的每个私有函数。@elvasive-如果你对此感到困扰,请在\uu调用中加入一些条件。这只是一个建议,而不是生产代码:)不清楚您是否希望在调用
function1
时调用
basicFunction
,或者调用ctor或调用任何函数时调用
basicFunction
。另外,
basicFunction
a
类的一部分吗?请澄清这个问题,也许可以添加一个具体的例子来说明你需要它做什么。
public function function1 {
    $this->basicFunction();
    // …
}