1
0
mirror of https://github.com/php/doc-ru.git synced 2026-04-26 08:48:12 +02:00
Files
archived-doc-ru/language/oop5/visibility.xml
T
2024-01-10 23:24:39 +03:00

321 lines
9.5 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: f5e5b54129045a7d02c5285a88cea0abff8ffb6f Maintainer: irker Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.oop5.visibility" xmlns="http://docbook.org/ns/docbook">
<title>Область видимости</title>
<para>
Область видимости свойства, метода или константы (начиная c PHP 7.1.0) определяют,
добавляя перед объявлением ключевое слово: <literal>public</literal>,
<literal>protected</literal> или <literal>private</literal>. Доступ к свойствам
и методам класса, объявленным как public (общедоступный), разрешён отовсюду.
Модификатор protected (защищённый) разрешает доступ самому классу, наследующим его классам и родительским классам.
Модификатор private (закрытый) ограничивает область видимости так, что только класс,
где объявлен сам элемент, имеет к нему доступ.
</para>
<sect2 xml:id="language.oop5.visibility-members">
<title>Область видимости свойства</title>
<para>
Свойства класса могут быть определены как public, private или protected.
Свойства, объявленные без явного ключевого слова области видимости,
определяются как общедоступные (public).
</para>
<para>
<example>
<title>Объявление свойства класса</title>
<programlisting role="php">
<![CDATA[
<?php
/**
* Определение MyClass
*/
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj = new MyClass();
echo $obj->public; // Работает
echo $obj->protected; // Неисправимая ошибка
echo $obj->private; // Неисправимая ошибка
$obj->printHello(); // Выводит Public, Protected и Private
/**
* Определение MyClass2
*/
class MyClass2 extends MyClass
{
// Мы можем переопределить общедоступные и защищённые свойства, но не закрытые
public $public = 'Public2';
protected $protected = 'Protected2';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj2 = new MyClass2();
echo $obj2->public; // Работает
echo $obj2->private; // Неопределён
echo $obj2->protected; // Неисправимая ошибка
$obj2->printHello(); // Выводит Public2, Protected2, Undefined
?>
]]>
</programlisting>
</example>
</para>
</sect2>
<sect2 xml:id="language.oop5.visiblity-methods">
<title>Область видимости метода</title>
<para>
Методы класса могут быть определены как public, private или protected.
Методы, объявленные без указания области видимости, определяются как public.
</para>
<para>
<example>
<title>Объявление метода</title>
<programlisting role="php">
<![CDATA[
<?php
/**
* Определение MyClass
*/
class MyClass
{
// Объявление общедоступного конструктора
public function __construct() { }
// Объявление общедоступного метода
public function MyPublic() { }
// Объявление защищённого метода
protected function MyProtected() { }
// Объявление закрытого метода
private function MyPrivate() { }
// Это общедоступный метод
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}
$myclass = new MyClass;
$myclass->MyPublic(); // Работает
$myclass->MyProtected(); // Неисправимая ошибка
$myclass->MyPrivate(); // Неисправимая ошибка
$myclass->Foo(); // Работает общедоступный, защищённый и закрытый
/**
* Определение MyClass2
*/
class MyClass2 extends MyClass
{
// Это общедоступный метод
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate(); // Неисправимая ошибка
}
}
$myclass2 = new MyClass2;
$myclass2->MyPublic(); // Работает
$myclass2->Foo2(); // Работает общедоступный и защищённый, закрытый не работает
class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}
public function testPublic() {
echo "Bar::testPublic\n";
}
private function testPrivate() {
echo "Bar::testPrivate\n";
}
}
class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublic\n";
}
private function testPrivate() {
echo "Foo::testPrivate\n";
}
}
$myFoo = new Foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic
?>
]]>
</programlisting>
</example>
</para>
</sect2>
<sect2 xml:id="language.oop5.visiblity-constants">
<title>Область видимости констант</title>
<para>
Начиная с PHP 7.1.0, константы класса могут быть определены как public, private или
protected. Константы, объявленные без указания области видимости,
определяются как public.
</para>
<para>
<example>
<title>Объявление констант, начиная с PHP 7.1.0</title>
<programlisting role="php">
<![CDATA[
<?php
/**
* Объявление класса MyClass
*/
class MyClass
{
// Объявление общедоступной константы
public const MY_PUBLIC = 'public';
// Объявление защищённой константы
protected const MY_PROTECTED = 'protected';
// Объявление закрытой константы
private const MY_PRIVATE = 'private';
public function foo()
{
echo self::MY_PUBLIC;
echo self::MY_PROTECTED;
echo self::MY_PRIVATE;
}
}
$myclass = new MyClass();
MyClass::MY_PUBLIC; // Работает
MyClass::MY_PROTECTED; // Неисправимая ошибка
MyClass::MY_PRIVATE; // Неисправимая ошибка
$myclass->foo(); // Выводятся константы public, protected и private
/**
* Объявление класса MyClass2
*/
class MyClass2 extends MyClass
{
// Публичный метод
function foo2()
{
echo self::MY_PUBLIC;
echo self::MY_PROTECTED;
echo self::MY_PRIVATE; // Неисправимая ошибка
}
}
$myclass2 = new MyClass2;
echo MyClass2::MY_PUBLIC; // Работает
$myclass2->foo2(); // Выводятся константы public и protected, но не private
?>
]]>
</programlisting>
</example>
</para>
</sect2>
<sect2 xml:id="language.oop5.visibility-other-objects">
<title>Видимость из других объектов</title>
<para>
Объекты, которые имеют общий тип (наследуются от одного класса), имеют доступ к элементам с модификаторами
private и protected друг друга, даже если не являются одним и тем же экземпляром.
Это объясняется тем, что реализация видимости элементов известна внутри этих объектов.
</para>
<example>
<title>Доступ к элементам с модификатором private из объектов одного типа</title>
<programlisting role="php">
<![CDATA[
<?php
class Test
{
private $foo;
public function __construct($foo)
{
$this->foo = $foo;
}
private function bar()
{
echo 'Доступ к закрытому методу.';
}
public function baz(Test $other)
{
// Мы можем изменить закрытое свойство:
$other->foo = 'привет';
var_dump($other->foo);
// Мы также можем вызвать закрытый метод:
$other->bar();
}
}
$test = new Test('test');
$test->baz(new Test('other'));
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
string(6) "привет"
Доступ к закрытому методу.
]]>
</screen>
</example>
</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
-->