PHP Object如何从另一个对象调用一个对象

时间:2013-09-16 12:07:41

标签: php oop

我有一个对象可以回收有关该网站的详细信息。基本上是名称地址等。它退回的领域之一是IDCounty。见下文。然后我想将它提供给另一个对象的新实例,它会自动给我一个县名。这就是我所拥有的

所以我的系统对象

   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   
       }

正如您所见,此对象正在调用另一个县并将$ County设置为$ this-> County。我的详细信息在

之下
  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;

我在echo $ SiteDetails->县的错误报告中收到错误;这说    “可捕获的致命错误:类县的对象无法转换为字符串”

在谷歌搜索此错误后,我看到系统类无法转换从县级获取县名并将其转换为$ this->县

不幸的是,我不知道如何修复它。我以为我可以在实例化时从函数返回一个值,但似乎我错了。请帮忙。多谢你们。

2 个答案:

答案 0 :(得分:1)

无论构造函数可能包含哪些return语句,它们都将被忽略。根据定义,构造函数将返回给定类的新实例。阅读the docs。虽然__construct()的签名显示了void的返回类型,但您应该将其视为void*(无效指针)。这意味着,它返回对新创建的对象的引用。你应该用如下的soimething替换return语句:

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

并且,由于许多其他魔术方法,您可以实现另一个魔术方法以将类用作字符串:the magic __toString method

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

与以往一样,请阅读其他一些魔术方法的文档。它们非常有用,但我必须补充说,它们可能很慢。你可以同样好地实现 getter

//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,那么为什么%d格式为sprintf? 还有很多其他东西需要在这里工作(例如:创建一个没有params的新Database实例?真的吗?为什么不使用DB对象进行查询?为什么要使用全局函数?为什么不使用准备陈述?...请在OOP上阅读更多内容

答案 1 :(得分:0)

在County类中实现方法__toString()。 例如:

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