class TestClass
{
private string _privateString = "hello";
void ChangeData()
{
TestClass otherTestClass = new TestClass();
otherTestClass._privateString = "world";
}
}
Этот код компилируется в С#, и эквивалент работает в PHP, но может ли кто-нибудь объяснить причину, по которой otherTestClass._privateString
можно изменить здесь?
Я бы подумал, что экземпляр класса не сможет изменять переменную частного члена ни при каких обстоятельствах, и что попытка доступа к otherTestClass._privateString
даст ошибку "недосягаемый из-за уровня защиты".
Это не так, поэтому, почему создание экземпляра объекта внутри его собственного класса позволяет вам получить доступ к закрытым членам? И должно ли это, разве это не разрывает инкапсуляцию до такой степени? Или я пропущу что-то очевидное?
- (Я не спрашиваю, является ли вышеуказанный класс дизайном хорошей практикой, просто интересуется теорией, стоящей за ней.)
Изменить - Спасибо за ответы и комментарии. Чтобы уточнить, мне также интересно узнать, является ли возможность сделать это, считается положительной особенностью, или если это необходимый компромисс для лучшей проверки времени компиляции/ясности кода/потому что большинство других языков делает это так или иначе. Мне кажется, что в идеале компилятор предупредил бы вас об этом, но тогда я далек от разработчика языка. Любые примеры того, как именно это позволяет вам сделать что-то полезное (без нарушения инкапсуляции), которое в противном случае было бы трудным или невозможным, было бы здорово.