小php面向对象的问题

时间:2011-06-07 05:10:47

标签: php oop class mysqli

我有问题了解我的继承有什么问题。我只是无法调用父级的大部分功能。下面是我被卡住的功能。

class MySQLi_DB  extends mysqli {
    private static $_instance = null;
    private function __construct($db="test",$host="localhost", $user="root", $pass="") 
    {

        parent::__construct($host, $user, $pass, $db);
        if (mysqli_connect_error()) {
            die('Connect Error (' . mysqli_connect_errno() . ') '
                    . mysqli_connect_error());
        }
    }
 static public function getDB()
    {
        if(self::$_instance == null)
        {
            self::$_instance = new MySQLi_DB();
        }
        return self::$_instance;

    }


public function insert($table,$data)
        {
           $sql = $this->getQuery($table,$data);
           print $sql;
        }

        public function getQuery($table, $inserts) 
        {
            $lambda = function($value){
                return $this->real_escape_string($value);
            };

            $values = array_map($lambda,$inserts);
            $keys = array_keys($inserts);

            return 'INSERT INTO `'.$table.'` (`'.implode('`,`', $keys).'`) VALUES (\''.implode('\',\'', $values).'\')';
        }

我在调用real_escape_string()函数时遇到问题。我试过使用$ this-> real_escape_string(),但我只需要看到这个错误

  

致命错误:不在时使用$ this   对象上下文   D:\ wamp \ www \ Driver \ MySQLi_DB.php on   第49行

ok可能是lambda函数的限制,但我通过声明array_map的回调来尝试它,这也不允许我调用real_escape_string。

我正在调用以下功能。

require_once 'MySQLi_DB.php';
        $db = MySQLi_DB::getDB();

        $insert_data = array("cmsId"=>444,"pageName"=>"New Insert");
        $db->insert("cms",$insert_data);

请指出我做错的地方,以及最好的方法。谢谢

2 个答案:

答案 0 :(得分:3)

$lambda = function($value){
    return $this->real_escape_string($value);
};

在你的'lambda'函数中,上下文不是你的对象,所以$ this不可用。

作为替代方案,您可以使用,例如:

$values = array_map('mysql_real_escape_string', $inserts)

甚至尝试:

$values = array_map( array($this, 'real_escape_string'), $inserts)

这是未经测试但*应该*工作......

答案 1 :(得分:2)

您不能将$ this关键字用于lamba函数,因为函数的范围不会扩展到其方法包含lambda的对象

尝试不同的方法:

 public function getQuery($table, $inserts) 
 {
      $values = array_map(array($this, 'real_escape_string'),$inserts);
      $keys = array_keys($inserts);

      return sprintf('INSERT INTO %s (`%s`) VALUES ("%s")',
           $table,
           implode('`,`', $keys),
           implode('","', $values)
      );
    }

<强>附录

如果 real_escape_string 不是您的对象的方法,而是标准的msqli方法,则应更改该行

 $values = array_map(array($this, 'real_escape_string'),$inserts);

 $values = array_map(array(self::$_instance, 'real_escape_string'),$inserts);

调用方法real_escape string。

数组array(self::$_instance, 'real_escape_string')callback array,当您想要调用对象方法时使用它。

php手册说明

实例化对象的方法作为数组传递,该数组包含索引为0的对象和索引为1的方法名

和self :: $ _ instance是要调用的mysqli实例