0

我有一个对象可以提取有关该站点的详细信息。基本上是名称地址等。它撤回的字段之一是 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->County 的错误报告中得到一个错误;上面写着“可捕获的致命错误:County 类的对象无法转换为字符串”

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

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

4

2 回答 2

1

无论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"),这是对全局函数的调用的返回值(顺便说一句,代码味道很糟糕)。由于您在'int'那里作为参数传递,我希望返回值是一个 int,那么为什么不%d采用您的sprintf格式呢?
这里还有很多很多其他的事情需要处理(例如:创建一个Database没有参数的新实例?真的吗?为什么不使用数据库对象进行查询?为什么使用全局函数?为什么不使用准备好的语句?...请阅读更多关于 OOP 的内容

于 2013-09-16T12:10:06.073 回答
0

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

public function __toString()
{
    return $this->foo;
}
于 2013-09-16T12:09:36.907 回答