【问题标题】:How to Pass a function to a class in php如何将函数传递给php中的类
【发布时间】:2012-12-31 01:18:40
【问题描述】:

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

谁能给出如何做到这一点的想法?下面的代码会报错。

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

【问题讨论】:

  • 从结构上讲,您最好将整个对象传递给您的方法。然后该方法可以调用它需要的对象方法来完成它需要的东西。它被称为装饰器模式,在这里很好地介绍了:stackoverflow.com/questions/3235382/…

标签: php class callback


【解决方案1】:
$someClass -> outsidefunc = 'outsidefunc';

在 PHP 中,函数名不区分大小写,但对象属性名是。你需要$someClass-&gt;outsideFunc,而不是$someClass-&gt;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));

【讨论】:

  • 是的。你说的对。现在没有错误。但它也不起作用。
  • @user139301:它“不起作用”,因为outsidefunc 什么都不做
  • @user139301:我在回答中添加了对 DCoder 评论的解释。
  • 非常感谢。你一直非常善良和耐心。它确实有效。
【解决方案2】:

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

<?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;});

【讨论】:

    【解决方案3】:

    我不确定你到底在找什么,但我得到的是,你想在一个函数中传递对象,这可以通过 Type Hinting 在 PHP 中。

    class MyClass {
        public $var = 'Hello World';
    }
    
    function myFunction(MyClass $foo) {
        echo $foo->var;
    }
    $myclass = new MyClass;
    myFunction($myclass);
    

    【讨论】:

    • 是的。类型提示应该可以解决问题,但是对于函数类型提示是“可调用的”,PHP 5.3 不支持可调用类型。
    【解决方案4】:

    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.
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 2013-07-05
      • 2011-11-16
      相关资源
      最近更新 更多