Sie sind auf Seite 1von 19

PHP – Master CCI

Bertrand Estellon

Aix-Marseille Université

January 30, 2014

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 1 / 177
PHP Programmation Orientée Objet Introduction

Programmation Orientée Objet

La programmation orientée objet de PHP 5 est similaire à celle de Java.

Nous allons voir comment :


▶ Définir une classe
▶ Créer une instance
▶ Accéder aux propriétés et invoquer des méthodes
▶ Modifier l’accessibilité aux propriétés et aux méthodes
▶ Définir un constructeur et un destructeur
▶ Définir des interfaces, des classes abstraites
▶ Utiliser l’héritage
▶ Cloner des instances

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 122 / 177
PHP Programmation Orientée Objet Classe et instance

Définition d’une classe

Pour définir une classe, on utilise le mot-clé class.


<?
class Date {
public $day = 2;
public $month = 3;
public $year = 1970;

// public $year = strlen('toto'); (interdit !)

public function getYear() { return $this->year; }


public function setDay($day) { $this->day = day; }
}
?>

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 123 / 177
PHP Programmation Orientée Objet Classe et instance

Création d’une instance

Pour créer une instance d’une classe, on utilise le mot-clé new.


<?
class Date {
/* ... */
}

$date1 = new Date();


$date2 = new Date();
?>

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 124 / 177
PHP Programmation Orientée Objet Classe et instance

Accès aux propriétés et invocation de méthodes

<?
class Date {
public $day = 2;
public $month = 3;
public $year = 1970;
public function getYear() { return $this->year; }
public function setDay($day) { $this->day = day; }
}

$date = new Date();


$date->day = 3; // pas de $ dans le nom de la propriété
echo $date->day;
$date->setDay(12);
?>
. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 125 / 177
PHP Programmation Orientée Objet Classe et instance

$this

<?
class Date {
public $day = 2;
public $month = 3;
public $year = 1970;
public function getYear() { return $this->year; }
public function setDay($day) { $this->day = day; }
}

$date = new Date();


$date->setDay(12);
echo $date->getYear();
?>

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 126 / 177
PHP Programmation Orientée Objet Classe et instance

Constantes – propriétés et méthodes statiques


<?
class Date {
const maxMonth = 12;
private static $monthStrings = array("Janvier",
"Février" /* ... */ );

private $month = 1;

public function setMonth($month) {


if ($month > self::maxMonth)
die("error");
$this->month = $month;
}

public function getMonthString() {


return self::$monthStrings[$this->month];
}
} ..
.
..
.
..
. . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
..
.
..
.
..
.

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 127 / 177
PHP Programmation Orientée Objet Classe et instance

Constructeur et destructeur
<?
class Date {
private $day, $month, $year;

function __construct($day, $month, $year) {


$this->day = $day;
$this->month = $month;
$this->year = $year;
}

function __destruct() { echo $this->day; }


}

$date1 = new Date(1,1,1970);


$date2 = new Date(2,1,1970);
$date1 = null; // affichage de '1'
// affichage de '2'
?> ..
.
..
.
..
. . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
..
.
..
.
..
.

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 128 / 177
PHP Programmation Orientée Objet Héritage et interface

Interface

<?
interface Movable {
public function translate($dx, $dy);
}

class Point implements Movable {


public $x = 0, $y = 0;

public function translate($dx, $dy) {


$this->dx += $dx;
$this->dy += $dy;
}
}
?>

Il est possible d’implémenter plusieurs interfaces.


. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 129 / 177
PHP Programmation Orientée Objet Héritage et interface

Héritage
<?
class Point {
public $x, $y;
function __construct($x, $y) { $this->x = $x; $this->y = $y; }
function toString() { return $this->x.",".$this->y; }
}

class Pixel extends Point {


public $color;

function __construct($x, $y, $color) {


parent::__construct($x,$y); $this->color = $color;
}

function toString() {
return parent::toString()."[".$this->color."]";
}
} ..
.
..
.
..
. . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
..
.
..
.
..
.

?> Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 130 / 177
PHP Programmation Orientée Objet Héritage et interface

Héritage

<?
$point = new Point(2,3);
$pixel = new Pixel(2,3,"red");

var_dump($point instanceof Point); // bool(true)


var_dump($pixel instanceof Point); // bool(true)
var_dump($point instanceof Pixel); // bool(false)
var_dump($pixel instanceof Pixel); // bool(true)
?>

. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 131 / 177
PHP Programmation Orientée Objet Héritage et interface

Late Static Bindings (Résolution statique à la volée)


<?
class MyClass {
function toString() { return self::getClassName(); }
static function getClassName() {
return "MyClass";
}
}
class MyExtendedClass extends MyClass {
static function agetClassName() {
return "MyExtendedClass";
}
}

