4

我有一堂课:

class demo {

      function newDemo(){
          $v=$this->checkDemo;
          $v('hello'); // not working this reference, or how to do this?
      }

      function checkDemo($a){
          ...
          return $a;
      }
           }

那么,如何在类中引用 checkDemo 函数方法呢?

4

8 回答 8

8

要使对象方法成为可调用对象,您需要一个数组。索引 0 是实例,索引 1 是方法的名称:

$v = Array($this,"checkDemo");
$v("hello");

编辑:请注意,此功能仅适用于 PHP 5.4

于 2013-03-06T14:54:35.823 回答
5

你像这样分配它:

$v = 'checkDemo';
$this->$v('hello');

查看文档以获取更多示例。

虽然我不完全确定你为什么要这样做,但就是这样。

于 2013-03-06T14:54:57.057 回答
1

PHP 手册

<?php
class Foo
{
    function Variable()
    {
        $name = 'Bar';
        $this->$name(); // This calls the Bar() method
    }

    function Bar()
    {
        echo "This is Bar";
    }
}

$foo = new Foo();
$funcname = "Variable";
$foo->$funcname();  // This calls $foo->Variable()

?>
于 2013-03-06T14:56:37.750 回答
0

如果您只是:

class demo {

      function newDemo(){
          echo $this->checkDemo('hello');
      }

      function checkDemo($a){
          return $a;
      }
}

$demo = new demo;

$demo->newDemo(); // directly outputs "hello", either to the browser or to the CLI
于 2013-03-06T14:53:26.793 回答
0

直接调用 $this->checkDemo($data) 就没用了

但是....你可以这样做

$v=function($text){ return $this->checkDemo($text); };
echo $v('hello');
于 2013-03-06T14:56:59.057 回答
0

只需调用call_user_func函数并传递数组,将对象引用和方法名称作为第一个参数:

class demo {

      function newDemo(){
          return call_user_func( array( $this, 'checkDemo' ), 'hello' );
      }

      function checkDemo( $a ){
          ...
          return $a;
      }
}
于 2013-03-06T15:00:43.257 回答
0

这样做的一种方法:

<?php
class HelloWorld {

    public function sayHelloTo($name) {
        return 'Hello ' . $name;
    }

public function test () {
   $reflectionMethod = new ReflectionMethod(__CLASS__, 'sayHelloTo');
   echo $reflectionMethod->invoke($this, 'Mike');

    }

}

$hello = new HelloWorld();
$hello->test();

http://www.php.net/manual/en/reflectionmethod.invoke.php

于 2013-03-06T15:03:20.957 回答
-2

调用函数时必须添加参数:

$v = $this->checkDemo('hello');
于 2013-03-06T14:54:05.607 回答