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



我有一个对象可以拉回有关网站的详细信息。 基本上是姓名地址等。 它拉回的字段之一是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;

我从回声$SiteDetails->县的错误报告中收到错误; "可捕获的致命错误:无法将类 County 的对象转换为字符串"

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

不幸的是,我不确定如何解决它。 我以为我可以在实例化时从函数返回一个值,但似乎我错了。 请帮忙。谢谢大家。

无论构造函数可能包含什么return语句,它们都将被忽略。根据定义,构造函数将返回给定类的新实例。阅读文档。虽然__construct()的签名显示返回类型的void,但你应该把它看作是void*(一个空指针)。这意味着,它返回对新创建对象的引用。您应该将 return 语句替换为类似以下内容:

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

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

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,那么为什么不以您的sprintf格式%d呢?
这里还有很多很多其他的事情需要处理(例如:创建一个没有参数的新Database实例?真的吗?为什么不使用数据库对象进行查询?为什么要使用全局函数?为什么不使用预准备语句?...请在 OOP 上阅读更多内容

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

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

最新更新