Ты сначала написал что-то свое, потом дополнил нагуглив тем что противоречит первому. Какие основания говорить то что я писал до этого неправильно? Вот пример, объект не может обратиться к свойству $name, потому что это не его свойство а класса. PHP: <?php class User { private $name; } $user = new User; $user->name = 'Коля'; echo $user->name; ?>
Вы тут сейчас договоритесь и совсем в терминах запутаетесь с таким подходом. PHP: class User { private $name; public function setName($value) { $this->name = $value; } } $u1 = new User(); $u1->setName('Vasya'); $u2 = new User(); $u2->setName('Vanya'); Объекты имеют полный доступ к этому свойству. --- Добавлено --- Уж если что то и называть свойствами класса так это статические - они будут иметь всегда одинаковое значение для всех экземпляров класса. При этом объектов может не быть вовсе. А вот в примере выше, без объекта этого свойства не существует... Только его описание.
Объект в вашем примере имеет доступ к методу а не свойству и если это private function setName то нет доступа.
$this - указатель на конкретный экземпляр класса. --- Добавлено --- Делая свойство приватным вы ни чего кардинально не меняете. Просто, вы как разработчик, как бы говорите пользователю: "Братан, я не доверяю тебе этот объект, полученные данные я сначала проверю и внесу информацию в объект (не класс)".
На уровне памяти произойдет произойдет асолютно одно и тоже. В ячейку памяти зарезервированную под свойство принадлежащее экземпляру класса будет занесено значение. На прямую или через сеттер - это лишь маршрут доставки.
@askanim, шел бы ты в свою тему про нелюбовь выражать отношения, и не засирал форум, переходами на личности.
@voral а чё он не бред сказал? --- Добавлено --- @voral чё же ты ему тогда объясняешь он же всё верно сказал. Где я не прав?
В твоём примере не объект не имеет доступа к свойству, а внешний мир не имеет доступа к свойству объекта Но свойство принадлежит объекту. Класс - это как чертёж. Положим, на чертеже автомобиля нарисован поршень двигателя. По этому чертежу сделан автомобиль. Мне из внешнего мира весьма не просто получить доступ к поршню двигателя (можно, если разобрать автомобиль - но в php тоже есть механизм, как из внешнего мира получить доступ к приватным свойствам), но тем не менее этот поршень - часть машины, а не часть чертежа.
Наверно проще уже и не сказать. Думаю на бытовом уровне это самое краткое и лучшее то что я слышал про ООП) --- Добавлено --- Я встречал такие же в инете объяснения, но там там на примере целого завода это было.
Немного офтопика на тему ООП. Дело было когда у меня сыну было несколько месяцев. Был очень тяжелый проект, насквозь ООП, жесткие сроки. Спал пару часов в сутки. И вот ночью сын заплакал, я проснулся, но не успел открыт глаза, первая мысль, но на полном серьезе: Надо будет утром сделать метод отключения плача... Потом проснулся окончательно и пошел "выключать"
Весело мне часто снится код во сне если честно.. Прямо вот просто строчки пишущегося кода или что-то связаное с кодом в общем как - то так
@voral @mkramer В общем да, если в print_r посмотреть то и приватное свойство попадает в объект, все завязано на объект. Пишут - "Переменная $this указывает на объект класса", но в коде же как-бы видишь что $this указывает на свойство или метод, а объект это вроде ссылки, может быть это неправильное восприятие.
Объявляя переменную $myVar = new MyClass(); вы резервируете в оперативной памяти место для ее хранения, в переменную myVar записывается этот адрес. $this указывает точно на этот же адрес. Обращаясь к $myVar->name или $this->name. Ты выполняешь одну и ту же операцию: говоришь сходи по адресу сохраненному в myVar, там хранится объект класса MyClass и найди там значение свойства name. Как только ты грохнешь этот объект, значение этого свойства так же теряется.
Но ведь в итоге "найди свойство name" значит мы обращаемся к свойству name с которым мы работаем, а объект это адрес в котором лежат и другие свойства которые в данный момент нам ненужны.
Мы работаем не со свойством. А с конкретным объектом. Свойство лиш одна из характеристик конкретного объекта. Вы не сможете работать с этим свойством без этого объекта. Другое дело статические. Тут уже другой коленкор. PHP: class A { private $name; static $prefix; static $counter = 0; public function setName($value){ $this->name = $value; ++self::$counter; } public function showUser(){ echo self::$prefix.' '.$this->name."\n"; } public static function badFunc(){ // здесь будет ошибка. метод статический // и переменно $this может не существовать echo $this-name; } } A::$prefix = 'test'; print_r(A::$prefix.' - '.A::$counter."\n"); $a = new A; $a->setName('Vasya'); print_r(A::$prefix.' - '.A::$counter."\n"); $a->showUser(); $b = new A; $b->setName('Ivan'); A::$prefix = 'mr'; print_r(A::$prefix.' - '.A::$counter."\n"); $a->showUser(); $b->showUser(); Ну, а свойства с публичным доступом это вообще дурной тон (ИМХО), особенно в PHP где переменная может менять тип.
Я это понимаю, но по сути объект со свойствами - это массив с переменными, конечная вещь с которой мы работаем это переменная, хотя без объекта не будет доступа, главное то с чем мы работаем.
Нет. Ради переменной нет смысла (да и глупо) использовать ООП. Если переменная имеет смысл без объекта, значит это использование микроскопа для забивания гвоздей. Если вы используете ООП для хранения переменных (объединенных неким признаком) при этом вам не нужны объекты - используйте статические свойства.
Я не говорю что переменная имеет смысл без объекта, свойство это орган объекта, но в конечном итоге мы работаем с органом.
Мы работаем, если мы внешний мир, обычно со всем объектом в целом через его методы. Свойства хранят текущее состояние объекта, через вызовы методов мы меняем его состояние. Да, объект в php можно сделать с чисто публичными полями и без методов (обычно тогда просто создаётся объект stdclass), но это уже не настоящий объект. Рассматривать отдельно свойства объектов, при работе с ним из вне не стоит. Тот же пример с машиной: водитель не думает о поршне двигателя, когда нажимает на газ.
нет и нет и нет и ещё раз нет! Это разные типы данных. --- Добавлено --- Хватит задавать глупые вопросы, если тебе и в правду интересно, то сходи по ссылки и почитай: https://progstudy.ru/index.php/sm/article/ob-ektno-orientirovannoe-programmirovanie Там наглядно на пальцах рассказывают что есть ООП. Да там не пых, но аналогию проведёшь не чего сложного нет.
@askanim, хорошая ссылка. И картинки частично взяты из классической книги по ООП Гради Буча "Объектно-ориентированный анализ и проектирование"