Définir des constantes

définir des constantes

Seuls les types de données scalaires (booléen, entier, double et chaîne de caractères) peuvent être affectés comme valeur d'une constante.

Une fois définie, la valeur d'une constante de classe n'est plus modifiable.

Tous les objets instances de la classe contenant les constantes partagent la valeur de ces constantes. Il y ont tous accès en lecture, mais pas en écriture.

Il n'est pas possible de spécifier la visibilité d'une constante. Les constantes ont une visibilité public par défaut.

Pour illustrer l'utilisation des constantes, nous allons ajouter un nouvel attribut à la classe Guitare. L'attribut son définira l'acoustique de la guitare, à savoir : acoustique, à résonateur, électro-acoustique, électrique. Ces valeurs seront stockées dans 4 constantes.

Exemple : définition de constantes

Utiliser des constantes, résolution de portée

On NE PEUT PAS pas utiliser l'opérateur -> avec une constante.

Pour faire référence à une constante de classe dans notre code, nous devons utiliser l'opérateur :: (double deux-points). L'opérateur :: est également appelé opérateur de résolution de portée.

Suivant l'endroit du code où on fait référence à la constante, l'opérateur de portée est précédé :
- du mot-clé self,
- du nom de la classe,
- de la variable instance de la classe.

utiliser une constante avec l'opérateur de portée
Exemple : utilisation de constantes

Exercice : constantes de classe

Reprenez le code de la classe Livre ci-dessous et utilisez des constantes de classe pour gérer les 4 catégories de livre possibles ("Méthode", "Partition", "Biographie" ou "Autre").

// Définition de la classe Livre
class Livre {
	private $titre, $auteur, $pages, $prix, $cat;

	public function __construct($p1, $p2, $p3, $p4, $p5) {
		$this->titre = $this->verifChaine($p1, 'titre');
		$this->auteur = $this->verifChaine($p2, 'auteur');
		if (is_numeric($p3) && estEntre($p3, 10, 1000)) {
			$this->pages = $p3;
		} else {
			$this->afficheErreur($p3, 'pages');
		}
		if (is_numeric($p4) && estEntre($val, 0, 1000)) {
			$this->prix = $p4;
		} else {
			$this->afficheErreur($p4, 'prix');
		}
		$oks = array('Méthode', 'Partition', 
					 'Biographie', 'Autre');
		if (in_array($p5, $oks)) {
			$this->cat = $p5;
		} else {
			$this->afficheErreur($p5, 'cat');
		}
	}
	private function verifChaine($val, $attr) {
		$val = trim($val);
		($val == '') && $this->afficheErreur($val, $attr);
		return $val;
	}
	private function afficheErreur($val, $attr) {
		exit("<hr>Valeur '<b>$val</b>' invalide pour
				l'attribut <b>$attr</b>.<hr>");
	}
	public function decrire() {
		echo '<h4>Instance de la classe Livre</h4>',
				$this->titre, ' - ', $this->auteur, ' - ', 
				$this->pages, ' pages - ', 
				$this->prix, ' &euro; - ', $this->cat, '<hr>';
	}
}			// Fin de la classe Livre

Vous devez instancier 4 livres avec les informations suivantes :

Titre Auteur Nb Pages Prix Cat.
Débutant Guitare Acoustique Rébillard 70 17 Méthode
Les accords de guitare Carpentier 160 4.90 Autre
Guitar Play Along Neil Young Leonard 50 21.90 Partition
50 rock songs Piat 120 19.99 Rock

Une solution possible

Exercice : constantes de classe