mirror of
https://github.com/macintoshplus/doc-fr.git
synced 2026-03-25 17:32:07 +01:00
368 lines
9.7 KiB
XML
368 lines
9.7 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- EN-Revision: f889672ad19529e56088990626b9b9f656e4115d Maintainer: yannick Status: ready -->
|
|
<!-- Reviewed: no -->
|
|
<sect1 xml:id="language.oop5.properties" xmlns="http://docbook.org/ns/docbook">
|
|
<title>Propriétés</title>
|
|
|
|
<para>
|
|
Les variables au sein d'une classe sont appelées <emphasis>propriétés</emphasis>.
|
|
On peut également les retrouver sous d'autres dénominations tel que
|
|
<emphasis>champs</emphasis>, mais pour cette documentation
|
|
<emphasis>propriété</emphasis> sera utilisé.
|
|
Elles sont définies en utilisant au moins un modificateur (tel que
|
|
<xref linkend="language.oop5.visibility"/>,
|
|
<xref linkend="language.oop5.static"/>, ou, à partir de PHP 8.1.0,
|
|
<link linkend="language.oop5.properties.readonly-properties">readonly</link>),
|
|
suivi optionnellement (sauf pour les propriétés <code>readonly</code>),
|
|
à partir de PHP 7.4, d'une déclaration de type,
|
|
suivi d'une déclaration classique de variable.
|
|
Cette déclaration peut comprendre une initialisation, mais celle-ci doit
|
|
être une valeur <link linkend="language.constants">constante</link>
|
|
</para>
|
|
<note>
|
|
<para>
|
|
Une manière obsolète de déclarer une propriété de classe est d'utiliser
|
|
le mot-clé <literal>var</literal> au lieu d'un modificateur.
|
|
</para>
|
|
</note>
|
|
<note>
|
|
<simpara>
|
|
Une propriété déclarée sans modificateur de <xref linkend="language.oop5.visibility"/>
|
|
sera déclarée comme <literal>public</literal>.
|
|
</simpara>
|
|
</note>
|
|
<para>
|
|
Au sein des méthodes de classes, les propriétés non statiques peuvent être
|
|
appelées en utilisant la syntaxe <literal>-></literal> (opérateur de l'objet) :
|
|
<varname>$this->property</varname> (où <literal>property</literal> est le
|
|
nom de la propriété). Les propriétés statiques peuvent être appelées en
|
|
utilisant la syntaxe <literal>::</literal> (deux doubles points) :
|
|
<varname>self::$property</varname>. Reportez-vous à la documentation sur
|
|
<xref linkend="language.oop5.static" /> pour plus d'informations
|
|
sur la différence entre les propriétés statiques et non statiques.
|
|
</para>
|
|
<para>
|
|
La pseudo-variable <varname>$this</varname> est disponible au sein de n'importe
|
|
quelle méthode, lorsque cette méthode est appelée au sein d'un objet.
|
|
<varname>$this</varname> est la valeur de l'objet appelant.
|
|
</para>
|
|
|
|
<para>
|
|
<example>
|
|
<title>Déclarations de propriétés</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
class SimpleClass
|
|
{
|
|
public $var1 = 'hello ' . 'world';
|
|
public $var2 = <<<EOD
|
|
hello world
|
|
EOD;
|
|
public $var3 = 1+2;
|
|
// déclaration de propriété invalide :
|
|
public $var4 = self::myStaticMethod();
|
|
public $var5 = $myVar;
|
|
|
|
// Déclarations valides de propriétés :
|
|
public $var6 = myConstant;
|
|
public $var7 = [true, false];
|
|
public $var8 = <<<'EOD'
|
|
hello world
|
|
EOD;
|
|
|
|
// Sans modificateur de visibilité :
|
|
static $var9;
|
|
readonly int $var10;
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
|
|
<note>
|
|
<para>
|
|
Il existe des fonctions diverses qui permettent de gérer des classes et des objets.
|
|
Voir la référence sur les <link linkend="ref.classobj">Fonctions Classes/Objets</link>.
|
|
</para>
|
|
</note>
|
|
|
|
<sect2 xml:id="language.oop5.properties.typed-properties">
|
|
<title>Déclarations des types</title>
|
|
|
|
<para>
|
|
À partir de PHP 7.4.0, les définitions de propriétés peuvent inclure une
|
|
<xref linkend="language.types.declarations" />,
|
|
avec l'exception du type <literal>callable</literal>.
|
|
<example>
|
|
<title>Exemple de propriétés typées</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
class User
|
|
{
|
|
public int $id;
|
|
public ?string $name;
|
|
|
|
public function __construct(int $id, ?string $name)
|
|
{
|
|
$this->id = $id;
|
|
$this->name = $name;
|
|
}
|
|
}
|
|
|
|
$user = new User(1234, null);
|
|
|
|
var_dump($user->id);
|
|
var_dump($user->name);
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
&example.outputs;
|
|
<screen>
|
|
<![CDATA[
|
|
int(1234)
|
|
NULL
|
|
]]>
|
|
</screen>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
Les propriétés typées doivent être initialisées avant d'y accéder, sinon,
|
|
une <classname>Error</classname> sera émise.
|
|
<example>
|
|
<title>Accès aux propriétés</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
class Shape
|
|
{
|
|
public int $numberOfSides;
|
|
public string $name;
|
|
|
|
public function setNumberOfSides(int $numberOfSides): void
|
|
{
|
|
$this->numberOfSides = $numberOfSides;
|
|
}
|
|
|
|
public function setName(string $name): void
|
|
{
|
|
$this->name = $name;
|
|
}
|
|
|
|
public function getNumberOfSides(): int
|
|
{
|
|
return $this->numberOfSides;
|
|
}
|
|
|
|
public function getName(): string
|
|
{
|
|
return $this->name;
|
|
}
|
|
}
|
|
|
|
$triangle = new Shape();
|
|
$triangle->setName("triangle");
|
|
$triangle->setNumberofSides(3);
|
|
var_dump($triangle->getName());
|
|
var_dump($triangle->getNumberOfSides());
|
|
|
|
$circle = new Shape();
|
|
$circle->setName("circle");
|
|
var_dump($circle->getName());
|
|
var_dump($circle->getNumberOfSides());
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
&example.outputs;
|
|
<screen>
|
|
<![CDATA[
|
|
string(8) "triangle"
|
|
int(3)
|
|
string(6) "circle"
|
|
|
|
Fatal error: Uncaught Error: Typed property Shape::$numberOfSides must not be accessed before initialization
|
|
]]>
|
|
</screen>
|
|
</example>
|
|
</para>
|
|
</sect2>
|
|
|
|
<sect2 xml:id="language.oop5.properties.readonly-properties">
|
|
<title>Propriétés en lecture seule (readonly)</title>
|
|
<para>
|
|
À partir de PHP 8.1.0, une propriété peut être déclarée avec le modificateur <code>readonly</code>,
|
|
qui empêche la modification de la propriété après l'initialisation.
|
|
<example>
|
|
<title>Exemple de propriétés en lecture seule</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
class Test {
|
|
public readonly string $prop;
|
|
|
|
public function __construct(string $prop) {
|
|
// Initialization légale.
|
|
$this->prop = $prop;
|
|
}
|
|
}
|
|
|
|
$test = new Test("foobar");
|
|
// Lecture légale.
|
|
var_dump($test->prop); // string(6) "foobar"
|
|
|
|
// Réaffectation illégal. Ce n'importe pas que la valeur assigné soit identique.
|
|
$test->prop = "foobar";
|
|
// Error: Cannot modify readonly property Test::$prop
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
<note>
|
|
<para>
|
|
Le modificateur de lecture seule ne peut être appliqué qu'aux
|
|
<link linkend="language.oop5.properties.typed-properties">propriétés typées</link>.
|
|
Une propriété en lecture seule sans contrainte de type peut être créée en
|
|
utilisant le type <xref linkend="language.types.declarations.mixed" />.
|
|
</para>
|
|
</note>
|
|
<note>
|
|
<para>
|
|
Les propriétés statiques en lecture seule ne sont pas supportées.
|
|
</para>
|
|
</note>
|
|
</para>
|
|
<para>
|
|
Une propriété en lecture seule ne peut être initialisée qu'une seule fois,
|
|
et seulement depuis la portée dans laquelle elle a été déclarée.
|
|
Tout autre affectation ou modification de la propriété résultera en une
|
|
exception <classname>Error</classname>.
|
|
<example>
|
|
<title>Initialisation illégale de propriétés en lecture seule</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
class Test1 {
|
|
public readonly string $prop;
|
|
}
|
|
|
|
$test1 = new Test1;
|
|
// Initialisation illégale en dehors de la portée privée.
|
|
$test1->prop = "foobar";
|
|
// Error: Cannot initialize readonly property Test1::$prop from global scope
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
<note>
|
|
<para>
|
|
Spécifier une valeur par défaut explicite à une propriété en lecture seule
|
|
n'est pas autorisé, car une propriété en lecture seule avec une valeur par
|
|
défaut est essentiellement identique à une constante, et par conséquent
|
|
pas particulièrement utile.
|
|
<example>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
class Test {
|
|
// Fatal error: Readonly property Test::$prop cannot have default value
|
|
public readonly int $prop = 42;
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
</note>
|
|
<note>
|
|
<para>
|
|
Les propriétés en lecture seule ne peuvent pas être
|
|
<function>unset</function> une fois qu'elles ont été initialisées.
|
|
Cependant, il est possible de unset une propriété en lecture seule avant
|
|
son initialisation, depuis la portée où la propriété a été déclarée.
|
|
</para>
|
|
</note>
|
|
<para>
|
|
Les modifications ne sont pas nécessairement des affectations simples,
|
|
tous les exemples suivants résulteront en une exception <classname>Error</classname> :
|
|
<example>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
class Test {
|
|
public function __construct(
|
|
public readonly int $i = 0,
|
|
public readonly array $ary = [],
|
|
) {}
|
|
}
|
|
|
|
$test = new Test;
|
|
$test->i += 1;
|
|
$test->i++;
|
|
++$test->i;
|
|
$test->ary[] = 1;
|
|
$test->ary[0][] = 1;
|
|
$ref =& $test->i;
|
|
$test->i =& $ref;
|
|
byRef($test->i);
|
|
foreach ($test as &$prop);
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
Cependant, les propriétés en lecture seule n'excluent pas la mutabilité intérieure.
|
|
Les objets (ou ressources) stockés dans les propriétés en lecture seule
|
|
peuvent toujours être modifiés en interne :
|
|
<example>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
class Test {
|
|
public function __construct(public readonly object $obj) {}
|
|
}
|
|
|
|
$test = new Test(new stdClass);
|
|
// Mutation interne légale.
|
|
$test->obj->foo = 1;
|
|
// Réaffectation illégale.
|
|
$test->obj = new stdClass;
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
</sect2>
|
|
|
|
</sect1>
|
|
<!-- Keep this comment at the end of the file
|
|
Local variables:
|
|
mode: sgml
|
|
sgml-omittag:t
|
|
sgml-shorttag:t
|
|
sgml-minimize-attributes:nil
|
|
sgml-always-quote-attributes:t
|
|
sgml-indent-step:1
|
|
sgml-indent-data:t
|
|
indent-tabs-mode:nil
|
|
sgml-parent-document:nil
|
|
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
|
sgml-exposed-tags:nil
|
|
sgml-local-catalogs:nil
|
|
sgml-local-ecat-files:nil
|
|
End:
|
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
|
vim: et tw=78 syn=sgml
|
|
vi: ts=1 sw=1
|
|
-->
|