mirror of
https://github.com/php/doc-ru.git
synced 2026-04-26 08:48:12 +02:00
321 lines
9.5 KiB
XML
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
|
|
-->
|