За последние 24 часа нас посетил 18661 программист и 1599 роботов. Сейчас ищут 984 программиста ...

Что это такое?

Тема в разделе "PHP для новичков", создана пользователем Колбася, 31 окт 2012.

  1. Колбася

    Колбася Активный пользователь

    С нами с:
    12 дек 2011
    Сообщения:
    722
    Симпатии:
    0
    Код (PHP):
    1. $this->blabla(); 
    что это означает? блабла это функция вот а вот $this-> со стрелкой что означают? относится к или как?
     
  2. Gold Dragon

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

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
    вызов метода blabla() класса
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
  4. Колбася

    Колбася Активный пользователь

    С нами с:
    12 дек 2011
    Сообщения:
    722
    Симпатии:
    0
    Спасибо ребята!
     
  5. VampiR_WAR

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

    С нами с:
    19 авг 2009
    Сообщения:
    409
    Симпатии:
    1
    Адрес:
    Нижний Новгород
    Никак не уловлю логику работы с классами. Читать читал но что то туго... =) Может статейку какую подскажите для жирафов?
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Лучше задай вопросы сам =)
     
  7. VampiR_WAR

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

    С нами с:
    19 авг 2009
    Сообщения:
    409
    Симпатии:
    1
    Адрес:
    Нижний Новгород
    Скоро =)))
     
  8. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Попробую неформально описать объектно-ориентированное программирование )))
    Объект — это кусок данных определенного типа. Если нам не хватает встроенных в язык типов, мы создаем свой, описывая из каких частей ("полей") он состоит и какие операции ("методы") может выполнять.

    Новички поначалу путаются в понятиях «класс» и «объект». Лучше сразу запомнить: класс это как бы инструкция по созданию и использованию предмета. А объект это сам предмет.
    Мы описываем класс:
    Код (PHP):
    1. class MyClass
    2. {
    3.   public $title;
    4.  
    5.   function __construct($a, $b, $c)
    6.   {
    7.     $this->title = $a . $b . $c; // обращение к полям объекта внутри его методов начинается с $this->
    8.   }
    9. }
    10.  
    Мы создаем объект:
    Код (PHP):
    1. // переменная $myObject будет указывать на новый объект
    2. $myObject = new MyClass('some string', 123, '***'); // при этом вызывается метод __construct()
    3.  
    4. // переменная $another будет указывать на тот же самый объект, новый экземпляр не создается!
    5. $another = $myObject;
    6. echo $another->title; // выведет 'some string123***'
    7.  
    Это важная особенность: сколько не присваивай объект, все новые переменные будут ссылаться на тот же самый кусок данных. Данные не размножаются при присваивании!
    Чтобы создать новый объект мы должны вызвать операцию new.

    Есть специфический вид полей и методов, которые называются "статические". Многие программисты их не любят, потому что не умеют готовить. Новичкам лучше ими не пользоваться, просто запомните, что вот такой синтаксис через символ "::" называется статическим вызовом:
    Код (PHP):
    1. MyCoolClass::doIt(); // статические методы не требуют создания объекта
    2. echo MyCoolClass::$myCoolField; // статические поля принадлежат самому классу, а не объекту
    3.  
     
  9. VampiR_WAR

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

    С нами с:
    19 авг 2009
    Сообщения:
    409
    Симпатии:
    1
    Адрес:
    Нижний Новгород
    Тесть создаем класс с методами
    Код (PHP):
    1. class MyClass
    2. {
    3.   public $title;
    4.  
    5.   function __construct($a, $b, $c)
    6.   {
    7.     $this->title = $a . $b . $c; // обращение к полям объекта внутри его методов начинается с $this->
    8.   }
    9. } 
    Методы это набор функций или других каких то манипуляций с данными?
    public $title; - инициализация чего то?)


    Далее
    Код (PHP):
    1. $myObject = new MyClass('some string', 123, '***'); 
    Нахожу общее с
    Код (PHP):
    1. function __construct($a, $b, $c) 
    То есть в классе инициализируем $a $b $c
    А в объекте передаем данные?


    Встречал разные классы у которых было много
    public $title; и function __construct.
    Спасибо, тут как то проще написал, прожевано... Но все равно не доходит.
    Может у тебя есть какой нибудь практический пример? =)
     
  10. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Класс - это шаблон, каким должен быть объект. те. какие у него есть свойства(данные) и что он может делать(действия).
    Объект - это экземпляр класса. тоесть на основании одного класса(шаблона) -мы можем создать много классов(если нужно).

    пример:
    мы хотим создать объект - описывающий поведение телевизора
    -какие есть свойства у телевизора?
    -- диагональ экрана, громкость звука, яркость изображения, список каналов(их частот) и т.д.
    -что может делать телевизор?
    -- он может включаться. искать и запоминать каналы. показывать каналы. переключать каналы в пределах запомненного списка, менять громкость звука, менять параметры изображения(яркость, контрастность...), выключаться....

    вот например исходя из этого, мы теперь может написать класс, описывающий Телевизор. (просто пример:)
    Код (PHP):
    1. // класс - телевизор
    2. class TVset {
    3.   protected $isOn = false; // флаг того что телек включен
    4.   protected $contrast = 50; // контрастность изображение (1..100)
    5.   protected $channels = Array(); // список всех каналов (частот)
    6.   protected $channel = null; // текущий канал (частота)
    7.   protected $volume = null; // громкость (1..100)
    8.   // тут другие свойства какие нам нужны
    9.   
    10.   public function __construct($channel, $volume) {
    11.     $this->channel = $channel;
    12.     $this->volume = $volume;
    13.     $this->on();
    14.   }
    15.   public function on() {
    16.     $this->isOn = true;
    17.   }
    18.   public function off() {
    19.     $this->isOn = false;
    20.   }
    21.   public function changeVolume() {
    22.     if (!$this->isOn) return;
    23.     $this->volume += 1; // увеличиваем громкость
    24.   }
    25.   public function getScreenShot($screenPath) {
    26.     if (!$screenPath) return;
    27.     //..........
    28.   }
    29.   //... тут остальные методы этого класса (поиск каналов, переключение и т.д.)
    30. }
    31.  
    32. $tv = new TVset($channel, $volume); // создать и сразу включить
    33. $tv->addVolume(); // добавить громкость
    34. $tv->getScreenShot( 'c:/temp/channel-screen.jpg' ); // сохранить скриншот тукущий, например
    35. $tv->off(); // выключить
    36.  
     
  11. VampiR_WAR

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

    С нами с:
    19 авг 2009
    Сообщения:
    409
    Симпатии:
    1
    Адрес:
    Нижний Новгород
    И если на понадобиться увеличить контрастность:
    Код (PHP):
    1. public function contrest() {
    2. if($this->contrast<30) {
    3. $this->contrast =  $this->contrast+5;
    4. }
    5.  
    Правильно понимаю?
     
  12. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    да. в методе управления контрастностью, вы реализовываете проверку что контрастность не уйдет за разрешенные пределы, и меняете само значение.

    при использовании класса, вы вызываете эти описанные методы. и вся сопутствующая логика выполняется сразу. таким образом меньше шансов чтото напутать или забыть чтото проконтроллировать. получается что объект сам будет управлять своими данными и сам следить за их корректностью. и его состояние не выйдет из под контроля.

    сами свойства я описал как protected. тоесть их нельзя изменять снаружи класса. это можно делать только внутри самого класса или внутри классов наследников. ноесли нужно, иожно объявить свойства и public. тогда доступ к ним будет хоть снаружи хоть изнутри объекта.
     
  13. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    это объявление. Переменные, принадлежающие классу, называются свойствами. public означает, что переменная доступна извне.
    Публичные переменные можно не объявлять а создавать на ходу, как элементы массива.

    Черкану тоже пару строк =)

    Строка, число, массив, объект - это типы данных. Только объект обязательно относится к какому-либо классу. В php существует пустой класс stdClass, объекты этого класса создаются автоматически.

    создать массив:
    Код (Text):
    1. $arr['name'] = 'Vasya';
    создать объект
    Код (Text):
    1. $obj->name = 'Vasya';
    2. var_dump($obj);
    Внутрь объекта $obj класса stdClass мы добавили публичное свойство $name.
    Публичные свойства можно перебирать в цикле foreach как элементы массива
    Код (Text):
    1. foreach ($obj as $name => $value)
    2.     echo $name, ':', $value; // name:Vasya
    Класс stdClass не содержит никаких функций (методов). Если ты объявишь функцию внутри класса, она сможет обращаться к свойствам своего объекта типа как $this->name или к другим функциям $this->fn(). Они могут быть public, protected, private. Снаружи можно обращаться только к тем свойствам и методам, которые public.

    Добавлено спустя 3 минуты 58 секунд:
    $this->contrast += 5 тоже работает
     
  14. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Методы это функции самого объекта. Они подобны любым другим функциям + имеют доступ к "личным" полям самого объекта.
    public $title; это объявление публично доступного поля. К нему можно будет оращаться как $var->title откуда угодно. а вот если есть такое объявление:
    protected $title; то к нему можно будет обращаться только из методов этого класса (или методов класса, унаследованного от этого) как $this->title, а извне объекта оно будет запрещено! есть еще вариант private — то же самое, только в наследниках недоступно.

    методы тоже могут быть объявлены public/protected/private, если не указано явно, то public

    Пример использования защищеных полей:
    Код (PHP):
    1. <?php
    2.  
    3. class Rating
    4. {
    5.   protected $_count;
    6.   protected $_sum;
    7.  
    8.   function __construct()
    9.   {
    10.     $this->_count = 0;
    11.     $this->_sum = 0;
    12.   }
    13.  
    14.   function add($rate)
    15.   {
    16.     $this->_count++;
    17.     $this->_sum += $rate;
    18.   }
    19.     
    20.   public function average()
    21.   {
    22.     if ($this->_count == 0) return 0;
    23.     return $this->_sum / $this->_count;
    24.   }
    25. }
    26.  
    27. $r = new Rating();
    28. $r->add(3);
    29. $r->add(5);
    30. $r->add(5);
    31. $r->add(5);
    32. //echo $r->_count; // это была бы ошибка, $_count недоступен извне!
    33. echo $r->average(); // выведет 4.5
    34.  
     
  15. VampiR_WAR

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

    С нами с:
    19 авг 2009
    Сообщения:
    409
    Симпатии:
    1
    Адрес:
    Нижний Новгород
    Спасибо )) Очень хорошо разжевано))) Буду практиковаться. =)
     
  16. Колбася

    Колбася Активный пользователь

    С нами с:
    12 дек 2011
    Сообщения:
    722
    Симпатии:
    0
    годнота спасибос
     
  17. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Смысл так писать, это же не удобно...

    Наследование в php работает подругому.

    Код (PHP):
    1. class a {
    2.     public static function _a() {
    3.         return'_a';
    4.     }
    5. }
    6. class b extends a {
    7.     public static function _b() {
    8.         return'_b';
    9.     }
    10. }
    11. class c extends b {
    12.     public static function _c() {
    13.         return'_c';
    14.     }
    15. }
    16.  
    17. echo c::_a(),
    18.     c::_b(),
    19.     c::_c();
    20. /*
    21. _a
    22. _b
    23. _c
    24. */ 
    Используем только 1 классс, для вызова...


    И protected работая с self:: данного класса, и parent:: вызова из унаследованного класса, главного класса в котором расположена переменная или метод, которые вызываем.


    В данном случае классы могут быть абстракными.
    Что упростит процесс...
     
  18. Колбася

    Колбася Активный пользователь

    С нами с:
    12 дек 2011
    Сообщения:
    722
    Симпатии:
    0
    +

    А я понял это типа такая шняга которая определяет как будет выводиться через echo или print ему подобные шняги но с учетом описанного класса тоесть как бы по правилам класса так? :)
     
  19. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    эх... Чувак, ты офис собирался снимать вроде. Называй вещи своими именами, иначе ты искажаешь своё восприятие действительности. И твои решения будут неверными.
     
  20. Колбася

    Колбася Активный пользователь

    С нами с:
    12 дек 2011
    Сообщения:
    722
    Симпатии:
    0
    :)