За последние 24 часа нас посетили 18073 программиста и 1700 роботов. Сейчас ищут 1522 программиста ...

PHP функция

Тема в разделе "PHP для новичков", создана пользователем dalet, 5 дек 2017.

  1. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Ты сначала написал что-то свое, потом дополнил нагуглив тем что противоречит первому. Какие основания говорить то что я писал до этого неправильно?
    Вот пример, объект не может обратиться к свойству $name, потому что это не его свойство а класса.
    PHP:
    1. <?php
    2.     class User
    3.     { private $name; }
    4.        $user = new User;
    5.     $user->name = 'Коля';
    6.     echo $user->name;
    7. ?>
     
  2. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Вы тут сейчас договоритесь и совсем в терминах запутаетесь с таким подходом.
    PHP:
    1. class User {
    2.    private $name;
    3.    public function setName($value) {
    4.       $this->name = $value;
    5.    }
    6. }
    7. $u1 = new User();
    8. $u1->setName('Vasya');
    9. $u2 = new User();
    10. $u2->setName('Vanya');
    Объекты имеют полный доступ к этому свойству.
    --- Добавлено ---
    Уж если что то и называть свойствами класса так это статические - они будут иметь всегда одинаковое значение для всех экземпляров класса. При этом объектов может не быть вовсе. А вот в примере выше, без объекта этого свойства не существует... Только его описание.
     
  3. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Объект в вашем примере имеет доступ к методу а не свойству и если это private function setName то нет доступа.
     
  4. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    $this - указатель на конкретный экземпляр класса.
    --- Добавлено ---
    Делая свойство приватным вы ни чего кардинально не меняете. Просто, вы как разработчик, как бы говорите пользователю: "Братан, я не доверяю тебе этот объект, полученные данные я сначала проверю и внесу информацию в объект (не класс)".
     
  5. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    какой бред ты несёшь просто ужас.
     
  6. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    На уровне памяти произойдет произойдет асолютно одно и тоже. В ячейку памяти зарезервированную под свойство принадлежащее экземпляру класса будет занесено значение. На прямую или через сеттер - это лишь маршрут доставки.
     
    keren нравится это.
  7. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    ты безграмотный, говоришь не знаешь что говоришь, на ходу выдумываешь?
     
  8. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    @askanim, шел бы ты в свою тему про нелюбовь выражать отношения, и не засирал форум, переходами на личности.
     
  9. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @voral а чё он не бред сказал?
    --- Добавлено ---
    @voral чё же ты ему тогда объясняешь он же всё верно сказал. Где я не прав?
     
    #59 askanim, 6 дек 2017
    Последнее редактирование: 6 дек 2017
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    В твоём примере не объект не имеет доступа к свойству, а внешний мир не имеет доступа к свойству объекта :) Но свойство принадлежит объекту. Класс - это как чертёж. Положим, на чертеже автомобиля нарисован поршень двигателя. По этому чертежу сделан автомобиль. Мне из внешнего мира весьма не просто получить доступ к поршню двигателя (можно, если разобрать автомобиль - но в php тоже есть механизм, как из внешнего мира получить доступ к приватным свойствам), но тем не менее этот поршень - часть машины, а не часть чертежа.
     
    #60 mkramer, 6 дек 2017
    Последнее редактирование: 7 дек 2017
    keren и askanim нравится это.
  11. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Наверно проще уже и не сказать. Думаю на бытовом уровне это самое краткое и лучшее то что я слышал про ООП)
    --- Добавлено ---
    Я встречал такие же в инете объяснения, но там там на примере целого завода это было.
     
  12. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Немного офтопика на тему ООП.
    Дело было когда у меня сыну было несколько месяцев. Был очень тяжелый проект, насквозь ООП, жесткие сроки. Спал пару часов в сутки. И вот ночью сын заплакал, я проснулся, но не успел открыт глаза, первая мысль, но на полном серьезе: Надо будет утром сделать метод отключения плача... Потом проснулся окончательно и пошел "выключать" :)
     
    askanim нравится это.
  13. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Весело :) мне часто снится код во сне если честно.. Прямо вот просто строчки пишущегося кода или что-то связаное с кодом в общем как - то так
     
  14. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    @voral @mkramer
    В общем да, если в print_r посмотреть то и приватное свойство попадает в объект, все завязано на объект. Пишут - "Переменная $this указывает на объект класса", но в коде же как-бы видишь что $this указывает на свойство или метод, а объект это вроде ссылки, может быть это неправильное восприятие.
     
  15. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Не знаю, как у тебя в коде, а в моем коде $this является внутренней ссылкой объекта на самого себя.
     
  16. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    а ты внимательнее почитай там где я тебе написал про ООП и вдумайся, не понятно спроси.
     
  17. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Объявляя переменную $myVar = new MyClass(); вы резервируете в оперативной памяти место для ее хранения, в переменную myVar записывается этот адрес. $this указывает точно на этот же адрес. Обращаясь к $myVar->name или $this->name. Ты выполняешь одну и ту же операцию: говоришь сходи по адресу сохраненному в myVar, там хранится объект класса MyClass и найди там значение свойства name. Как только ты грохнешь этот объект, значение этого свойства так же теряется.
     
    keren нравится это.
  18. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Но ведь в итоге "найди свойство name" значит мы обращаемся к свойству name с которым мы работаем, а объект это адрес в котором лежат и другие свойства которые в данный момент нам ненужны.
     
  19. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Мы работаем не со свойством. А с конкретным объектом. Свойство лиш одна из характеристик конкретного объекта. Вы не сможете работать с этим свойством без этого объекта. Другое дело статические. Тут уже другой коленкор.
    PHP:
    1. class A {
    2.     private $name;
    3.     static $prefix;
    4.     static $counter = 0;
    5.     public function setName($value){
    6.         $this->name = $value;
    7.         ++self::$counter;
    8.     }
    9.     public function showUser(){
    10.         echo self::$prefix.' '.$this->name."\n";
    11.     }
    12.     public static function badFunc(){
    13.         // здесь будет ошибка. метод статический
    14.         // и переменно $this может не существовать
    15.         echo $this-name;
    16.     }
    17. }
    18. A::$prefix = 'test';
    19. print_r(A::$prefix.' - '.A::$counter."\n");
    20. $a = new A;
    21. $a->setName('Vasya');
    22. print_r(A::$prefix.' - '.A::$counter."\n");
    23. $a->showUser();
    24. $b = new A;
    25. $b->setName('Ivan');
    26. A::$prefix = 'mr';
    27. print_r(A::$prefix.' - '.A::$counter."\n");
    28. $a->showUser();
    29. $b->showUser();
    Ну, а свойства с публичным доступом это вообще дурной тон (ИМХО), особенно в PHP где переменная может менять тип.
     
    askanim нравится это.
  20. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Я это понимаю, но по сути объект со свойствами - это массив с переменными, конечная вещь с которой мы работаем это переменная, хотя без объекта не будет доступа, главное то с чем мы работаем.
     
    #70 keren, 7 дек 2017
    Последнее редактирование: 7 дек 2017
  21. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Нет. Ради переменной нет смысла (да и глупо) использовать ООП. Если переменная имеет смысл без объекта, значит это использование микроскопа для забивания гвоздей.
    Если вы используете ООП для хранения переменных (объединенных неким признаком) при этом вам не нужны объекты - используйте статические свойства.
     
    askanim нравится это.
  22. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Я не говорю что переменная имеет смысл без объекта, свойство это орган объекта, но в конечном итоге мы работаем с органом.
     
  23. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Мы работаем, если мы внешний мир, обычно со всем объектом в целом через его методы. Свойства хранят текущее состояние объекта, через вызовы методов мы меняем его состояние. Да, объект в php можно сделать с чисто публичными полями и без методов (обычно тогда просто создаётся объект stdclass), но это уже не настоящий объект. Рассматривать отдельно свойства объектов, при работе с ним из вне не стоит. Тот же пример с машиной: водитель не думает о поршне двигателя, когда нажимает на газ.
     
  24. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    нет и нет и нет и ещё раз нет! Это разные типы данных.
    --- Добавлено ---
    Хватит задавать глупые вопросы, если тебе и в правду интересно, то сходи по ссылки и почитай:
    https://progstudy.ru/index.php/sm/article/ob-ektno-orientirovannoe-programmirovanie
    Там наглядно на пальцах рассказывают что есть ООП. Да там не пых, но аналогию проведёшь не чего сложного нет.
     
  25. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @askanim, хорошая ссылка. И картинки частично взяты из классической книги по ООП Гради Буча "Объектно-ориентированный анализ и проектирование"