<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CoolCoyote.net &#187; classes</title>
	<atom:link href="http://www.coolcoyote.net/tag/classes/feed" rel="self" type="application/rss+xml" />
	<link>http://www.coolcoyote.net</link>
	<description>Coding - Linux</description>
	<lastBuildDate>Sun, 07 Nov 2010 15:27:34 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Portée des fonctions</title>
		<link>http://www.coolcoyote.net/php-mysql/portee-des-fonctions</link>
		<comments>http://www.coolcoyote.net/php-mysql/portee-des-fonctions#comments</comments>
		<pubDate>Thu, 17 Jun 2010 15:19:36 +0000</pubDate>
		<dc:creator>Denis S.</dc:creator>
				<category><![CDATA[PHP - MySQL]]></category>
		<category><![CDATA[classes]]></category>
		<category><![CDATA[fonctions]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[portée]]></category>

		<guid isPermaLink="false">http://www.coolcoyote.net/?p=232</guid>
		<description><![CDATA[La dernière fois, je me posais la question de savoir comment Symfony faisait pour proposer dans ses vues des fonctions telles que __() (les helpers) puisque je pensais que la seule solution de rendre une fonction utilisateur locale à une méthode de classe était de la déclarer directement dans la méthode et que je n&#8217;ai [...]]]></description>
			<content:encoded><![CDATA[<p>La dernière fois, je me posais la question de savoir comment <strong>Symfony </strong>faisait pour proposer dans ses vues des fonctions telles que <strong>__()</strong> (les helpers) puisque je pensais que la seule solution de rendre une fonction utilisateur locale à une méthode de classe était de la déclarer directement dans la méthode et que je n&#8217;ai trouvé aucun moyen de transmettre cette fonction à cette méthode (comme cela se passe pour les variables). Et pour cause, on n&#8217;en n&#8217;a pas besoin!</p>
<p><span id="more-232"></span></p>
<p>Un petit retour aux basics de PHP m&#8217;a confirmé que la création d&#8217;une fonction dans une méthode de classe la rendait globale à tout le programme, même dans la méthodes d&#8217;une autre classe. Du coup <strong>Symfony </strong>déclare &laquo;&nbsp;bêtement&nbsp;&raquo; (je met entre guillemets car Symfony oblige, ce n&#8217;est pas si simple <img src='http://www.coolcoyote.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) ces fonctions dans la méthode d&#8217;une autre classe.</p>
<p>Exemple:</p>

<div class="cc_syntax-container"><table><tr><td class="line-numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="cc_syntax"><pre class="php"><span class="kw2">&lt;?php</span>
<span class="kw2">class</span> MaClasse
<span class="br0">&#123;</span>
    <span class="kw2">public</span> <span class="kw2">function</span> registerFunction<span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        <span class="kw2">function</span> ma_fonction<span class="br0">&#40;</span><span class="br0">&#41;</span>
        <span class="br0">&#123;</span>
            <span class="co1">// Traitement</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">// A ce moment, on ne peut pas appeler ma_fonction() car sa déclaration ne s'est pas faite</span>
&nbsp;
<span class="re0">$instance</span> <span class="sy0">=</span> <span class="kw2">new</span> MaClasse<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="re0">$instance</span><span class="sy0">-&gt;</span><span class="me1">registerFunction</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
<span class="co1">// Maintenant on peut l'appeler</span>
ma_fonction<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="sy1">?&gt;</span></pre></td></tr></table></div>

<p>Comme dit précédemment, on pourra donc également appeler <strong>ma_fonction()</strong> à l&#8217;intérieur d&#8217;une méthode d&#8217;une autre classe ou n&#8217;importe où dans le programme.</p>
<p>Attention cependant : <strong>PHP </strong>n&#8217;accepte pas la redéfinition des fonctions déjà déclarées, ce qui veut dire que si on s&#8217;amuse à appeler une deuxième fois la méthode <strong>registerFunction()</strong>, on aura un beau message d&#8217;erreur.</p>
<p>Comme quoi, relire les bases de temps en temps ça fait pas de mal <img src='http://www.coolcoyote.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.coolcoyote.net/php-mysql/portee-des-fonctions/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dépendances et exceptions</title>
		<link>http://www.coolcoyote.net/php-mysql/dependances-et-exceptions</link>
		<comments>http://www.coolcoyote.net/php-mysql/dependances-et-exceptions#comments</comments>
		<pubDate>Sat, 09 Jan 2010 11:14:47 +0000</pubDate>
		<dc:creator>Denis S.</dc:creator>
				<category><![CDATA[PHP - MySQL]]></category>
		<category><![CDATA[classes]]></category>
		<category><![CDATA[dépendance]]></category>
		<category><![CDATA[exceptions]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.coolcoyote.net/?p=218</guid>
		<description><![CDATA[A l&#8217;heure où j&#8217;entends beaucoup parler d&#8217;objet, de framework, de dépendance faible, d&#8217;injection de dépendance etc. je me suis posé une question. Admettons que dans mon petit framework sans prétention j&#8217;ai envie que mes modules soient complètement indépendants, c&#8217;est-à-dire que je puisse les prendre un à un et les utiliser avec un projet complètement différent, [...]]]></description>
			<content:encoded><![CDATA[<p>A l&#8217;heure où j&#8217;entends beaucoup parler d&#8217;<strong>objet</strong>, de <strong>framework</strong>, de <strong>dépendance faible</strong>, <strong>d&#8217;injection de dépendance</strong> etc. je me suis posé une question. Admettons que dans mon petit framework sans prétention j&#8217;ai envie que mes modules soient complètement indépendants, c&#8217;est-à-dire que je puisse les prendre un à un et les utiliser avec un projet complètement différent, hors framework. <strong>Zend Framework</strong> fait cela. Cependant je me suis demandé comment gérer des exceptions personnalisées dans ce cas ?</p>
<p>En effet, dans mon framework, j&#8217;ai créé une classe d&#8217;exception qui hérite de <em>Exception </em>et qui rajoute des fonctionnalités comme par exemple une méthode permettant d&#8217;afficher le message d&#8217;erreur bien formaté en HTML avec un fond rouge et presque un gyrophare sur le dessus. Oui mais voilà, quand dans un de mes modules j&#8217;ai besoin d&#8217;utiliser une exception et que j&#8217;ai à afficher le message en utilisant une méthode personnalisée de mon exception, cela casse complètement l&#8217;indépendance de mon module. Je ne peux plus le sortir de son contexte car il dépend désormais de la classe d&#8217;exception de mon framework ce qui est contraire à ce que je veux.</p>
<p><span id="more-218"></span></p>
<p>J&#8217;ai vu que Zend Framework crée une classe d&#8217;exception spécifique pour son module héritée de la classe d&#8217;exception du framework, ce qui lui rend à peu près son indépendance puisqu&#8217;en changeant simplement la classe parent, on peut hériter directement de la classe <em>Exception</em>.</p>
<p>Par exemple pour le module de cache, on trouve cette classe d&#8217;exception:<br />
<code lang="php" escaped="true">&lt;?php<br />
class Zend_Cache_Exception extends Zend_Exception {}<br />
?&gt;</code><br />
En changeant la classe parent on rend le module indépendant:<br />
<code lang="php" escaped="true">&lt;?php<br />
class Zend_Cache_Exception extends Exception {}<br />
?&gt;</code><br />
Oui mais voilà, dans ce cas<em> Zend_Exception</em> qui hérite directement de <em>Exception </em>n&#8217;apporte rien de nouveau. Aucune nouvelle méthode, aucune fonctionnalité. Or dans mon cas, si j&#8217;utilise cette façon de procéder les méthodes personnalisées de ma classes d&#8217;exception ne seront plus disponibles lorsque je changerai la classe parent par <em>Exception</em>. Une seule conclusion m&#8217;est venue à l&#8217;esprit: je ne doit pas utiliser les fonctionnalités spéciales de ma classe d&#8217;exception dans mes modules. Dommage, car j&#8217;ai besoin d&#8217;afficher mes messages d&#8217;erreurs comme je le veux&#8230;</p>
<p>Et puis je me suis demandé si c&#8217;était vraiment le rôle de mon module de stopper l&#8217;exécution du programme pour afficher le message d&#8217;erreur. Non finalement. Si je prends pour exemple l&#8217;extension <strong>mysqli </strong>de PHP, elle ne bloque pas l&#8217;exécution du programme si la connexion à la base ne se fait pas. Elle se contente de fournir des méthodes pour récupérer les erreurs. C&#8217;est dans cette direction que je vais aller.</p>
<p>Tout d&#8217;abord, voici une structure de classe pour mon module avec un exemple d&#8217;exception :<br />
<code lang="php" escaped="true">&lt;?php<br />
class MonModule<br />
{<br />
    private $_error = NULL;</p>
<p>    public function __construct()<br />
    {<br />
        try {<br />
            if (!condition) {<br />
                throw new Exception('Message d\'erreur');<br />
            }</p>
<p>            // Suite du code exécuté<br />
        } catch (Exception $e) {<br />
            $this-&gt;_error = $e-&gt;getMessage();<br />
        }<br />
    }</p>
<p>    public function getError()<br />
    {<br />
        return $this-&gt;_error;<br />
    }<br />
}<br />
?&gt;</code><br />
Dans ce code on voir donc que mon module n&#8217;affiche pas le message d&#8217;erreur. Il se contente de le passer à un membre. Dans mon contrôleur, je vais pouvoir faire entrer ma classe d&#8217;exception personnalisée en action:<br />
<code lang="php" escaped="true">&lt;?php<br />
try {<br />
    $instance = new MonModule();</p>
<p>    if ($instance-&gt;getError()) {<br />
        throw new MyException($instance-&gt;getError());<br />
    }<br />
} catch (MyException $e) {<br />
    $e-&gt;methodePerso();<br />
}<br />
?&gt;</code><br />
Ici on travaille directement sur l&#8217;instanciation de la classe <strong>MonModule()</strong>, du coup la valeur retournée par le constructeur est forcément une instance, mais lors de l&#8217;utilisation de cette technique sur les méthodes de la classe, on peut améliorer la chose en retournant <em>false </em>:<br />
<code lang="php" escaped="true">&lt;?php<br />
class MonModule<br />
{<br />
    private $_error = NULL;</p>
<p>    public function maMethode()<br />
    {<br />
        try {<br />
            if (!condition) {<br />
                throw new Exception('Message d\'erreur');<br />
            }</p>
<p>            // Suite du code exécuté<br />
            return $this;<br />
        } catch (Exception $e) {<br />
            $this-&gt;_error = $e-&gt;getMessage();<br />
            return false;<br />
        }<br />
    }</p>
<p>    public function getError()<br />
    {<br />
        return $this-&gt;_error;<br />
    }<br />
}<br />
?&gt;</code><br />
Et dans le contrôleur :<br />
<code lang="php" escaped="true">&lt;?php<br />
try {<br />
    $instance = new MonModule();</p>
<p>    if (!$instance-&gt;maMethode()) {<br />
        throw new MyException($instance-&gt;getError());<br />
    }<br />
} catch (MyException $e) {<br />
    $e-&gt;methodePerso();<br />
}<br />
?&gt;</code><br />
Je ne sais pas si c&#8217;est la méthode idéale, mais au moins je suis sûr de conserver l&#8217;indépendance de mes classes et de mes exceptions.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coolcoyote.net/php-mysql/dependances-et-exceptions/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

