我有这个PHP类,其目的是从数据库中获取一些配置数据并存储它以供以后使用:
class GSConfig {
private $configurationData;
private $repository;
public function __construct($pRepository) {
$this->repository = $pRepository;
$this->configurationData = $this->InitializeConfiguration();
}
public function InitializeConfiguration() {
$result = $this->repository->configLoadAll();
if ( $result['data'] ) {
$conf_array = $result['data'];
foreach ( $conf_array as $row) {
$code = strtolower($row ['code']);
$value = strtolower($row ['value']);
//if ($value == "true") $value = (bool)true;
//if ($value == "false") $value = (bool)false;
$this->configurationData[$code] = $value;
}
} else {
$this->configurationData = null;
}
print_r($this->configurationData);
}
public function getConfigValue($key) {
$key = strtolower($key);
if ($this->configurationData != null) {
if( isset($this->configurationData[$key])) {
return $this->configurationData[$key];
}
} else if ($this->configurationData == null) {
// If we reach this code, something went wrong
// (TODO: throw Exception)
echo "<p>Tick</p>";
}
}
}
InitializeConfiguration获取数据并将其作为数组存储在$ configurationData属性中。这正如预期的那样工作,如print_r函数的输出所示。
但是,在初始化之后,如果我尝试从$ configurationData读取任何值,我得到Tick
。不知何故,变量在初始化后变为空。
输出类似于:
print_r output:
Array ( [show_cart] => true [order_mail] => order@shop.de [debug_mode] => true [branch_mode] => true [default_branch] => 1 [agb_file] => agb.txt [kat_order] => k_nr [show_rows] => 5 [product_order] => p_produktnr [cost_per_wu] => 0.66 [message_lang] => eng [free_shipping] => true [free_ship_amt] => 25 [special_price] => true [discounts] => true [cat_show_mode] => all [price_att] => ersatzpreis [mwst_att] => mehrwertsteuer [aktionsp_att] => aktionspreis [katalog_mode] => per_branch )
further output:
Tick
Tick
...
Tick
任何人都知道为什么会这样?顺便说一句,我的PHP版本是5.3.1
答案 0 :(得分:3)
您正在分配InitializeConfiguration()的返回值,但此函数中没有return语句(默认为“return null”)。
答案 1 :(得分:1)
问题是你在构造函数中将InitializeConfiguration
的返回值赋给$this->configurationData
,这将是null。
以下仍然是合理的建议:
强烈怀疑您使用错误的comparison operator。
导致错误永远不要在PHP中这样做:
if ($this->configurationData == null)
在针对null
,false
或0
进行测试时,请始终使用===
检查每个变量的值和类型是否相同。只需使用==
,就可以在转换前将一侧转换为另一侧的类型。
使用==
运算符时,以下都是正确的:
null == 0;
array() == null;
null == false;
false == 0;
您也不应该在else if ($this->configurationData == null)
中使用getConfigValue
;使用简单的else
,因为您的意图似乎是涵盖所有其他情况。
答案 2 :(得分:1)
我怀疑是因为在构造函数中,您将$ this-&gt; configurationData分配给InitializeConfiguration()的返回值。但它看起来不像InitializeConfiguration()返回任何东西。我认为解决这个问题的最简单方法是改变:
$ this-&gt; configurationData = $ this-&gt; InitializeConfiguration();
于:
$这 - &GT; InitializeConfiguration();