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