2 августа 2010 г.

Думаете вы все знаете про Public vs. Private ?

Давно заметил, что обычно вопросы про модификаторы доступа в ООП заканчиваются на перечислении public, private, protected и что куда наследуется. Но как показывает практика, большинство людей (включая PHP и C++ ) не задумывается как эти модифиакторы влияют на объекты, считая что оно полностью идентично классам. Но это не так.

Ответе на вопрос: Имеем класс A, у класса есть private свойство $pr. Есть метод, который принимает два значения: int и другого экземпляра класса A. Этот метод изменяет свойство pr переданного экземпляра. Допустит ли это компилятор/транслятор?

Давайте попробуем:
PHP
1
2
3
4
56
7
8
9
1011
12
13
14
1516
17
<?php
class A {
    private $pr = "test";
    public function change($val, A $a) {
        $a->pr = $val;    }
    public function __toString() {
        return (string)$this->pr;
    }
} 
$objOne = new A();
$objTwo = new A();
 
$objOne->change("passed", $objTwo);echo $objTwo;
?>

Каков будет результат выполнения кода? Реакция большинства людей весьма предсказуема: fatal error. Объяснением служит то что мы пытаемся изменить private свойство другого объекта. На самом деле. Необходимо помнить что: модифиакторы доступа (в том числе private) ограничивает доступ по отношению к другим классам, но не объектам. Код выполнится, и пользователь увидит "passed". Поскольку объект работает с одним и тем-же классом. Это основы ООП, поэтому такое поведение должно быть идентично в PHP, C++ и других языках.

2 комментария:

Anatoli Sakhnik комментирует...

Насправді я про це мав був пам’ятати, бо в конструкторах копіювання, наприклад, це використовується постійно:

Foo (Foo& other)
: _a (other._a)
{
}

Але зауваження цінне.

А4 комментирует...

Можно усложнить пример наличием родительского класса и двух дочерних - кто кого сможет обрабатывать и почему

Поиск