如何将函数传递给php中的类

时间:2012-12-30 07:21:51

标签: php class callback

我有一个基于一些事情生成数据的类。我想从外部格式化这些数据。所以我试图将一个函数传递给类,以便格式化该数据。我看了很多例子,但看起来这是独一无二的。

任何人都可以知道如何做到这一点?以下代码给出了错误。

<?php
class someClass { 
    var $outsideFunc; // placeholder for function to be defined from outside
    var $somevar='Me'; // generated text 
    function echoarg($abc){ 
        $outsideFunc=$this->outsideFunc; // bring the outside function in
        call_user_func($outsideFunc,$abc); // execute outside function on text
        echo $abc;
    }

}

function outsidefunc($param){ // define custom function
    $param='I am '.$param;
}

$someClass=new someClass();
$someClass -> outsideFunc = 'outsideFunc'; // send custom function into Class
$someClass -> echoarg($someClass->somevar);

4 个答案:

答案 0 :(得分:1)

为什么不将你的函数作为参数传递?

<?php
class someClass {
  public $somevar="Me";
  public function echoarg($abc,$cb=null) {
    if( $cb) $cb($abc);
    echo $abc;
  }
}

$someClass = new someClass();
$someClass->echoarg($someClass->somevar,function(&$a) {$a = "I am ".$a;});

答案 1 :(得分:1)

$someClass -> outsidefunc = 'outsidefunc';

在PHP中,函数名称不区分大小写,但对象属性名称是。您需要$someClass->outsideFunc,而不是$someClass->outsidefunc

请注意,良好的OOP设计实践需要使用getter and setter methods而不是直接从外部代码访问属性。另请注意,PHP 5.3引入了对anonymous functions的支持。


  

呀。你是对的。现在没有错误。但它也不起作用。

默认情况下,PHP不会pass arguments by reference; outsidefunc()实际上并没有做任何有用的事情。如果您希望它将调用者中的$ param设置为其他内容,并且不想只返回新值,则可以将函数签名更改为如下所示:

function outsidefunc(&$param) {

您还需要更改调用该函数的方式,如call_user_func() does not allow you to pass arguments by reference。这两种方式都应该有效:

$outsideFunc($abc);
call_user_func_array($outsideFunc, array(&$abc));

答案 2 :(得分:0)

我不确定你究竟在寻找什么,但我得到的是,你想在一个可以通过以下方式实现的功能中传递对象 PHP中的Type Hinting

class MyClass {
    public $var = 'Hello World';
}

function myFunction(MyClass $foo) {
    echo $foo->var;
}
$myclass = new MyClass;
myFunction($myclass);

答案 3 :(得分:0)

OP,或许关闭是你正在寻找的? 它并没有完全满足您的要求(实际上将函数添加到类中),但可以添加到类变量中并像任何普通的匿名函数一样执行。

$myClass->addFunc(function($arg) { return 'test: ' . $arg });
$myClass->execFunc(0);

class myClass {
    protected $funcs;
    public function addFunc(closure $func) {
        $this->funcs[] = $func;
    }

    public function execFunc($index) { $this->funcs[$index](); } // obviously, do some checking here first.
}