Comments (12)
(Originally posted by: akrabat on 04/05/09)
Can't fix at Zend_Config level. Workaround is to use UTF8 files without a BOM marker.
from zendframework.
(Originally posted by: akrabat on 04/05/09)
(Closed wrong issue!)
from zendframework.
(Originally posted by: akrabat on 04/05/09)
I'm not sure there's any way to resolve this issue due to the other than creating a dummy key to force an array:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<files>
<file id="index" location="index.html" />
<file />
</files>
</root>
might work, but don't forget to test for id being null.
from zendframework.
(Originally posted by: Patrick van Dissel on 09/02/09)
This issue also exists when using the toArray() method of Zend_Config.
The problem is that you just want the array to ALWAYS have the same layout.
Config files tent to grow and be extended, just like XML files.
In my opinion the Zend_Config API should work the same as the of SimpleXml, here two extended examples and their output:
h2. Using SimpleXML
<?php
// Files with single file element
$xmlString1 = <<<XML
<?xml version="1.0" encoding="utf-8" ?>
<root>
<files>
<file>
<id>index</id>
<location>index.html</location>
</file>
</files>
</root>
XML;
// Files with multiple file elements
$xmlString2 = <<<XML
<?xml version="1.0" encoding="utf-8" ?>
<root>
<files>
<file>
<id>index</id>
<location>index.html</location>
</file>
<file>
<id>index2</id>
<location>index2.html</location>
</file>
</files>
</root>
XML;
echo "Files with single file element, looping files->file:\n";
$xml1 = new SimpleXMLElement($xmlString1);
foreach ($xml1->files->file as $file) {
var_dump($file);
printf("%s: %s\n", 'id', $file->id);
printf("%s: %s\n", 'localtion', $file->location);
}
echo "Files with single file element, looping files->file->id:\n";
foreach ($xml1->files->file->id as $id) {
var_dump($id);
printf("%s: %s\n", 'id', $id);
}
echo "Files with multiple file elements, looping files->file:\n";
$xml2 = new SimpleXMLElement($xmlString2);
foreach ($xml2->files->file as $file) {
var_dump($file);
printf("%s: %s\n", 'id', $file->id);
printf("%s: %s\n", 'localtion', $file->location);
}
echo "Files with multiple file elements, looping files->file->id:\n";
foreach ($xml2->files->file->id as $id) {
var_dump($id);
printf("%s: %s\n", 'id', $id);
}
Files with single file element, looping files->file:
object(SimpleXMLElement)#3 (2) {
["id"]=>
string(5) "index"
["location"]=>
string(10) "index.html"
}
id: index
localtion: index.html
Files with single file element, looping files->file->id:
object(SimpleXMLElement)#2 (1) {
[0]=>
string(5) "index"
}
id: index
Files with multiple file elements, looping files->file:
object(SimpleXMLElement)#6 (2) {
["id"]=>
string(5) "index"
["location"]=>
string(10) "index.html"
}
id: index
localtion: index.html
object(SimpleXMLElement)#3 (2) {
["id"]=>
string(6) "index2"
["location"]=>
string(11) "index2.html"
}
id: index2
localtion: index2.html
Files with multiple file elements, looping files->file->id:
object(SimpleXMLElement)#4 (1) {
[0]=>
string(5) "index"
}
id: index
h2. Using Zend_Config_Xml
possibly a global Zend_Config or other Zend_Config* types issue, I have not tested that_
<?php
set_include_path(
get_include_path()
. PATH_SEPARATOR . 'library/'
);
require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance()->setFallbackAutoloader(true);
// Files with single file element
$xmlString1 = <<<XML
<?xml version="1.0" encoding="utf-8" ?>
<root>
<files>
<file>
<id>index</id>
<location>index.html</location>
</file>
</files>
</root>
XML;
// Files with multiple file elements
$xmlString2 = <<<XML
<?xml version="1.0" encoding="utf-8" ?>
<root>
<files>
<file>
<id>index</id>
<location>index.html</location>
</file>
<file>
<id>index2</id>
<location>index2.html</location>
</file>
</files>
</root>
XML;
echo "Files with single file element, looping files->file:\n";
$xml1 = new Zend_Config_Xml($xmlString1);
foreach ($xml1->files->file as $file) {
var_dump($file);
printf("%s: %s\n", 'id', $file->id);
printf("%s: %s\n", 'localtion', $file->location);
}
echo "Files with single file element, looping files->file->id:\n";
foreach ($xml1->files->file->id as $id) {
var_dump($id);
printf("%s: %s\n", 'id', $id);
}
echo "Files with multiple file elements, looping files->file:\n";
$xml2 = new Zend_Config_Xml($xmlString2);
foreach ($xml2->files->file as $file) {
var_dump($file);
printf("%s: %s\n", 'id', $file->id);
printf("%s: %s\n", 'localtion', $file->location);
}
echo "Files with multiple file elements, looping files->file->id:\n";
foreach ($xml2->files->file->id as $id) {
var_dump($id);
printf("%s: %s\n", 'id', $id);
}
Files with single file element, looping files->file:
string(5) "index"
<br />
<b>Notice</b>: Trying to get property of non-object in <b>D:\www\htdocs\dev\config\config.php</b> on line <b>44</b><br />
id:
<br />
<b>Notice</b>: Trying to get property of non-object in <b>D:\www\htdocs\dev\config\config.php</b> on line <b>45</b><br />
localtion:
string(10) "index.html"
<br />
<b>Notice</b>: Trying to get property of non-object in <b>D:\www\htdocs\dev\config\config.php</b> on line <b>44</b><br />
id:
<br />
<b>Notice</b>: Trying to get property of non-object in <b>D:\www\htdocs\dev\config\config.php</b> on line <b>45</b><br />
localtion:
Files with single file element, looping files->file->id:
<br />
<b>Warning</b>: Invalid argument supplied for foreach() in <b>D:\www\htdocs\dev\config\config.php</b> on line <b>48</b><br />
Files with multiple file elements, looping files->file:
object(Zend_Config)#9 (8) {
["_allowModifications:protected"]=>
bool(false)
["_index:protected"]=>
int(0)
["_count:protected"]=>
int(2)
["_data:protected"]=>
array(2) {
["id"]=>
string(5) "index"
["location"]=>
string(10) "index.html"
}
["_skipNextIteration:protected"]=>
NULL
["_loadedSection:protected"]=>
NULL
["_extends:protected"]=>
array(0) {
}
["_loadFileErrorStr:protected"]=>
NULL
}
id: index
localtion: index.html
object(Zend_Config)#11 (8) {
["_allowModifications:protected"]=>
bool(false)
["_index:protected"]=>
int(0)
["_count:protected"]=>
int(2)
["_data:protected"]=>
array(2) {
["id"]=>
string(6) "index2"
["location"]=>
string(11) "index2.html"
}
["_skipNextIteration:protected"]=>
NULL
["_loadedSection:protected"]=>
NULL
["_extends:protected"]=>
array(0) {
}
["_loadFileErrorStr:protected"]=>
NULL
}
id: index2
localtion: index2.html
Files with multiple file elements, looping files->file->id:
<br />
<b>Warning</b>: Invalid argument supplied for foreach() in <b>D:\www\htdocs\dev\config\config.php</b> on line <b>61</b><br />
{color:red}note:{color} Output rendered with PHP in error_reporting mode = E_ALL | E_STRICT
from zendframework.
(Originally posted by: akrabat on 09/04/09)
I'm open to ideas on how to solve this without breaking backwards compatibility.
from zendframework.
(Originally posted by: DASPRiD on 09/04/09)
You could just do:
$files = (isset($files->file[0]) ? $files->file : array($files->file));
And then just work with the $files variable as array. That works pretty well.
from zendframework.
(Originally posted by: wimg on 04/28/11)
Although this is fixable, fixing it will always break backwards compatibility.
When a developer knows there's only 1 item, code such as this will be broken :
echo $config->files->file['id'];
Because it will in fact have to become :
$file = $config->files->file->toArray();
echo $file[0]['id'];
I would advise against modifying this for ZF 1.x - not sure how this will be handled in ZF 2, but introducing this backwards incompatibility is not a good idea in any case...
The only other option is to modify just the magic/fluent notation, but that will make things complicated and will cause inconsistency between fluent notation and array notation, which should be avoided.
from zendframework.
(Originally posted by: akrabat on 04/28/11)
One idea I have had is to introduce a children() method that always returns an iterator/array regardless of whether there is is one or many children:
$files = $config->files->children();
foreach ($files as $file) {
echo $file->id;
}
Thoughts on this approach?
from zendframework.
(Originally posted by: akrabat on 05/26/11)
Moved to ZF2 as likely to involve a BC break.
from zendframework.
(Originally posted by: EvanDotPro on 07/20/12)
Approaching RC1, we need to decide if anything is going to be done about this.
from zendframework.
This issue was ported from the ZF2 Jira Issue Tracker at
http://framework.zend.com/issues/browse/ZF2-10
Known GitHub users mentioned in the original message or comment:
@DASPRiD, @akrabat, @wimg, @EvanDotPro
from zendframework.
Closing due to inactivity.
from zendframework.
Related Issues (20)
- Class Methods Hydrator - data not properly populated if object gets bound to form HOT 1
- Db/Sql/Predicate/Expression changes in #6849 introduced a BC break HOT 1
- SMTP SSL Error HOT 1
- Failed loading /home/zaman/Documents/ZendStudio/plugins/com.zend.php.executables.linux_7.1.3.201703171134/resources/ext/./ext/ZendDebugger.so: /home/zaman/Documents/ZendStudio/plugins/com.zend.php.executables.linux_7.1.3.201703171134/resources/ext/./ext/ZendDebugger.so: cannot open shared object file: No such file or directory HOT 1
- PHP-function each() has been deprecated (ZF2)
- A plugin by the name "getServiceLocator" was not found in the plugin manager Zend\Mvc\Controller\PluginManager HOT 5
- This regex may stuck in matching HOT 2
- ZF3 and Apigility 1.5 HOT 1
- Error Handling for a Specific Module Only
- Phone number validation criteria HOT 2
- Session timeout even when user is active HOT 6
- I have changed my files according to issue 5997 but still getting error No translator provided HOT 1
- Function mcrypt_*() is deprecated in Zend/Crypt/Symmetric/Mcrypt.php (ZF2) PHP 7.2 HOT 1
- Why zendframework so tricky? HOT 1
- Use of a broken or else risky cryptographic algorithm md5() in Subscriber.php at line 788 HOT 1
- Question: Advanced Routing HOT 4
- PHP 7.3 compatibility issues for zend-stdlib : Warning: "continue" targeting switch is equivalent to "break". HOT 2
- Strange ZF3 class not found error HOT 3
- CONTRIBUTING.md is not available HOT 1
- Hello , i have an error and need help HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from zendframework.