Page 1 sur 1

Premier pas en POO

Posté : 28 mars 2009, 00:13
par lossendae
Bonjour,

Je tente mes premières expérimentations en POO.
Je n'ai pas encore intégré tous le verbage mais il faut bien commencer.
J'ai un problème avec le script suivant:
class Test
{
	protected $view = array();
	protected $output = array();
 
	public function setOutput($data)
	{
		$this->output['data'] = $data;
	}
 
	public function setCurrentview($view)
	{
		$this->view['current'] = $view;
	}
 
	public function getCurrentView()
	{
		return $this->view['current'];
	}
	
	public function getData($view)
	{
		$provider = outputFactoryProvider::createOutput($view);
		$provider->getOutput($view);
	}
 
	public function outputContent()
	{
		return $this->output;
	}
	
}
 
interface outputProvider
{
	public function getOutput($view);
}
 
class OutputDefaultProvider implements outputProvider
{
	public function getOutput($view)
	{
		$cc = new CommandChain();
		$cc->addCommand( new categoryCommand() );
		$cc->runCommand( 'category', $view );
	}
}
 
class outputFactoryProvider
{
	public static function createOutput($view)
	{
		switch($view) {
			default:
				return new OutputDefaultProvider();		
				break;
		}
	}
}
 
interface ICommand
{
	function onCommand($name, $args);
}
 
class CommandChain
{
	private $_commands = array();
	
	public function addCommand($cmd)
	{
		$this->_commands[] = $cmd;
	}
	
	public function runCommand($name, $args)
	{
		foreach($this->_commands as $cmd)
		{
			if ($cmd->onCommand($name, $args))
				return;
		}
	}
}
 
class categoryCommand extends Test Implements ICommand
{
 
	public function onCommand($name, $args)
	{
		$data = 'categoryCommand handling category<br/>';
		parent::setOutput($data);
		$this->output['category'] = 'category';
		//print_r($this->output);
	}
}
Avec le code suivant:
$Test = new Test;
$Test->setCurrentView('testok');
$Test->getData( $Test->getCurrentView() );
print_r( $Test->outputContent() );
outputContent me renvoi NULL.
le code mis en commentaire lui me renvoi bien les array.

Pourquoi mon objet est vide à la fin du script?

Posté : 28 mars 2009, 11:33
par stopher
slt ,

En regardant ton script , celà ma parait normal ..
public function outputContent()
    {
        return $this->output;
    } 
Jamais tu n'enregistre quelque chose dans ton array "output" ..

Le seul tableau qui contiend des valeurs dans ton objet est : "view"

Posté : 28 mars 2009, 11:42
par lossendae
Slt,

il me semblait que si via la méthode setOutput

 
public function setOutput($data)
    {
        $this->output['data'] = $data;
    } 
J'ai aussi modifié outputContent:
public function outputContent()
    {
        return $this->output['data'];
    }
Mais j'obtiens toujours un résultat NULL.

J'ai l'impression que mon objet se vide à la fin du script. Il y aurait un problème avec on approche?

Posté : 31 mars 2009, 09:56
par julian
il me semblait que si via la méthode setOutput
Je ne vois pas où tu appel cette méthode donc stopher a raison.

Posté : 03 avr. 2009, 16:55
par Gofromiel
Sinon, on ne crée pas les objets avec
$Test = new Test;
mais plutôt :
$Test = new Test();
Et c'est pas parce que ça marche que c'est bien ;-)

Posté : 05 avr. 2009, 17:04
par Lirio
Si on décortique ton code,
$Test->getData( $Test->getCurrentView() );
est le passage qui pose problème.
On regarde un peu la methode :
$provider = outputFactoryProvider::createOutput($view);
$provider->getOutput($view);
Clairement, il manque quelque chose : il n'y aucun reference à l'objet courant : pas de "this", donc ton objet n'est pas modifié. :wink:

Faudrait surement un truc du genre
        $this->setOutput($provider->getOutput($view));
si l'on se fit au nom des methodes.
Mais cela ne fonctionnera pas non plus, car provider souffre du même problème.
Sa fonction
$cc = new CommandChain();
$cc->addCommand( new categoryCommand() );
$cc->runCommand( 'category', $view );
ne possède pas de valeur de retour ...