Код (PHP): $this->blabla(); что это означает? блабла это функция вот а вот $this-> со стрелкой что означают? относится к или как?
$this это этот самый объект. Лучше чем в мануале не скажешь http://www.php.ru/manual/language.oop5.basic.html
Никак не уловлю логику работы с классами. Читать читал но что то туго... =) Может статейку какую подскажите для жирафов?
Попробую неформально описать объектно-ориентированное программирование ))) Объект — это кусок данных определенного типа. Если нам не хватает встроенных в язык типов, мы создаем свой, описывая из каких частей ("полей") он состоит и какие операции ("методы") может выполнять. Новички поначалу путаются в понятиях «класс» и «объект». Лучше сразу запомнить: класс это как бы инструкция по созданию и использованию предмета. А объект это сам предмет. Мы описываем класс: Код (PHP): class MyClass { public $title; function __construct($a, $b, $c) { $this->title = $a . $b . $c; // обращение к полям объекта внутри его методов начинается с $this-> } } Мы создаем объект: Код (PHP): // переменная $myObject будет указывать на новый объект $myObject = new MyClass('some string', 123, '***'); // при этом вызывается метод __construct() // переменная $another будет указывать на тот же самый объект, новый экземпляр не создается! $another = $myObject; echo $another->title; // выведет 'some string123***' Это важная особенность: сколько не присваивай объект, все новые переменные будут ссылаться на тот же самый кусок данных. Данные не размножаются при присваивании! Чтобы создать новый объект мы должны вызвать операцию new. Есть специфический вид полей и методов, которые называются "статические". Многие программисты их не любят, потому что не умеют готовить. Новичкам лучше ими не пользоваться, просто запомните, что вот такой синтаксис через символ "::" называется статическим вызовом: Код (PHP): MyCoolClass::doIt(); // статические методы не требуют создания объекта echo MyCoolClass::$myCoolField; // статические поля принадлежат самому классу, а не объекту
Тесть создаем класс с методами Код (PHP): class MyClass { public $title; function __construct($a, $b, $c) { $this->title = $a . $b . $c; // обращение к полям объекта внутри его методов начинается с $this-> } } Методы это набор функций или других каких то манипуляций с данными? public $title; - инициализация чего то?) Далее Код (PHP): $myObject = new MyClass('some string', 123, '***'); Нахожу общее с Код (PHP): function __construct($a, $b, $c) То есть в классе инициализируем $a $b $c А в объекте передаем данные? Встречал разные классы у которых было много public $title; и function __construct. Спасибо, тут как то проще написал, прожевано... Но все равно не доходит. Может у тебя есть какой нибудь практический пример? =)
Класс - это шаблон, каким должен быть объект. те. какие у него есть свойства(данные) и что он может делать(действия). Объект - это экземпляр класса. тоесть на основании одного класса(шаблона) -мы можем создать много классов(если нужно). пример: мы хотим создать объект - описывающий поведение телевизора -какие есть свойства у телевизора? -- диагональ экрана, громкость звука, яркость изображения, список каналов(их частот) и т.д. -что может делать телевизор? -- он может включаться. искать и запоминать каналы. показывать каналы. переключать каналы в пределах запомненного списка, менять громкость звука, менять параметры изображения(яркость, контрастность...), выключаться.... вот например исходя из этого, мы теперь может написать класс, описывающий Телевизор. (просто пример Код (PHP): // класс - телевизор class TVset { protected $isOn = false; // флаг того что телек включен protected $contrast = 50; // контрастность изображение (1..100) protected $channels = Array(); // список всех каналов (частот) protected $channel = null; // текущий канал (частота) protected $volume = null; // громкость (1..100) // тут другие свойства какие нам нужны public function __construct($channel, $volume) { $this->channel = $channel; $this->volume = $volume; $this->on(); } public function on() { $this->isOn = true; } public function off() { $this->isOn = false; } public function changeVolume() { if (!$this->isOn) return; $this->volume += 1; // увеличиваем громкость } public function getScreenShot($screenPath) { if (!$screenPath) return; //.......... } //... тут остальные методы этого класса (поиск каналов, переключение и т.д.) } $tv = new TVset($channel, $volume); // создать и сразу включить $tv->addVolume(); // добавить громкость $tv->getScreenShot( 'c:/temp/channel-screen.jpg' ); // сохранить скриншот тукущий, например $tv->off(); // выключить
И если на понадобиться увеличить контрастность: Код (PHP): public function contrest() { if($this->contrast<30) { $this->contrast = $this->contrast+5; } Правильно понимаю?
да. в методе управления контрастностью, вы реализовываете проверку что контрастность не уйдет за разрешенные пределы, и меняете само значение. при использовании класса, вы вызываете эти описанные методы. и вся сопутствующая логика выполняется сразу. таким образом меньше шансов чтото напутать или забыть чтото проконтроллировать. получается что объект сам будет управлять своими данными и сам следить за их корректностью. и его состояние не выйдет из под контроля. сами свойства я описал как protected. тоесть их нельзя изменять снаружи класса. это можно делать только внутри самого класса или внутри классов наследников. ноесли нужно, иожно объявить свойства и public. тогда доступ к ним будет хоть снаружи хоть изнутри объекта.
это объявление. Переменные, принадлежающие классу, называются свойствами. public означает, что переменная доступна извне. Публичные переменные можно не объявлять а создавать на ходу, как элементы массива. Черкану тоже пару строк =) Строка, число, массив, объект - это типы данных. Только объект обязательно относится к какому-либо классу. В php существует пустой класс stdClass, объекты этого класса создаются автоматически. создать массив: Код (Text): $arr['name'] = 'Vasya'; создать объект Код (Text): $obj->name = 'Vasya'; var_dump($obj); Внутрь объекта $obj класса stdClass мы добавили публичное свойство $name. Публичные свойства можно перебирать в цикле foreach как элементы массива Код (Text): foreach ($obj as $name => $value) echo $name, ':', $value; // name:Vasya Класс stdClass не содержит никаких функций (методов). Если ты объявишь функцию внутри класса, она сможет обращаться к свойствам своего объекта типа как $this->name или к другим функциям $this->fn(). Они могут быть public, protected, private. Снаружи можно обращаться только к тем свойствам и методам, которые public. Добавлено спустя 3 минуты 58 секунд: $this->contrast += 5 тоже работает
Методы это функции самого объекта. Они подобны любым другим функциям + имеют доступ к "личным" полям самого объекта. public $title; это объявление публично доступного поля. К нему можно будет оращаться как $var->title откуда угодно. а вот если есть такое объявление: protected $title; то к нему можно будет обращаться только из методов этого класса (или методов класса, унаследованного от этого) как $this->title, а извне объекта оно будет запрещено! есть еще вариант private — то же самое, только в наследниках недоступно. методы тоже могут быть объявлены public/protected/private, если не указано явно, то public Пример использования защищеных полей: Код (PHP): <?php class Rating { protected $_count; protected $_sum; function __construct() { $this->_count = 0; $this->_sum = 0; } function add($rate) { $this->_count++; $this->_sum += $rate; } public function average() { if ($this->_count == 0) return 0; return $this->_sum / $this->_count; } } $r = new Rating(); $r->add(3); $r->add(5); $r->add(5); $r->add(5); //echo $r->_count; // это была бы ошибка, $_count недоступен извне! echo $r->average(); // выведет 4.5
Смысл так писать, это же не удобно... Наследование в php работает подругому. Код (PHP): class a { public static function _a() { return'_a'; } } class b extends a { public static function _b() { return'_b'; } } class c extends b { public static function _c() { return'_c'; } } echo c::_a(), c::_b(), c::_c(); /* _a _b _c */ Используем только 1 классс, для вызова... И protected работая с self:: данного класса, и parent:: вызова из унаследованного класса, главного класса в котором расположена переменная или метод, которые вызываем. В данном случае классы могут быть абстракными. Что упростит процесс...
+ А я понял это типа такая шняга которая определяет как будет выводиться через echo или print ему подобные шняги но с учетом описанного класса тоесть как бы по правилам класса так?
эх... Чувак, ты офис собирался снимать вроде. Называй вещи своими именами, иначе ты искажаешь своё восприятие действительности. И твои решения будут неверными.