PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

Auto-chargement de classes> <Les classes et les objets (PHP 5)
Last updated: Fri, 10 Oct 2008

view this page in

Syntaxe de base

class

Chaque définition de classe commence par le mot-clé class, suivi par le nom de la classe, qui peut être quelconque à condition que ce ne soit pas un mot réservé en PHP. Suivent une paire de parenthèses contenant la définition des membres et des méthodes. Une pseudo-variable $this est disponible lorsqu'une méthode est appelée depuis un contexte objet. $this est une référence à l'objet appelé (habituellement, l'objet auquel la méthode appartient, mais ce peut être un autre objet si la méthode est appelée de manière statique depuis le contexte d'un autre objet). Ce comportement est illustré dans l'exemple suivant :

Exemple #1 La variable $this en programmation objet

<?php
class A
{
  function 
toto()
  {
    if (isset(
$this)) {
      echo 
'$this est définie (';
      echo 
get_class($this);
      echo 
")\n";
    } else {
      echo 
"\$this n'est pas définie.\n";
    }
  }
}

class 
B
{
  function 
titi()
  {
    
A::toto();
  }
}

$a = new A();
$a->toto();
A::toto();
$b = new B();
$b->titi();
B::titi();
?>

L'exemple ci-dessus va afficher :

$this est définie (a)
$this n'est pas définie.
$this est définie (b)
$this n'est pas définie.

Exemple #2 Définition simple d'une classe

<?php
class SimpleClass
{
   
// déclaration d'un membre
   
public $var 'une valeur par défaut';

   
// déclaration de la méthode
   
public function displayVar() {
     echo 
$this->var;
   }
}
?>

La valeur par défaut doit être une expression, et non (par exemple) une variable, un membre d'une classe ou un appel à une fonction.

Exemple #3 Valeur par défaut des membres d'une classe

<?php
     
class SimpleClass
     
{
     
// Déclarations de membres non valides :
     
public $var1 'hello '.'world';
     public 
$var2 = <<<EOD
Bonjour le monde !
EOD;
     public 
$var3 1+2;
     public 
$var4 self::myStaticMethod();
     public 
$var5 $myVar;

     
// Déclarations de membres valides :
     
public $var6 myConstant;
     public 
$var7 self::classConstant;
     public 
$var8 = array(truefalse);
}
?>

Note: Il y a plusieurs fonctions utiles pour gérer les classes et les objets. Vous devriez regarder du côté des fonctions d'objets et de classes.

Contrairement à heredocs, nowdocs peut être utilisé dans n'importe quel contexte de données statiques.

Exemple #4 Exemple avec des données statiques

<?php
class foo {
    
// Depuis PHP 5.3.0
    
public $bar = <<<'EOT'
bar
EOT
;
}
?>

Note: Le support de Nowdoc a été ajouté depuis PHP 5.3.0.

Le mot-clé new

Pour créer une instance d'une classe, un nouvel objet doit être créé et assigné à une variable. Un objet doit toujours être assigné lors de la création d'un nouvel objet à moins qu'il ait un constructeur défini qui lance une exception en cas d'erreur. Les classes doivent être définies avant l'instanciation (dans certains cas, c'est impératif).

Exemple #5 Création d'une instance

<?php
$instance 
= new SimpleClass();
?>

Dans le contexte de la classe, il est possible de créer un nouvel objet avec new self et new parent.

Lors de l'assignation d'une instance déjà créée d'une classe à une variable, la nouvelle variable accédera à la même instance de l'objet assigné. Ce comportement est le même que lors du passage d'une instance à une fonction. Une copie d'un objet déjà créé peut être effectuée par clonage.

Exemple #6 Assignation d'un objet

<?php
$assigned   
=  $instance;
$reference  =& $instance;

$instance->var '$assigned aura cette valeur';

$instance null// $instance et $reference deviennent null

var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>

L'exemple ci-dessus va afficher :

NULL
NULL
object(SimpleClass)#1 (1) {
   ["var"]=>
     string(30) "$assigned aura cette valeur"
}

