簡體   English   中英

PHP OOP使用對象

[英]php OOP using objects

我有兩個對象:

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(Classes_dbFactory)object(mysqli) ,以便可以使用現有的本機mysqli方法?

您是否檢查過Classes_dbFactory類中包含哪些方法? 也許有一個返回數據庫對象的對象?

然后您的代碼可能看起來像這樣:

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

您可能對此很懶,並將未定義的方法代理到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差異的問題。

如果Classes_dbFactory是直接包裝器,應將所有未定義的函數調用代理到受保護的_connection屬性,則可以將其添加到Classes_dbFactory

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

這會將未在Classes_dbFactory上實現的所有方法調用向下代理到protected屬性。

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM