[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Магия и инкапсуляция
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
twin
Цитата (MiksIr @ 13.10.2013 - 09:35)
Исключительно для облегчения результатов дебага.

Ну вот. Один про визуальную схожесть утверждал, второй про облегчение дебага. Вот суть то как раз не меняется.
Есть попытка обратиться к приватному свойству. Интерпретатор реагирует адекватно - не лезь. Закрыто. Варнинг, ужо я тебя. Все логично - инкапсуляция.
Цитата
Суть в том - что добраться в не можете.

Вот именно. Не могу добраться, и нечего дергаться значит. Приватное свойство ограничивается областью видимости класса. Обращение из интерфейса (пусть даже к одноименному свойству) должно пресекаться на корню, ибо нех. Ибо это инкапсуляция. И я должен знать, что полез ошибочно туда, куда нельзя. Значит должно выдать варнинг. А оно мне вместо ошибки магию подсовывает. А там черти чё может быть накручено, мало ли. Кроме того, документация. PHPDOC тот же. Показывает, что свойство приватно, а в коде я вижу бесцеремонное к нему обращение. Это не логично.

Цитата
Вполне логично, если понимать суть.
Понимание сути логики не добавит. Если я понимаю свою жену, это не значит, что она рассуждает логично.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
twin
MiksIr
Цитата
Но в PHP это не так, вернее не только так. Это еще может быть и синтаксический сахар, обращение к виртуальному публичному свойству. Функционал этой виртуальности обслуживает сеттер и геттер.
Виртуальные свойства никакого отношения к внутренним свойствам класса не имеют.
Блин! Так а я про что! Я же не говорю, что это не так, я говорю - это не должно быть так. По логике вещей.

То, что это существует и есть нарушение принципа инкапсуляции. Не должно быть виртуальных свойств, созвучных с приватными, которые так неадекватно реагируют на к ним обращение. Как различить, приватное оно или виртуальное? Я обозначил приватным и нечего крутиться вокруг да около)))

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
OleKh
Может быть проблема просто в том, чтобы правильно объявить свойство потребуется UML диаграмма. И если свойство объявлено private и к нему есть возможность обратиться через магический метод __get(), это не означает уязвимость свойства злоумышленниками и нарушение принципа инкапсуляции, а продуманное решение. Например, есть класс работники, от которого наследуются, рабочие и начальники, есть свойство - зарплата начальника, приватное, но к примеру начальник по всем вопросам) может посмотреть это свойство и тут __get(). Верно?
Guest
А если зарплата считается по разному у всех )
Должно быть getSalary();
twin
Цитата (MiksIr @ 13.10.2013 - 10:31)
Представьте себе, что ваш класс скомпилирован, и вы ваще не можете узнать какие там внутри свойства. Но у вас есть описание публичных свойств, с которыми вы можете работать. Что изменится от того, что публичные свойства будут виртуальные и совпадать где-то внутри класса с приватными свойствами? Ни-че-го. Вы об этом даже и не узнаете, так как не сможете заглянуть в исходники. Есть нарушение инкапсуляции? Нет - вы работаете с публичными свойствами, реализация скрыта. О том, какими механизмами языка реализован интерфейс, как происходят наименования и т.п. - инкапсуляции пофиг.

Это логично с точки зрения пользователя. Но инкапсуляция касается не только его, а и разработчика класса. И вот тут неувязочка. Та самая лазейка.

О чем тут и разборка. Если разработчик объявил свойство приватным, установил сеттер и скомпилировал класс, ему будет нужно предоставить мне возможность обратиться к свойству. Ведь так? Иначе зачем такой сеттер нужен. А значит он должен предоставить мне интерфейс, где будет указано, что обращаться можно, значит оно публично.

Я, как юзер, этого может и не узнаю никогда, что оно приватно, но как минимум это нечестно и нелогично, как максимум - нарушение принципа инкапсуляции.

Да, суть такова, я не спорю. Пусть они разные, хотя и ведут себя как одно. Но это все нехорошо. Об чем и речь.

Цитата
Это ваше мнение, которое к реальному положению вещей отношения не имеет.
А я не говорил, что имеет. Я говорил, что реальное положение вещей нелогично.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Гость_Alan
MiksIr
Цитата
У вас есть возможность вызвать публичный метод __get.


twin больше сетует на сеттер в его уязвимости обратится напрямую к приватному свойству.
И здесь действительно есть лазейка для горе разработчика.
OleKh
Цитата (MiksIr @ 13.10.2013 - 12:52)
У вас нет возможности обратится к private свойству извне. Никак.

Пример из учебника

class Person {
private $Age = 'Bob';
function __get( $property ) {
$method = "get{$property}";
if ( method_exists( $this, $method ) ) {
return $this->$method();
}
}


function getAge() {
return $this->Age;
}
}


$p = new Person();[
print $p->Age;
Гость_Alan
Так вот в том то и весь смысл что инкапсуляция свойств и нужна для того что бы не дать возможность сменить значение закрытого свойства из вне. Здесь напрямую это происходит.
Тогда пропадает весь смысл и она становится "открытой". Этой уже проблеме лет и лет, когда только ввели магические методы. Поищите, это критикуется везде.

Guest
Гость_Alan
Здесь напрямую это происходит.


Именно в таком примере.
class A {
private $foo;
private $bar;

public function __set($name, $value) {
if ($name == 'foo') {
$this->bar = $value;
} else {
throw new Exception('Нет такого свойства');
}
}
}


(new A())->foo = 'some';


Почему тогда не открыть $bar?
twin
Цитата (MiksIr @ 13.10.2013 - 11:01)
Это набор фраз, показывающих, что вы сами не очень понимаете то, что пытаетесь сказать.
Переформулируйте, пожалуйста.

Да легко.

Вот я разработчик и пишу класс (оставим в покое рукожопство, тут суть важна):
class Example
{

private $a = 1;

function __get($a)
{
return $this->$a;
}
}

Компилирую его и отдаю пользовтелю (ну другому разработчику). Как я должен описать интерфейс?

Я должен предоставить ему доступ к свойству. Но я не могу описать его таким, каким оно объявлено в классе - приватным. Ибо вы сами сказали, приватных свойств снаружи нет. Я должен обозначить, что оно публично. А это противоречит логике.

Да, вы сейчас скажите - ничего страшного, ведь это разные свойства. Одно внутри, другое снаружи. Так оно и есть по сути. Но не по логике.

По логике я, как слабый начинающий прогер, не знаю о виртуальных свойствах и понятия не имею про синтаксический сахар. Я знаю определение инкапсуляции и вижу попытку обратиться к привтному свойству. Это логично, хотя по сути не верно.

Вот о том я и говорю. Я на 100% уверен, что для подавляющего большинства читателей это открытие, что свойства вдруг оказываются разными. Это нигде толком не описано. Наоборот, везде, даже в интерпретаторе, говорится, что идет ПРЯМОЕ обращение к свойству класса.

И это плохо, это не логично и это бестолково. Может с точки зрения реализации языка и верно, я до такого уровня не дорос. Но ЯП разрабатывется для программиста, а значит должен быть предельно логичен.

По логике вещей при обращении к одноименнму с приватным виртуальному свойству должна быть ошибка. Что и есть на самом деле. Какого фига так нелогично её давит магия?

Это не логично и тут меня ни кто не переубедит.



_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.