2013-09-16 217 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

相关问题