Le mot-clé extends

Une classe peut hériter des méthodes et des membres d'une autre classe en utilisant le mot-clé extends dans la déclaration. Il n'est pas possible d'étendre de multiples classes : une classe peut uniquement hériter d'une seule classe de base.

Les méthodes et membres hérités peuvent être surchargés, à moins que la classe parente ait défini une méthode comme final. Pour surcharger, il suffit de déclarer à nouveau la méthode avec le même nom que celui défini dans la classe parente. Il est possible d'accéder à une méthode ou un membre statique avec l'opérateur parent::

Exemple #7 Héritage d'une classe simple

<?php
class ExtendClass extends SimpleClass
{
  
// Redéfinition de la méthode parent
  
function displayVar()
  {
    echo 
"Classe étendue\n";
    
parent::displayVar();
  }
}

$extended = new ExtendClass();
$extended->displayVar();
?>

L'exemple ci-dessus va afficher :

Classe étendue
une valeur par défaut


add a note add a note User Contributed Notes
Syntaxe de base
Jeffrey
09-Oct-2008 12:49
A PHP Class can be used for several things, but at the most basic level, you'll use classes to "organize and deal with like-minded data". Here's what I mean by "organizing like-minded data". First, start with unorganized data.

<?php
$customer_name
;
$item_name;
$item_price;
$customer_address;
$item_qty;
$item_total;
?>

Now to organize the data into PHP classes:

<?php
class Customer {
 
$name;          // same as $customer_name
 
$address;       // same as $customer_address
}

class
Item {
 
$name;          // same as $item_name
 
$price;         // same as $item_price
 
$qty;           // same as $item_qty
 
$total;         // same as $item_total
}
?>

Now here's what I mean by "dealing" with the data. Note: The data is already organized, so that in itself makes writing new functions extremely easy.

<?php
class Customer {
  public
$name, $address;                   // the data for this class...

  // function to deal with user-input / validation
  // function to build string for output
  // function to write -> database
  // function to  read <- database
  // etc, etc
}

class
Item {
  public
$name, $price, $qty, $total;        // the data for this class...

  // function to calculate total
  // function to format numbers
  // function to deal with user-input / validation
  // function to build string for output
  // function to write -> database
  // function to  read <- database
  // etc, etc
}
?>

Imagination that each function you write only calls the bits of data in that class. Some functions may access all the data, while other functions may only access one piece of data. If each function revolves around the data inside, then you have created a good class.
wbcarts at juno dot com
21-Aug-2008 03:11
CLASSES and OBJECTS that represent the "Ideal World"

Wouldn't it be great to get the lawn mowed by saying $son->mowLawn()? Assuming the function mowLawn() is defined, and you have a son that doesn't throw errors, the lawn will be mowed.

In the following example; let objects of type Line3D measure their own length in 3-dimensional space. Why should I or PHP have to provide another method from outside this class to calculate length, when the class itself holds all the neccessary data and has the education to make the calculation for itself?

<?php

/*
 * Point3D.php
 *
 * Represents one locaton or position in 3-dimensional space
 * using an (x, y, z) coordinate system.
 */
class Point3D
{
    public
$x;
    public
$y;
    public
$z;                  // the x coordinate of this Point.

    /*
     * use the x and y variables inherited from Point.php.
     */
   
public function __construct($xCoord=0, $yCoord=0, $zCoord=0)
    {
       
$this->x = $xCoord;
   
$this->y = $yCoord;
       
$this->z = $zCoord;
    }

   
/*
     * the (String) representation of this Point as "Point3D(x, y, z)".
     */
   
public function __toString()
    {
        return
'Point3D(x=' . $this->x . ', y=' . $this->y . ', z=' . $this->z . ')';
    }
}

/*
 * Line3D.php
 *
 * Represents one Line in 3-dimensional space using two Point3D objects.
 */
class Line3D
{
   
$start;
   
$end;

