如何在类内部实现回调方法(PHP)

发布于 2024-08-27 15:55:43 字数 380 浏览 5 评论 0原文

我需要在另一个方法内的数组上使用类回调方法(回调函数属于该类)。

class Database {

      public function escape_string_for_db($string){
             return mysql_real_escape_string($string);
      }

      public function escape_all_array($array){
             return array_map($array,"$this->escape_string_for_db");
      }
}

这是正确的做法吗? (我的意思是,就传递给 array_map 的第二个参数而言)

I need to use a class callback method on an array inside another method (the callback function belongs to the class).

class Database {

      public function escape_string_for_db($string){
             return mysql_real_escape_string($string);
      }

      public function escape_all_array($array){
             return array_map($array,"$this->escape_string_for_db");
      }
}

Is this the right way to go about that? (I mean, in terms of the second parameter passed to array_map)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

我们的影子 2024-09-03 15:55:43

我认为您不想array_filter,但是< a href="https://www.php.net/manual/en/function.array-map.php" rel="nofollow noreferrer">array_map

return array_map(array($this, 'escape_string_for_db'), $array);

但话又说回来,你也可以这样做

return array_map('mysql_real_escape_string', $array);

I don't think you want to array_filter, but array_map

return array_map(array($this, 'escape_string_for_db'), $array);

but then again, you can just as well do

return array_map('mysql_real_escape_string', $array);
一片旧的回忆 2024-09-03 15:55:43

array_filter 删除不满足谓词的元素。你的意思是array_map吗?

return array_map(array($this, "escape_string_for_db"), $array);

array_filter deletes elements which does not satisfy the predicate. Do you mean array_map?

return array_map(array($this, "escape_string_for_db"), $array);
沙与沫 2024-09-03 15:55:43

这应该有效。您可以在同一函数中检查您的参数是字符串还是数组。

class Database {

  public function escape_string_for_db($data)
  {
    if( !is_array( $data ) )
    {
      $data =mysql_real_escape_string($data);   
    }
    else
    {
      //Self call function 
      $data = array_map(array( 'Database ', 'escape_string_for_db' ), $data );
    }
  return $data;
  }

This should work. You can check in the same function weather your parameter is string or array.

class Database {

  public function escape_string_for_db($data)
  {
    if( !is_array( $data ) )
    {
      $data =mysql_real_escape_string($data);   
    }
    else
    {
      //Self call function 
      $data = array_map(array( 'Database ', 'escape_string_for_db' ), $data );
    }
  return $data;
  }
玩世 2024-09-03 15:55:43

最简单的解决方案是将方法作为回调传递 - 请参阅 http://www.php.net/manual/en/language.pseudo-types.php#language.types.callback

或者,编写一个包装函数:

function wrap_callback($target, $use_obj=false)
{
  static $obj;
  if ($use_obj) {
     if (method_exists($target, 'callback')) {
        $obj=$target;
        return true;
     } else {
        trigger_error("callback declared for something with no callback method");
        return false;
     }
  }
  return $obj->callback($target);
}

然后:

class Database {

  public callback($string){
         return mysql_real_escape_string($string);
  }

  public function escape_all_array($array){
         wrap_callback($this, true); // register callback
         return array_filter($array,"wrap_calback");
  }
}

C.

Simplest solution would be to to pass the method as the callback - see http://www.php.net/manual/en/language.pseudo-types.php#language.types.callback

Alternatively, write a wrapper function:

function wrap_callback($target, $use_obj=false)
{
  static $obj;
  if ($use_obj) {
     if (method_exists($target, 'callback')) {
        $obj=$target;
        return true;
     } else {
        trigger_error("callback declared for something with no callback method");
        return false;
     }
  }
  return $obj->callback($target);
}

Then:

class Database {

  public callback($string){
         return mysql_real_escape_string($string);
  }

  public function escape_all_array($array){
         wrap_callback($this, true); // register callback
         return array_filter($array,"wrap_calback");
  }
}

C.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文