<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Retour à La Source • Tag: PHP5 • RSS</title>
		<link>http://www.ab-d.fr/tag/PHP5/</link>
		<description>Retour à La Source • Tag: PHP5 • RSS</description>
		<copyright>http://www.ab-d.fr/tag/PHP5/ (c) 2012</copyright>
		<language>fr</language>
		<pubDate>Sun, 05 Feb 2012 01:20:30 +0100</pubDate>
		<generator>Retour à La Source • Tag: PHP5 • RSS • version 1.0</generator>
		<webMaster>noreply@ab-d.fr ( Benoit Asselin )</webMaster>
		<image>
			<url>http://www.ab-d.fr/images/rss.gif</url>
			<title>Retour à La Source • Tag: PHP5 • RSS</title>
			<link>http://www.ab-d.fr/tag/PHP5/</link>
			<width>90</width>
			<height>30</height>
		</image>

		<item>
			<title>Utiliser l'écriture Array sous forme Object en PHP ( PHP5, POO, ArrayAccess )</title>
			<link>http://www.ab-d.fr/date/2008-08-25/</link>
			<pubDate>Mon, 25 Aug 2008 10:26:26 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[PHP5]]></category>
			<category><![CDATA[PHP]]></category>
			<description><![CDATA[<p>
Comme annoncé la semaine dernière et les vacances se terminant, il est maintenant temps de remonter <em>(un peu)</em> le niveau de ce blog qui sombrait doucement mais sûrement dans le grand n'importe quoi.
</p>
<p>
L'astuce du jour n'est guère facile à expliquer en quelques lignes, un exemple sera à mon avis beaucoup plus clair.<br />
Comment utiliser un tableau comme un pur objet ? ( à la sauce Java, si je puis m'exprimer ainsi )
</p>

<pre>
// Ecriture PHP classique
$array = array(); // Ligne facultative
$array['key1'] = 'value 1';
$array['key2'] = 'value 2';
$array['key3']['key31'] = 'value 31';
...
</pre>

<p>Voici une écriture qui ne fonctionne qu'en PHP 5 :</p>
<pre>
// Ecriture PHP5 objet
$array = new ClassArray(); // Ligne obligatoire !
$array['key1'] = 'value 1';
$array['key2'] = 'value 2';
...
</pre>

<p>En soit, il n'y a absolument rien de révolutionnaire, mais le <code>new</code> crée l'instance de l'objet <code>ClassArray()</code> et vous pouvez constater que l'écriture reste un tableau et non un objet<br />
<code>$array->key1 = 'value 1';</code></p>

<p>Une question se pose sûrement dans votre cerveau qui bouillonne d'impatience : Qui a-t-il dans cette <code>ClassArray()</code> ? Une simple implémentation de <code>ArrayAccess</code> ( PHP5 only ), ce qui nous donne :</p>

<pre>
class ClassArray <strong>implements ArrayAccess</strong> {
	
	protected $_array = array();
	
	public function __construct() {
		$this->_array = func_get_args();
	}
	
	// En cas d'appel de la fonction isset()
	public function offsetExists($offset) {
		return isset($this->_array[$offset]);
	}
	
	// En cas d'appel de la valeur
	public function offsetGet($offset) {
		return $this->_array[$offset];
	}
	
	// En cas d'affectation de la valeur
	public function offsetSet($offset, $value) {
		return $this->_array[$offset] = $value;
	}
	
	// En cas d'appel de la fonction unset()
	public function offsetUnset($offset) {
		unset($this->_array[$offset]);
	}
	
}
</pre>

<p>Ensuite, libre à vous de modifier cette classe pour lui ajouter de nouvelles fonctionnalités...</p>

<p>Remarque importante : Si vous essayez de créer un tableau sur plusieurs dimensions, un message d'erreur se produira avec l'écriture suivante :</p>
<pre>
$array = new ClassArray();
$array['key3']['key31'] = 'value 31';

// Problème : Vous n'avez pas définit $array['key3'] ! l'écriture POO est beaucoup plus stricte ;)
// Solution :
$array = new ClassArray();
$array['key3'] = new ClassArray();
$array['key3']['key31'] = 'value 31';

</pre>

<p>
Documentation officielle :<br />
http://www.php.net/~helly/php/ext/spl/interfaceArrayAccess.html
</p>

<hr />

<a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-08-25%2F&title=Utiliser+l%27%C3%A9criture+Array+sous+forme+Object+en+PHP+%28+PHP5%2C+POO%2C+ArrayAccess+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/tag/PHP5/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-08-25/</guid>
		</item>

		<item>
			<title>function array2object(array $array) { ... } en PHP5 ( object, stdClass, php )</title>
			<link>http://www.ab-d.fr/date/2008-07-19/</link>
			<pubDate>Sat, 19 Jul 2008 10:10:10 +0100</pubDate>
			<author>noreply@ab-d.fr ( Benoit Asselin )</author>
			<category><![CDATA[PHP]]></category>
			<category><![CDATA[PHP5]]></category>
			<description><![CDATA[<p>
Cette fonction <code>function array2object()</code> n'est pas nouvelle en soit, mais voici une écriture récursive en PHP5 plus rigolote ( <em>et surtout plus restrictive</em> ) à utiliser.</p>
<p>
La fonction ci-dessous ne fonctionne qu'en PHP 5 de part le typage du paramètre <code>(<strong>array</strong> $array)</code> ainsi on évite le contrôle <code>is_array()</code>. Toutefois, si vous envoyez une valeur qui n'est pas un tableau, une erreur de compilation se produira.
</p>

<pre>
function array2object(array $array) {
	$object = new stdClass();
	foreach($array as $key =&gt; $value) {
		if(is_array($value)) {
			$object-&gt;$key = array2object($value);
		} else {
			$object-&gt;$key = $value;
		}
	}
	return $object;
}
</pre>

<p>Exemples d'utilisation :</p>
<pre>
$tableau[0] = 'Valeur 0';
$tableau[1] = 'Valeur 1';
$tableau['deux'] = 'Valeur 2';
$tableau['trois'] = 'Valeur 3';

$objet = array2object($tableau);

echo $objet-&gt;0;     // Ecriture incorrecte
echo $objet-&gt;{'1'}; // Ecriture correcte
echo $objet-&gt;deux;  // Ecriture classique
echo $objet-&gt;trois; // etc...
</pre>

<hr /><a href="http://res.feedsportal.com/viral/bookmark_fr.cfm?link=http%3A%2F%2Fwww.ab-d.fr%2Fdate%2F2008-07-19%2F&title=function+array2object%28array+%24array%29+%7B+...+%7D+en+PHP5+%28+object%2C+stdClass%2C+php+%29"><img src="http://www.ab-d.fr/images/bookmark.gif" border="0" /></a><br /><br />]]></description>
			<comments>http://www.ab-d.fr/tag/PHP5/</comments>
			<guid isPermaLink="false">http://www.ab-d.fr/date/2008-07-19/</guid>
		</item>

	</channel>
</rss>

