php-doc-en/language/oop5/constants.xml
Christoph Michael Becker 6937b29491 Class constants are allocated once per class
We try to get rid of the myth that class constants were allocated for each
instance, as claimed by user note 112286. Proof: <https://3v4l.org/3DKMC>.

git-svn-id: https://svn.php.net/repository/phpdoc/en/trunk@339824 c90b9560-bf6c-de11-be94-00142212c4b1
2016-08-09 11:32:38 +00:00

155 lines
3.5 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<sect1 xml:id="language.oop5.constants" xmlns="http://docbook.org/ns/docbook">
<title>Class Constants</title>
<para>
It is possible to define constant values on a per-class basis remaining the
same and unchangeable. Constants differ from normal variables in that you
don't use the <varname>$</varname> symbol to declare or use them.
The default visibility of class constants is <literal>public</literal>.
</para>
<para>
The value must be a constant expression, not (for example) a variable, a
property, or a function call.
</para>
<para>
It's also possible for interfaces to have <literal>constants</literal>. Look at
the <link linkend="language.oop5.interfaces">interface documentation</link> for
examples.
</para>
<para>
As of PHP 5.3.0, it's possible to reference the class using a variable.
The variable's value can not be a keyword (e.g. <literal>self</literal>,
<literal>parent</literal> and <literal>static</literal>).
</para>
<para>
Note that class constants are allocated once per class, and not for each
class instance.
</para>
<example>
<title>Defining and using a constant</title>
<programlisting role="php">
<![CDATA[
<?php
class MyClass
{
const CONSTANT = 'constant value';
function showConstant() {
echo self::CONSTANT . "\n";
}
}
echo MyClass::CONSTANT . "\n";
$classname = "MyClass";
echo $classname::CONSTANT . "\n"; // As of PHP 5.3.0
$class = new MyClass();
$class->showConstant();
echo $class::CONSTANT."\n"; // As of PHP 5.3.0
?>
]]>
</programlisting>
</example>
<example>
<title>Static data example</title>
<programlisting role="php">
<![CDATA[
<?php
class foo {
// As of PHP 5.3.0
const BAR = <<<'EOT'
bar
EOT;
// As of PHP 5.3.0
const BAZ = <<<EOT
baz
EOT;
}
?>
]]>
</programlisting>
</example>
<note>
<para>
Support for initializing constants with Heredoc and Nowdoc syntax was added in PHP 5.3.0.
</para>
</note>
<example>
<title>Constant expression example</title>
<programlisting role="php">
<![CDATA[
<?php
const ONE = 1;
class foo {
// As of PHP 5.6.0
const TWO = ONE * 2;
const THREE = ONE + self::TWO;
const SENTENCE = 'The value of THREE is '.self::THREE;
}
?>
]]>
</programlisting>
<para>
It is possible to provide a scalar expression involving numeric and string literals and/or constants in context of a class constant.
</para>
</example>
<note>
<para>
Constant expression support was added in PHP 5.6.0.
</para>
</note>
<example>
<title>Class constant visibility modifiers</title>
<programlisting role="php">
<![CDATA[
<?php
class Foo {
// As of PHP 7.1.0
public const BAR = 'bar';
private const BAZ = 'baz';
}
echo Foo::BAR, PHP_EOL;
echo Foo::BAR, PHP_EOL;
?>
]]>
</programlisting>
&example.outputs.71;
<screen>
<![CDATA[
bar
Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in …
]]>
</screen>
</example>
<note>
<para>
As of PHP 7.1.0 visibility modifiers are allowed for class constants.
</para>
</note>
</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
-->