    public function
__construct($xCoord1=0, $yCoord1=0, $zCoord1=0, $xCoord2=1, $yCoord2=1, $zCoord2=1)
    {
       
$this->start = new Point3D($xCoord1, $yCoord1, $zCoord1);
       
$this->end = new Point3D($xCoord2, $yCoord2, $zCoord2);
    }

   
/*
     * calculate the length of this Line in 3-dimensional space.
     */
   
public function getLength()
    {
        return
sqrt(
           
pow($this->start->x - $this->end->x, 2) +
           
pow($this->start->y - $this->end->y, 2) +
           
pow($this->start->z - $this->end->z, 2)
        );
    }

   
/*
     * The (String) representation of this Line as "Line3D[start, end, length]".
     */
   
public function __toString()
    {
        return
'Line3D[start=' . $this->start .
           
', end=' . $this->end .
           
', length=' . $this->getLength() . ']';
    }
}

/*
 * create and display objects of type Line3D.
 */
echo '<p>' . (new Line3D()) . "</p>\n";
echo
'<p>' . (new Line3D(0, 0, 0, 100, 100, 0)) . "</p>\n";
echo
'<p>' . (new Line3D(0, 0, 0, 100, 100, 100)) . "</p>\n";

?>

  <--  The results look like this  -->

Line3D[start=Point3D(x=0, y=0, z=0), end=Point3D(x=1, y=1, z=1), length=1.73205080757]

Line3D[start=Point3D(x=0, y=0, z=0), end=Point3D(x=100, y=100, z=0), length=141.421356237]

Line3D[start=Point3D(x=0, y=0, z=0), end=Point3D(x=100, y=100, z=100), length=173.205080757]

My absolute favorite thing about OOP is that "good" objects keep themselves in check. I mean really, it's the exact same thing in reality... like, if you hire a plumber to fix your kitchen sink, wouldn't you expect him to figure out the best plan of attack? Wouldn't he dislike the fact that you want to control the whole job? Wouldn't you expect him to not give you additional problems? And for god's sake, it is too much to ask that he cleans up before he leaves?

I say, design your classes well, so they can do their jobs uninterrupted... who like bad news? And, if your classes and objects are well defined, educated, and have all the necessary data to work on (like the examples above do), you won't have to micro-manage the whole program from outside of the class. In other words... create an object, and LET IT RIP!
ashraf dot samhouri at hotmail dot com
24-May-2008 03:35
@info -- 20-April

This is because you requested class "b" before defining it, not because you defined class "b" before "a". It doesn't make a difference which class you define first.
info at youwanttoremovethisvakantiebaas dot nl
21-Apr-2008 12:40
if you do this
<?php

$x
= new b();

class
b extends a {}

class
a { }

?>
PHP will tell you "class b not found", because you've defined class b before a. However, the error tells you something different.... Got me a little confused :)
david dot schueler at tel-billig dot de
15-Feb-2008 03:16
If you just want to create a new object that extends another object and you want to copy all variables from the father object, you may use this piece of code:
<?php
$father
=& new father();
$father->a_var = "Hello World.";

$son = new son($event);

$son->say_hello();

class
father {
    public
$a_var;
}

class
son extends father {
    public function
__construct($father_class) {
        foreach (
$father_class as $variable=>$value) {
           
$this->$variable = $value;
        }
    }

    public function
say_hello() {
        echo
"Son says: ".$this->a_var;
    }
}
?>
This outputs:

Son says: Hello World.

So you dont have to clone the entire object to get the contents of the variables from the father object.
aaron at thatone dot com
16-Dec-2007 03:46
I was confused at first about object assignment, because it's not quite the same as normal assignment or assignment by reference. But I think I've figured out what's going on.

First, think of variables in PHP as data slots. Each one is a name that points to a data slot that can hold a value that is one of the basic data types: a number, a string, a boolean, etc. When you create a reference, you are making a second name that points at the same data slot. When you assign one variable to another, you are copying the contents of one data slot to another data slot.

