0

我有两个对象:

1.

$mysqli = @new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

var_dump是:

object(mysqli)#6 (0) {
}

2.

$conn = new Classes_dbFactory("MySQLi", DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

这个 mysqli 连接var_dump的包装器为:

object(Classes_dbFactory)#7 (1) {
  ["_connection:protected"]=>
  object(mysqli)#8 (0) {
  }
}

如果我这样做:

$city = $mysqli->real_escape_string($city);

有用。但是,如果我这样做:

$city = $conn->real_escape_string($city);

我明白了Call to undefined method Classes_dbFactory::real_escape_string()

有没有办法使用object(mysqli)里面的 whichobject(Classes_dbFactory)以便可以使用现有的本机 mysqli 方法?

4

4 回答 4

1

你检查过Classes_dbFactory类里面有什么方法吗?也许有一个返回数据库对象?

那么你的代码可能看起来像这样:

$conn = new Classes_dbFactory("MySQLi", DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); $database = $conn->getDatabaseObject() // totally made up..

于 2013-05-16T17:12:04.347 回答
1

Is there a way to use the object(mysqli) which is inside the object(Classes_dbFactory) so that the existing native mysqli method can be used?

就在这里。但是,因为您已经声明了_connection属性,所以您protected需要添加一个方法来检索其实例。

//...Classes_dbFactory
function getConnection()
{
  return $this->_connection;
}

然后在客户端代码中,您可以使用:

$db = new Classes_dbFactory();
$conn = $db->getConnection();
$city = $conn->real_escape_string($city);

你甚至可以添加这个:

function real_escape_string($string)
{
  return $this->_connection->real_escape_string($string);
}
于 2013-05-16T17:19:43.890 回答
1

您可以对此感到懒惰并将未定义的方法代理到 mysqli 对象,是的...

class Classes_dbFactory {

   protected $connection;

   /* constructor not shown for simplicity */

   public function __call($method, $args) {
      $callable = array($this->connection, $method);
      if(is_callable($callable) {
         return call_user_func_array($callable, $args);
      }
  }
}

但是,如果您真的打算支持多个数据库和/或扩展,这可能会让人感到困惑,因为您的“连接”可能有一组完全不同的方法。我会让工厂返回一种特定类型的数据库对象,该对象旨在包装单个扩展,如 mysqli、PDO、oci 等。

正如其他人所建议的那样,您可能只是想getConnection访问真正的连接对象以调用其方法。您当然可以直接在类上为常用方法添加一些代理。但是您将再次遇到多个数据库/驱动程序支持和 API 差异的问题。

于 2013-05-16T17:13:41.577 回答
1

ifClasses_dbFactory是一个直接向上的包装器,它应该将所有未定义的函数调用代理到受保护的 _connection 属性,那么您可以将其添加到Classes_dbFactory

public function __call($method, $args){
     return call_user_function_array(array($this->_connection, $method), $args);
}

这会将所有未在 Classes_dbFactory 上实现的方法调用代理到受保护的属性。

于 2013-05-16T17:17:00.607 回答