【问题标题】:How to use an object method as a callback function如何使用对象方法作为回调函数
【发布时间】:2010-07-28 07:29:52
【问题描述】:

我在单例类中有以下方法

private function encode($inp)
{
    if (is_array($inp) {
        return array_map('$this->encode', $inp);
    } else if is_scalar($inp) {
        return str_replace('%7E', rawurlencode($inp));
    } else {
        return '';
    }
}

这可以作为普通函数正常工作

function encode($inp)
{
    if (is_array($inp) {
        return array_map('encode', $inp);
    } else if is_scalar($inp) {
        return str_replace('%7E', rawurlencode($inp));
    } else {
        return '';
    }
}

在类中使用时出现以下错误:

PHP 警告:array_map():第一个 参数,'$this->rfc_encode',应该 为 NULL 或有效的回调

请有人帮我解决这个问题。

【问题讨论】:

    标签: php


    【解决方案1】:

    来自PHP Manual on Callbacks

    实例化对象的方法作为数组传递,其中包含索引 0 处的对象和索引 1 处的方法名称。

    所以试试

    return array_map(array($this, 'encode'), $inp);
    

    【讨论】:

    • 另外,方法encode必须是public
    • @Dejv 实际上,我已经使用 私有类方法 对其进行了测试,并且它也可以工作。我正在使用 PHP 7.0.13。
    • 如果自定义函数需要 2 个参数怎么办
    • @MuhammadOmerAslam 在 array_map 的情况下,参数列表是可变的
    【解决方案2】:

    $this->encode 释放单个代码。

    > private function encode($inp) {
    >     if (is_array($inp) {
    >         return array_map($this->encode, $inp);
    >     } else if is_scalar($inp) {
    >         return str_replace('%7E', rawurlencode($inp));
    >     } else {
    >         return '';
    >     } }
    

    希望能解决问题。

    【讨论】:

    • $this->encode 没有价值。 PHP 中没有真正的函数指针,因此这不是用于回调的有效 PHP。只有当你有类似$this->encode = array(&$this, 'encode'); 的东西时它才会起作用,这只是让这个特定代码工作的一个技巧。
    • 非常感谢 Chao 和 Fero 的帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-04-19
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    相关资源
    最近更新 更多