Цитата |
А раскройте, пожалуйста, кому именно магия дает возможность нарушить инкапсуляцию? |
Цитата (MiksIr @ 15.10.2013 - 15:26) |
Рефлексия - как раз и есть грязный хак. Рефлексия позволяет нарушить инкапсуляцию _пользователем_ класса. Но рефлексия вообще не имеет отношения к магии, разные механизмы. |
Цитата (MiksIr @ 15.10.2013 - 16:02) | ||
И причем тут язык? Вы нашли _баг_ созданный _разработчиком класса_ и стали его использовать. Магия виновата, что разработчик сделал баг? |
Цитата (twin @ 15.10.2013 - 15:42) | ||
Да ничего она не нарушает, успокойтесь. Нечего нарушать. Я же написал - нет предмета разговора, он пропал еще тогда, когда я написал этот пост. Ошибка моя была в том, что я считал инкапсуляцию задокументированным принципом, как наследовние. Оказалось, что это просто что-то эфимерное. Ваш принцип не нарушает. Мой нарушает. Какой из них верный - судить нельзя. Ибо это весьма абстрактное понятие, инкапсуляция. Нет стандарта, значит есть только ИМХО. glock18 Вась, ты зачем это пишешь? Покрасоваться? Ты не понимаешь, что плюешь в колодец? Если бы не моя упертость, ты многого бы не узнал интересного. Я бы понял, если бы ты что то конструктивное писал, тебя то я чем обидел? |
Цитата |
Ты о чем вообще? Что я интересного узнал "благодаря" твоей упертости? |
Цитата (twin @ 15.10.2013 - 16:15) |
По мне так инкапсуляция, это невозможность обращения. Ошибку я жду. А её нет. Значит и инкапсуляции нет. Но разрабы языка не при чем. Им эта инкапсуляция по барабану. Тем более в моей трактовке. |
class myClass {
protected $items = array();
public function __set($name, $value)
{
$this->items[$name] = $value;
}
public function __get($name)
{
return isset($this->items[$name]) ? $this->items[$name] : null;
}
}
$obj = new myClass();
$obj->myitem1 = 1;
$obj->myitem2 = 2;
$obj->myitem3 = 3;
$obj->items = 'bang';
/**
* @property $foo
* @property $bar
*/
class A {
private $foo;
private $bar;
private $int;
public function __get($name) {
return $this->$name;
}
public function __set($name, $value) {
$this->$name = $value;
}
public function getCalculated1() {
return $this->internalCalculate();
}
public function getCalculated2() {
return $this->int;
}
private function internalCalculate() {
return $this->int = $this->foo * $this->bar;
}
}
$a = new A();
$a->foo = 'Я хрень и твой метод internalCalculate сейчас сделает фатал';
$a->bar = NULL;
$result = $a->getCalculated1(); // Бздыщь