[英]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.