我有一个对象可以回收有关该网站的详细信息。基本上是名称地址等。它退回的领域之一是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->县
不幸的是,我不知道如何修复它。我以为我可以在实例化时从函数返回一个值,但似乎我错了。请帮忙。多谢你们。
答案 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;
}