class PHP : propriété d'objet ou méthode d'objet ?

Répondre
xsaiddx
le 30/04/2009 à 00:52
xsaiddx
la page template la ou reside mon soucis
on procede comme ca
echo ($page->menu);
mais je sais pas pour quoi on appel un atribut
a ce que je connais on doit procede comme ca echo $page->getMenu()
mais ca ne fonctionne pas LOL
alors jattent votre explication
merci

<?php <
!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Test sur les templates</title>
<link rel="stylesheet" media="screen" type="text/css" href="style.css" />
</head>
<body>

<div id="menu">
<?php
//include("../test/maClass.php") ;
echo ($page->menu);?>
</div>



<div id="content">
<?php echo ($page->content);?>
</div>

<div id="footer">
<?php echo ($page->footer);?>
</div>



</body>
</html>


>



voila la page qui contient la class

<?php class CreePage {


public $menu;
public $content;
public $footer;
public $template;



//=======================================

//le constructeur

//===========================================


function CreePage(){

$this->template='template.html';
}


//===========================

//la fonction qui recuper le menu

//=============================

function getMenu(){

$this->menu='<a href="?action=home">Home</a>';
$this->menu.='<br />';
$this->menu.='<a href="?action=Tuto">Tuto</a>' ;
}


//==================================================

//la fonction qui recuper le parametre $_GET['action']

//===================================================

function getContent(){

if(isset($_GET['action'])){

switch ($_GET['action']){

case 'home' :
$this->contentHome() ;
break ;

case 'Tuto' :
$this->contentTuto() ;
break ;

default :
$this->contentHome();
}
}
}


//===============================

//la fonction qui recuper le pied

//===============================

function getFooter(){

$this->footer='<center> c\'est le footer <br />';
$this->footer.='2008 -copyright </center>' ;
}


//===========================================

//la fonction qui recuper le contenu page=>home

//============================================

function contentHome(){

$this->content='<center> <h1>this is my home</h1> </center>' ;
}


//=================================================

//la fonction qui recuper le contenu page=>tuto

//====================================================

function contentTuto(){

$this->content='<center> <h1>this is my tuto</h1> </center>' ;
}


//==================================

//la fonction qui construire la page

//==================================

function fairPage(){

$this->getMenu();
$this->getContent();
$this->getFooter();
}
} ?>






and la page index

<?php 
<?php
include("../test/maClass.php");
$page= new CreePage ;
echo $page->fairPage() ;
include($page->template);

?>
LA GLOBULE
le 30/04/2009 à 00:59
LA GLOBULE
Alors, petit rappel de POO :
- quand tu mets des parenthèses, cela veut dire que tu appelles une méthode de l'objet
- quand tu ne mets pas de parenthèses, tu appelles une proriété d'un objet (un attribut si tu préfères)

En regardant le code de ta classe la, "menu" est une propriété de l'objet et non une méthode.
Pour récupérer sa valeur, il te suffit donc de faire un echo de $page->menu.

De plus, ta méthode getMenu n'affiche rien, elle ne fait que "charger" la propriété menu de ton objet (donc tu ne verras rien en faisant un echo de $page->getMenu()).
xsaiddx
le 30/04/2009 à 01:20
xsaiddx
merci Ms la globule pour cete efficace explication
je me suis trompe par le nom j'ai lui donner get.. alors j'ai pense que j'ai fais un getter

et a ton avis ca sera bien de fair des getter pour chaque propriete est les changer en private si oui quelle est l'utilite par ce que j'ai lu sur bcp de tuto que c'est pas bien de laisser les attributs en public

une autre question SVP pour le contructeur ici on fait
include($page->template);

on peut pas l'appeller? ou lieu de fair include

et si on lui donne comme nom __construct et pas le meme nom que la class comment on peut l'appeler ??

merci
LupusMic
le 30/04/2009 à 22:21
LupusMic
Ceux qui professent les getter et setter suivent le principe d'accès homogène aux attributs.

Il n'est pas strictement nécessaire de rendre tout les attributs protected (ou private, mais private c'est un peu violent).

Personnellement, j'ai tendance à utiliser les méthodes magiques __get et __set pour gérer l'accès aux attributs. Tous les attributs je les déclarent protected. Je les préfixe d'un underscore.

<?php

class comment {

protected $_title ;
protected $_content ;

public function __set($name, $value)
{
$attr_name = $this->_attr_name($name) ;

$method = "_set_$name" ;
return function_exists(array($this, $method))
? $this->$method($value) : $this->$attr_name ;
}

public function __get($name)
{
$attr_name = $this->_attr_name($name) ;

$method = "_get_$name" ;
return method_exists($this, $method)
? $this->$method() : $this->$attr_name ;
}

protected function _attr_name($name)
{
$attr_name = "_$name" ;

return method_exists($this, $method)
throw new exception("Attribute $name doesn't exist.") ;

return $attr_name ;
}

protected function _set_title($title)
{
// Bien évidemment, ceci est ridicule, mais ça peut être utile
if(strlen($title) < 25)
throw new exception('Title too little.') ;

return $this->_title = $title ;
}
}

$comment = new comment ;

try
{
$comment->title = 'C\'est d\'la balle !' ;
$comment->content = 'Sisi, vraiment.' ;
}
catch(exception $e)
{
echo $e ;
}


L'include n'est pas le constructeur. Include permet d'inclure un fichier dans le script courant.

__construct est la manière PHP5/6 et suivant de déclarer un constructeur. Un constructeur NE DOIT PAS être appelé directement. La seule exception est lorsque tu définis le constructeur d'une class qui dérive d'une autre. À ce moment là, il faudra appeler le constructeur parent pour garantir le fonctionnement de l'objet.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
xsaiddx
le 01/05/2009 à 02:26
xsaiddx
je connais le role de include je veux dire si on veux appeller un constructeur qui se nom __cnostruct et pas 'le meme nom que la class' cmmt faire

et svp je pige rien sur tno code LOL
explique moi avec des commentaires
MERCI
LupusMic
le 01/05/2009 à 03:13
LupusMic
Ben tu instancis la classe avec new. PHP va alors appeler automagiquement la méthode __construct de la classe.

Je l'ai écrit trop vite, il ne marche :p Mais j'ai réécrit la classe, en la rendant très générique. Je l'ai documenté et testé. Plus qu'à packager.

(D'ailleurs, La Globule, tu peux virer ce premier jet pas testé et publié à l'arrache ? :p)
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours