0

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

任何人都可以给出如何做到这一点的想法吗?下面的代码给出了一个错误。

<?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

4 回答 4

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;});
于 2012-12-30T07:28:21.143 回答
1
$someClass -> outsidefunc = 'outsidefunc';

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

请注意,良好的 OOP 设计实践要求使用getter 和 setter 方法,而不是直接从外部代码访问属性。另请注意,PHP 5.3 引入了对匿名函数的支持。


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

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

function outsidefunc(&$param) {

您还需要更改调用函数的方式,因为call_user_func() 不允许您通过引用传递参数。这些方法中的任何一种都应该起作用:

$outsideFunc($abc);
call_user_func_array($outsideFunc, array(&$abc));
于 2012-12-30T07:31:55.857 回答
0

我不确定你到底在找什么,但我得到的是,你想在一个函数中传递对象,这可以通过 PHP 中的类型提示来实现。

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

function myFunction(MyClass $foo) {
    echo $foo->var;
}
$myclass = new MyClass;
myFunction($myclass);
于 2012-12-30T07:29:53.687 回答
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.
}
于 2012-12-30T07:38:25.833 回答