$myClass = new MyClass();


$myExtendedClass = new MyExtendedClass();
echo $myClass->toString(); // MyClass
echo $myExtendedClass->toString(); // MyClass
?> ..
.
..
.
..
. . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
..
.
..
.
..
.

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 132 / 177
PHP Programmation Orientée Objet Héritage et interface

Late Static Bindings (Résolution statique à la volée)


<?
class MyClass {
function toString() { return static::getClassName(); }
static function getClassName() {
return "MyClass";
}
}
class MyExtendedClass extends MyClass {
static function agetClassName() {
return "MyExtendedClass";
}
}

$myClass = new MyClass();


$myExtendedClass = new MyExtendedClass();
echo $myClass->toString(); // MyClass
echo $myExtendedClass->toString(); // MyExtendedClass
?> ..
.
..
.
..
. . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
..
.
..
.
..
.

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 133 / 177
PHP Programmation Orientée Objet Héritage et interface

Classe abstraite

<?
abstract class Person {
abstract public function getName();

public function displayName() {


echo $this->getName()."\n";
}
}

class Bob extends Person {


public function getName() { return "bob"; }
}

$bob = new Bob();


$bob->displayName(); // affiche 'bob'
?>
. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 134 / 177
PHP Programmation Orientée Objet Héritage et interface

Visibilité
▶ public : utilisable par n’importe quelle partie du programme.
▶ protected : utilisable uniquement par les classes et parents hérités.
▶ private : utilisable uniquement par la classe qui les a définis.
<?
class MyClass {
public $pub;
protected $pro;
private $pri;
public function publicMethod() { ... }
protected function protectedMethod() { ... }
private function privateMethod() { ... }
}

class MyExtendedClass extends MyClass {


public function test() {
echo $this->pub; $this->publicMethod();
echo $this->pro; $this->protectedMethod();
echo $this->pri; $this->privateMethod(); // interdit !
}
}
?> .
. .
. . . .
.
. . . . . . . . . . . . . . .
. . .
. . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 135 / 177
PHP Programmation Orientée Objet Héritage et interface

Visibilité
▶ public : utilisable par n’importe quelle partie du programme.
▶ protected : utilisable uniquement par les classes et parents hérités.
▶ private : utilisable uniquement par la classe qui les a définis.
<?
class MyClass {
public $pub;
protected $pro;
private $pri;
public function publicMethod() { ... }
protected function protectedMethod() { ... }
private function privateMethod() { ... }
}

class MyOtherClass /* qui n'étend pas MyClass */ {


public function test() {
$i = new MyClass();
echo $i->pub; $i->publicMethod();
echo $i->pro; $i->protectedMethod(); // interdit !
echo $i->pri; $i->privateMethod(); // interdit !
}
} . . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
?>
Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 136 / 177
PHP Programmation Orientée Objet Clonage

Clonage
<?
class Point {
public $x, $y;

function __construct($x, $y) {


$this->x = $x; $this->y = $y;
}

function __clone() { $this->x += 10; }


}

$point = new Point(10,10);


$point2 = clone $point;
echo $point->x."\n"; // affiche '10'
echo $point2->x."\n"; // affiche '20'
?> ..
.
..
.
..
. . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
..
.
..
.
..
.

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 137 / 177
PHP Programmation Orientée Objet Méthodes magiques

Méthodes magiques – Set et Get


<?
class MyClass {
private $attrs;

public function __set($attr, $val) {


echo "$attrs <- $val\n";
$this->attrs[$attr] = $val;
}
public function __get($attr) {
if (!isset($this->attrs[$attr])) return "erreur";
else return $this->attrs[$attr];
}
}
$myClass = new MyClass();
$myClass->toto = 2; // affiche 'toto <- 2'
echo $myClass->toto."\n"; // affiche '2'
echo $myClass->a."\n"; // affiche 'erreur'
?> ..
.
..
.
..
. . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
..
.
..
.
..
.

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 138 / 177
PHP Programmation Orientée Objet Méthodes magiques

Méthodes magiques – Isset et Unset


<?
class MyClass {
private $attrs;

/* avec les fonctions __set et __get définies avant */

public function __isset($attr) {


return isset($this->attrs[$attr]);
}
public function __unset($attr) {
echo "destruction de $attr\n"; unset($this->attrs[$attr]);
}
}
$myClass = new MyClass();
$myClass->toto = 2; // affiche 'toto <- 2'
var_dump(isset($myClass->toto)); // affiche 'bool(true)'
unset($myClass->toto); // affiche 'destruction de toto'
?> ..
.
..
.
..
. . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. ..
.
..
.
..
.
..
.
..
.

Bertrand Estellon (AMU) PHP – Master CCI January 30, 2014 139 / 177

Das könnte Ihnen auch gefallen