【发布时间】:2016-03-22 13:42:14
【问题描述】:
我制作了一个小型库来读取数据库导出的 xml 文件,并将其输出为结构化关联数组。它还可以按表格列过滤输出。
完成代码后,当我玩这个类时,我发现了一些奇怪的东西。 unset 的行为就像变量是通过引用传递的一样。
我找不到任何可能的错误,所以我提出了设置$this->rows 的特定方法,希望有人能启发我。
private function populateData($rowLimit)
{
if (!$this->getColumns()) {
throw new ReaderException(__FUNCTION__ . " # Unable to get columns name.");
}
// database->tableName->rows
$rows = $this->getSimpleXmlElement()->children()->children();
if ($this->getFilteredColumns()) {
$toRemoves = array_values(array_diff($this->getColumns(),
$this->getFilteredColumns()));
foreach ($rows as $row) {
foreach ($toRemoves as $toRemove) {
unset($row->{$toRemove});
}
}
}
$rows = $this->simpleXmlToArray($rows)['row'];
if ($rowLimit) {
$limited = [];
for ($i = 0; $i < $rowLimit; $i++) {
$limited[] = $rows[$i];
}
$this->setRows($limited);
} else {
$this->setRows($rows);
}
$structArray = [
'database' => $this->getDatabaseName(),
'table' => $this->getTableName(),
'columns' => !$this->getFilteredColumns() ? $this->getColumns()
: $this->getFilteredColumns(),
'rows' => $this->getRows()
];
$this->setStruct($structArray);
return $this;
}
$xml = new SomeXmlReader($companyTableFilePath);
$xml->get(1);
输出:
[
"database" => "myDatabase",
"table" => "companies",
"columns" => [
"id",
"name",
"license_no",
"phone",
"created",
"modified",
],
"rows" => [
[
"id" => "1",
"name" => "SOME COMPANY NAME",
"license_no" => "884652",
"phone" => null,
"created" => "2015-09-25 16:01:57",
"modified" => "2015-09-25 16:01:57",
],
],
]
当我尝试过滤掉某些列时,我会这样做
$xml->setFilteredColumns(['id','name'])->get(1);
它按预期返回结果:列已被修剪。 输出:
[
"database" => "myDatabase",
"table" => "companies",
"columns" => [
"id",
"name",
],
"rows" => [
[
"id" => "1",
"name" => "SOME COMPANY NAME",
],
],
]
然而,就在这一行之后,当我用
再次测试它时$xml->setFilteredColumns(['id','name','phone'])->get(1);
在下一行,出了点问题。输出是:
[
"database" => "myDatabase",
"table" => "companies",
"columns" => [
"id",
"name",
"phone",
],
"rows" => [
[
"id" => "1",
"name" => "SOME COMPANY NAME",
],
],
]
经过一番追踪,我发现$this->getSimpleXmlElement()被unset修改了。在此应用生命周期内,我无法再获得 $this->getSimpleXmlElement() 的完整/原始值。
我是否犯了一个根本性的错误,或者这是 PHP 语言的行为?
【问题讨论】: