如何在函数内部使用类的方法(PHP)?

时间:2009-08-26 21:34:39

标签: php oop function

我正在尝试使用新的PHP mysqli扩展。我有一个函数(safe())递归使用mysql_real_escape_string来使字符串安全。如何在此函数中使用我的mysqli连接来调用mysqli :: escape_string()函数?

示例:

$db = new mysqli($host,$user,$password,$database_name);


function safe ($data) {
  if(!is_array($data)) {
     if(!get_magic_quotes_gpc()) {
       $data = **mysqli::escape_string($data)**
       return $data;
    }
  } else {
    return array_map('safe',$data);
  }
}

我在safe()里面有 mysqli :: escape_string()我怎么称呼它?在函数之外它将是$ db-> escape_string()但是我找不到一种方法来调用它。我已经尝试将$ db传递给函数,使$ db全局等。另一种方法是使用过程mysqli_escape_string()但是需要将mysqli链接资源显式传递给它,但我找不到办法访问它。

5 个答案:

答案 0 :(得分:6)

将您的数据库对象传递给函数。

 function safe ($data, $db) {
  if(!is_array($data)) {
     if(!get_magic_quotes_gpc()) {
       $data = $db->escape_string($data);
    }
  } else {
    return array_map('safe',$data);
  }
}

答案 1 :(得分:1)

我会扩展mysqli类:

class mysqliA extends mysqli{
    function escape_string($data){
        if(!is_array($data)) {
            if(!get_magic_quotes_gpc()) {
                $data = $this->escape_string($data);
                return $data;
            }
        } else {
            return $this->escape_string($data);
        }
    }
}

这样你只需要打电话

$db = new mysqliA();
$db->escape_string($data);

答案 2 :(得分:0)

我不想鼓励你使用全局变量,但如果你想从安全函数访问$db,你必须将global $db;放在函数的开头。

导致:

$db = new mysqli($host,$user,$password,$database_name);

function safe ($data) {

  global $db;

  if(!is_array($data)) {
     if(!get_magic_quotes_gpc()) {
       $data = $db->escape_string($data);
       return $data;
    }
  } else {
    return array_map('safe',$data);
  }
}

请注意全局变量被视为邪恶,不应使用。

那你应该怎么用?那么,对于你的用例,registry pattern(以后记住这一点)可能最适合。但是为了让您开始使用面向对象的编程,您现在应该尝试以下方法:

class myClass {

    protected $db;

    public function __construct() {
        $this->db = new mysqli($host,$user,$password,$database_name);
    }


    function safe ($data) {

      if(!is_array($data)) {
         if(!get_magic_quotes_gpc()) {
           $data = $this->db->escape_string($data);
           return $data;
        }
      } else {
        return array_map('safe',$data);
      }
    }
}

我建议您阅读有关面向对象编程的更多信息,因为它可以帮助您编写更好,更可重用的代码。

希望我能提供帮助。

答案 3 :(得分:0)

如果我扩展我得到的课程:

Notice: Undefined variable: db in *file path* on line 22

Fatal error: Call to a member function escape_string() on a non-object in *file path* on line 22

第22行是函数的位置

如果我传递mysqli对象,我得到:

Warning: Missing argument 2 for safe() in *file path* on line 17

Notice: Undefined variable: db in *file path* on line 22

Fatal error: Call to a member function escape_string() on a non-object in *file path* on line 22

我的函数调用是:

                    $item[$form] = safe($item[$form],$db);

所以显然没有遗漏第二个变种

我无法围绕该函数构建一个类并初始化一个新的mysqli连接(这似乎无论如何都是低效率的高度),因为我必须使safe()成为一个静态函数,使其成为一个有效的回调函数。 array_map()并没有语法似乎适用于这一行:

$data = $this->db->escape_string($data);

尝试了

$data = $this->db->escape_string($data);
$data = self::db::escape_string($data);
$data = self::db->escape_string($data);

答案 4 :(得分:0)

在db类文件中创建一个公共函数

function escape($string)
    {
        return $this->connection->real_escape_string($string);

    }

你可以像这样使用它

function safe()

    {
            $id=$this->mysqli->escape($this->id);

            $status=$this->mysqli->escape($this->status);

            $shortcode=$this->mysqli->escape($this->shortcode);



     }

功能的使用取决于你将如何使用它