2013-09-16 265 views
0

我有一個對象,它回退有關該網站的詳細信息。基本上是名稱地址等。其中一個字段是IDCounty。見下文。然後,我想將其饋送到另一個對象的新實例中,並自動爲我提供縣名。這裏是我有PHP對象如何從另一個對象調用對象

所以我的系統對象

class System{ 

private $db; 
public $Ad1; 
public $Ad2; 
public $County; 
public $IDSystem; 

    //connect to database 
    public function __construct($IDSystem ='1') { 
     $this->db = new Database(); 
     $this->IDSystem = $IDSystem; 
    } 
      //get address 
    public function ContactInfo() { 
      $Query = sprintf("SELECT BSAd1, BSAd2, IDCounty FROM BusinessSettings WHERE IDBusinessSettings = %s", 
     GetSQLValueString($this->IDSystem, "int")); 

       $Query = $this->db->query($Query); 
       $Result = $this->db->fetch_assoc($Query); 

         $this->Ad1 = $Result['BSAd1']; 
         $this->Ad2 = $Result['BSAd2']; 

         $County = new County($Result['IDCounty']); 
         $this->County = $County; 
    } 
    //end address 
     } 

正如你可以看到這個對象調用另一個縣及縣$設置被$ this->縣。我的詳細信息爲低於

class County { 
public $IDCounty; 
private $db; 

    public function __construct($IDCounty) { 

     $this->db = new Database();   
     $this->IDCounty = $IDCounty; 

       $Query = sprintf("SELECT CountyName FROM County WHERE IDCounty = %s",                    GetSQLValueString($this->IDCounty, "int")); 

       $Query = $this->db->query($Query); 
       $County = $this->db->fetch_assoc($Query); 

       return $County['CountyName']; 


    } 

}

當我打電話給我叫它像這樣

$SiteDetails = new System(); 

     $SiteDetails->ContactInfo(); 

     echo $SiteDetails->Ad1; 
     echo $SiteDetails->County; 

即時得到從錯誤回聲報告一個錯誤的對象$ SiteDetails->縣;其中說 「可捕捉的致命錯誤:類縣的對象無法轉換爲字符串」

谷歌搜索後此錯誤我看到系統類遇到麻煩轉換從郡縣類獲取縣名並將其轉換爲$ this - >縣

不幸的是我不知道如何解決它。我想我可以在實例化時從函數返回值,但似乎我錯了。請幫忙。多謝你們。

+0

'Country'是'Object'而不是'string',請看'__toString()'魔術方法。在'Country'對象中實現它。 –

回答

0

在縣級實施方法__toString()。 例子:

public function __toString() 
{ 
    return $this->foo; 
} 
1

無論return語句的構造可能包含,它們將被忽略。根據定義,構造函數將返回給定類的新實例。閱讀the docs。儘管__construct()的簽名顯示返回類型void,但您應該將其視爲void*(void指針)。這意味着它會返回對新創建對象的引用。你應該soimething像更換return語句:

$this->stringValue = $County['CountyName']; 

而且,因爲許多其他神奇的方法,可以實現另外一個使用一個類的字符串:the magic __toString method

public function __toString() 
{ 
    return (string) $this->stringValue;//the cast is optional 
} 

由於不管怎樣,閱讀關於其他一些魔術方法的文檔。它們非常有用,但我必須補充說,它們可能會很慢。你可以,同樣實現吸氣

//assuming this is in your constructor: 
$this->stringValue = $County['CountyName']; 

public function getContyName($default = '') 
{ 
    if (!$this->stringValue) 
    { 
     return $default; 
    } 
    return $this->stringValue; 
} 

現在,多虧了$default說法,我可以這樣做:

$county = new County();//not passing any values 
echo $county->getCountyName('unknown');//will echo unknown 
echo $county->getCountyName();//echoes empty string, because that's the default value of $default... 
$county2 = new County('Foobar'); 
echo $county2->getCountyName('unknown');//echoes Foobar, county is known... 

除此之外,您sprintf呼叫賺不了多少感覺到我。使用的格式是%s,所以我希望你通過字符串。事實上,你傳遞的是GetSQLValueString($this->IDCounty, "int"),這是一個調用全局函數的返回值(可怕的代碼異味BTW)。既然你傳遞的是'int'作爲參數,我期望返回值是一個int,那麼爲什麼不在你的sprintf格式?
有許多很多其他的東西需要在這裏工作(例如:創建一個新的Database沒有參數的實例嗎?爲什麼不使用DB對象進行查詢?爲什麼要使用全局函數?爲什麼不使用預處理語句? ...請詳細閱讀OOP

相關問題