Now, the trick is that object instances are not like the basic data types. They cannot be held in the data slots directly. Instead, an object's "handle" goes in the data slot. This is an identifier that points at one particular instance of an obect. So, the object handle, although not directly visible to the programmer, is one of the basic datatypes.

What makes this tricky is that when you take a variable which holds an object handle, and you assign it to another variable, that other variable gets a copy of the same object handle. This means that both variables can change the state of the same object instance. But they are not references, so if one of the variables is assigned a new value, it does not affect the other variable.

<?php
// Assignment of an object
Class Object{
   public
$foo="bar";
};

$objectVar = new Object();
$reference =& $objectVar;
$assignment = $objectVar

//
// $objectVar --->+---------+
//                |(handle1)----+
// $reference --->+---------+   |
//                              |
//                +---------+   |
// $assignment -->|(handle1)----+
//                +---------+   |
//                              |
//                              v
//                  Object(1):foo="bar"
//
?>

$assignment has a different data slot from $objectVar, but its data slot holds a handle to the same object. This makes it behave in some ways like a reference. If you use the variable $objectVar to change the state of the Object instance, those changes also show up under $assignment, because it is pointing at that same Object instance.

<?php
$objectVar
->foo = "qux";
print_r( $objectVar );
print_r( $reference );
print_r( $assignment );

//
// $objectVar --->+---------+
//                |(handle1)----+
// $reference --->+---------+   |
//                              |
//                +---------+   |
// $assignment -->|(handle1)----+
//                +---------+   |
//                              |
//                              v
//                  Object(1):foo="qux"
//
?>

But it is not exactly the same as a reference. If you null out $objectVar, you replace the handle in its data slot with NULL. This means that $reference, which points at the same data slot, will also be NULL. But $assignment, which is a different data slot, will still hold its copy of the handle to the Object instance, so it will not be NULL.

<?php
$objectVar
= null;
print_r($objectVar);
print_r($reference);
print_r($assignment);

//
// $objectVar --->+---------+
//                |  NULL   |
// $reference --->+---------+
//                          
//                +---------+
// $assignment -->|(handle1)----+
//                +---------+   |
//                              |
//                              v
//                  Object(1):foo="qux"
?>
alan at alan-ng dot net
10-Oct-2007 06:41
The following odd behavior happens in php version 5.1.4 (and presumably some other versions) that does not happen in php version 5.2.1 (and possibly other versions > 5.1.4).

<?php

$_SESSION
['instance']=...;

$instance=new SomeClass;

?>

The second line will not only create the $instance object successfully, it will also modify the value of $_SESSION['instance']!

The workaround I arrived at, after trial and error, was to avoid  using object names which match a $_SESSION array key.

This is not intended to be a bug report, since it was apparently fixed by version 5.2.1, so it's just a workaround suggestion.
mep_eisen at web dot de
10-Aug-2007 03:06
referring to steven's post:
****
Perhaps this is because =& statements join the 2 variable names in the symbol table, whereas = statements applied to objects simply create a new independent entry in the symbol table that simply points to the same location as other entries. I don't know for sure - I don't think this behavior is documented in the PHP manual, so perhaps somebody with more knowledge of PHP's internals can clarify what is going on.
****

lets talk about
a =& b;
b = c;

PHP internally marks a to be a reference to b. If You reassign b PHP does not update a. But if you access a once more PHP looks at the current value of b (now containing c).

Both statements (a=b and a=&b) seem to do the same but they don't. However this changed for objects from PHP4 to PHP5. Where PHP4 needed this operator to avoid object cloning, PHP5 does not need it.

It is explained in chapter 21 (References Explained). It's important to understand that a becomes a reference and the following code will not modify b:
a =& b;
a =& c;
Dan Dascalescu
27-Oct-2006 08:00
If E_STRICT is enabled, the first example will generate the following error (and a few others akin to it):

Non-static method A::foo() should not be called statically on line 26

The example should have explicitly declared the methods foo() and bar() as static:

class A                                                                                                                            
{                                                                                                                                  
    static function foo()                                                                                                          
    {
...

 
show source | credits | sitemap | contact | advertising | mirror sites