Классы в php3


Содержание

Для чего нужны классы?

Не понимаю, для чего нужны классы в PHP?

Допустим, есть function.php , в нём много много функций, выполняющих разные действия, функции частично содержат общие переменные и в некоторых случаях части их кодов совпадают.

Если все эти функции превратить в методы и засунуть в один класс, что изменится в лучшую сторону или по другому — для чего нужны классы?

8 ответов 8

Пример работы с БД:

Опять же, нужна глобальная переменная $con , проверка результата каждый раз и т.п.

Простенько запускаем, делаем запрос и выводим результат. Красиво, удобно.

(Резюме: классы нужны, чтобы абстрагироваться от сложности задания.)

Вы серьёзно не знаете, для чего нужны классы? Хм. Ну ладно.

Давайте подумаем: что такое программирование? Программирование — это производство. Я имею в виду не учебные задания в стиле «введите строку и посчитайте в ней количество пробелов». Я имею в виду реально большие проекты. В них не так уж часто встречаются особо умные куски кода, зато функциональности много, она не обязательно логично устроена (особенно часто такое бывает, если вы конструируете интерфейс пользователя), и, что немаловажно, проект поддерживают не гении, вроде всех на этом сайте, а обычные программисты.

Это значит, что большая часть времени жизни кода уйдёт на его поддержку, а не начальную разработку.

Гении (и начинающие программисты тоже, как ни странно) не любят доводить что-то до совершенства. Они напишут прототип в виде одной офигенно сложной функции, и voila! — задание выполнено. В функции есть тысяча хитростей и зависимостей, которые гению просто держать в голове. Но завтра гений заболеет, уйдёт в запой или вообще уволится — и внезапно код должны поддерживать самые обыкновенные обыкновенные программисты, из мяса и костей.

А обыкновенному программисту нелегко работать с длинной сложной функцией, при одном взгляде на неё начинает болеть голова. Он не может держать в голове сразу миллионы понятий и зависимостей! И тут внезапно на помощь приходят классы. Классы позволяют уменьшить сложность. Когда программист разрабатывает класс, он, конечно, думает обо всём классе и держит в голове сразу весь класс. Но когда он разрабатывает другие классы, он думает больше не в терминах «я вызову функцию X, и она установит переменную Y», а в терминах классов: «я беру возраст пользователя», «я рисую эту картинку». Теперь голова болит гораздо меньше: вместо того, чтобы думать о всех функциях в проекте одновременно, программист думает только о немногих публичных функциях немногих публичных интерфейсов. Таким образом, в его коде меньше зависимостей: он не должен думать (вернее должен не думать!) о конкретной реализации возраста пользователя, или там отрисовки картинки, он может про это забыть. Его код становится проще, этот код легче понимать, тестировать и поддерживать.

Кроме того, он больше не должен думать что-то типа «я добавляю пользователя в список модераторов, для этого мне надо обновить вот этот массив, вот ту хэш-таблицу, поставить флаг для обновления базы данных и не забыть ещё увеличить счётчик версий». Он просто говорит: «таблица модераторов, добавь-ка в себя вот этого пользователя!» То есть теперь можно думать не в терминах внутренних структур данных, а в терминах семантики: программист пишет прямо то, что он хочет выразить. Несмотря на то, что в языке не было раньше конструкций для выражения его мыслей. Мы видим, что программист на самом деле расширяет язык под свою предметную область, и может легко и адекватно выражать своё намерение. Такой код не только легче писать, но и легче поддерживать.

При этом эффективность кода может падать по сравнению кодом, учитывающим особенности реализации других классов, но мы сознательно идём на эту жертву: наша цель — чтобы код стал проще, яснее, чтобы он говорил сам за себя!

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

Кроме того, ООП даёт другие плюшки, в виде наследования и полиморфизма, которые, однако, кажутся мне концептуально менее важными. Хотя и очень приятными в использовании.

Таким образом, для маленького проекта, для которого вы можете держать все функции в голове, можно отказаться от использования классов. Но для достаточного большого, серьёзного проекта без помощи классов для уменьшения сложности не обойтись.

PS: Для разработчиков на C: в самом деле, можно уменьшать сложность и по-другому, например, не выносить нерелевантный код в заголовочные файлы. Классы в языках, которые их поддерживают, предоставляют явное средство управления сложностью, в отличие от неявного, осуществляемого в C.

Классы и объекты в PHP

Сегодня мы поговорим о том, что вообще такое объектно-ориентированное программирование и о том, как оно реализовано в PHP. Здесь же поговорим о классах и объектах, об их различии и предназначении.

Объектно-ориентированное программирование

До этого момента мы с вами писали простейшие скрипты, представляющие собой небольшой набор php-файлов, подключаемых один внутри другого. В них всё было довольно просто — у нас были функции, которые мы вызывали одну за другой. С таким подходом можно без проблем делать простые проекты.

Однако, если приложение становится большим и над проектом работают сразу несколько человек, то требуется использовать другой подход — объектно-ориентированное программирование. Вся его суть лежит в его названии — объектно-ориентированное. То есть основанное на объектах. Если говорить более развернуто, то это подход, базирующийся на объектах и на взаимоотношениях между ними.

Что вообще за объекты такие?

Давайте на минутку забудем о программировании и подумаем: что такое объекты. Да это всё, что нас окружает. Взгляните на комнату вокруг. Вот же: стул, стол, цветок, ручка, листок бумаги — всё это является объектами. Вы, в том числе, тоже объект. Вы можете взять ручку и начать что-то писать на листе бумаги. Это — взаимодействие между объектами. А ещё, если присмотреться, то можно понять, что все объекты созданы по какому-то определенному шаблону.

Возьмем к примеру те же шариковые ручки: одна — желтая, другая — синяя. Да, цвет у них разный, но если вы посмотрите на них, то безошибочно их классифицируете как ручки. И вы понимаете, что для того, чтобы сделать ручку, нужен какой-то чертёж, по которому её будут собирать. И то же самое со столом, стулом, и даже Вами — ваша ДНК содержит «шаблон», по которому вы в итоге собрались.

Ровно то же самое происходит и в объектно-ориентированном программировании. Виртуальные объекты создаются на основе специальных шаблонов, называемых классами. Класс — это своего рода «чертёж», на основе которого будут созданы объекты. Объект же, как из этого следует — это экземпляр какого-то класса. То есть сущность, созданная по этому шаблону.

Классы в PHP

Итак, представим, что мы хотим создать некоторую упрощенную модель котика в PHP. Для этого нам сперва надо сделать его «чертёж», а именно — создать класс. Мы смотрим на котиков и понимаем что это котики. Это происходит по тому, что все котики имеют какие-то общие признаки. По этим признакам мы можем отличать одни классы объектов от других.

Классы в PHP создаются с помощью слова class, за которым следуем имя класса. Имя класса должно быть написано в CamelCase и начинаться с большой буквы. Затем с новой строки открывается фигурная скобка, далее идёт тело класса, и, наконец, закрывающая фигурная скобка.

Итак, самый простейший пример класса котика выглядит следующим образом:

Сам по себе этот код сейчас ничего не выведет. Это — просто шаблон. Точно так же, как если бы мы просто описали функцию.

Объекты в PHP

Итак, мы сделали некоторый шаблон, который описывает котиков. Пора бы уже и котика по нему собрать. А именно — создать объект.

Объекты создаются с помощью ключевого слова new:

Так мы создали объект с типом Cat и вывели его с помощью var_dump().

Как видим, в переменной лежит объект (object). И больше пока ничего.

Мы можем создать ещё несколько котиков, и все они будут объектами этого класса:

Результат этого кода:

Видим, что это действительно объекты класса Cat, однако их идентификаторы разные: 1, 2 и 3 (в PHP каждый отдельный объект имеет собственный идентификатор).

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

Объектно-ориентированное программирование

Объекты и классы

При создании программы на PHP и отдельных ее блоков нам вполне может хватить той функциональности, которую представляют функции. Однако PHP имеет и другие возможности по созданию программ, которые представляет объектно-ориентированное программирование. В ряде случаев программы, использующие ООП, проще в понимании, их легче поддерживать и изменять.

Ключевыми понятиями парадигмы ООП являются понятия «класс» и «объект». Описанием объекта является класс, а объект представляет экземпляр этого класса. Можно провести следующую аналогию: у всех есть некоторое представление о человеке — наличие двух рук, двух ног, головы, пищеварительной, нервной системы, головного мозга и т.д. Есть некоторый шаблон — этот шаблон можно назвать классом. А реально же существующий человек (фактически экземпляр данного класса) является объектом этого класса.

Для создания класса в PHP используется ключевое слово class . Например, новый класс, представляющий пользователя:

Чтобы создать объект класса User, применяется ключевое слово new :

В данном случае переменная $user является объектом класса User . С помощью функции print_r() можно вывести содержимое объекта, как и в случае с массивами.

Свойства и методы

Класс может содержать свойства, которые описывают какие-то признаки объекта, и методы, которые определяют его поведение. Добавим в класс User несколько свойств и методов:

Здесь класс User содержит два свойства: $name и $age . Свойства объявляются как обычные переменные, перед которыми стоит модификатор доступа — в данном случае модификатор public .

Методы представляют обычные функции, которые выполняют определенные действия. Здесь функция getInfo() выводит содержание ранее определенных переменных.

Для обращения к текущему объекту из этого же класса используется выражение $this — оно и представляет текущий объект. Чтобы обратиться к свойствам и методам объекта применяется оператор доступа -> . Например, чтобы получить значение свойства $name, надо использовать выражение $this->name . Причем при обращении к свойствам знак $ не используется.

При использовании объекта класса User также применяется оператор доступа для получения или установки значения свойств, а также для вызова методов.

Конструкторы и деструкторы

Конструкторы представляют специальные методы, которые выполняются при создании объекта и служат для начальной инициализации его свойств. Для создания конструктора надо объявить функцию с именем __construct (с двумя подчеркиваниями впереди):

Функция конструктора в данном случае принимает два параметра. Их значения передаются свойствам класса. И теперь чтобы создать объект, нам надо передать значения для соответствующих параметров: $user2 = new User(«Джон», 33);

Параметры по умолчанию

Чтобы сделать конструктор более гибким, мы можем обозначить один или несколько параметров в качестве необязательных. Тогда при создании объекта необязательно указывать все параметры. Например, изменим конструктор следующим образом:

Таким образом, если не будут заданы параметры, вместо них будут использоваться значения «Том» и 33. И теперь мы можем создать объект User несколькими способами:

Деструкторы

Деструкторы служат для освобождения ресурсов, используемых программой — для освобождения открытых файлов, открытых подключений к базам данных и т.д. Деструктор объекта вызывается самим интерпретатором PHP после потери последней ссылки на данный объект в программе.

Деструктор определяется с помощью функции __destruct (два подчеркивания впереди):

Функция деструктора определяется без параметров, и когда на объект не останется ссылок в программе, он будет уничтожен, и при этом будет вызван деструктор.

Объекты и классы в PHP

Объекты

Объекты в PHP — это просто ещё один тип данных. Объект позволяет хранить в переменной набор из свойств и их значений, а также встроенные функции. Это делает объекты похожими по своей структуре на ассоциативные массивы. Но отличие от массивов всё-таки есть, и при этом достаточно важное — объекты могут иметь внутреннее состояние.

Особенности объектов и их отличия от массивов

Давайте разберёмся, что такое PHP-объект. Как сказано выше, объекты похожи на массивы, но со своими особенностями. Объекты могут содержать отдельные значения, каждое под своим ключом. Эти значения называются свойствами объекта.
Также объекты могут иметь внутри себя функции — их называют методами объекта. Методы могут обращаться к любым свойствам объекта, читать и записывать туда данные.

Значение свойства объекта может быть любого типа: число, строка, массив, другой объект. Но, в отличие от массива, объекты не позволяют добавлять в себя новые значения. То есть объект всегда имеет конечное число своих свойств и методов. Менять значения существующих свойств можно, а удалять и заменять их — нельзя. Что в корне отличается от поведения массива, ведь там добавлять и удалять значения можно в любое время.

Илон Маск рекомендует:  Атрибут controls в HTML

Но самая большая особенность объектов — это то, как они создаются. Если массив создается либо пустым, либо сразу с набором значений, то объекты устроены иначе. Дело в том, что объекты не существуют сами по себе. Чтобы создать новый объект, вам придётся вначале создать его описание — класс.
Класс — это как бы чертёж объекта. Класс описывает то, из чего состоит объект. Мы разберёмся с классами чуть позже.

Анатомия объекта

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

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

Классы

Класс — это шаблон, по которому создаются объекты.

Напомню, что классы — это описания объектов. Мы не можем создать объект «на лету», как это происходит с массивами. Объект может быть создан только на основе своего описания — класса. Этим, кстати, реализация объектов в PHP отличается от JavaScript. В JS объектам не нужны никакие классы, и они могут быть созданы и модифицированы когда угодно и как угодно.

Класс как чертёж

Зачем же нужны классы, и почему объекты не могут существовать без них?

Здесь аналогия очень простая: класс – это чертёж, максимально подробное описание того, как должно выглядеть изделие. Сам по себе класс не является чем-то физическим и осязаемым, то есть мы не можем использовать его в коде непосредственно. Вместо этого класс является схемой, структурой, на основе которой будет создан объект.

Жизненный цикл объекта

Любая работа с объектами в PHP состоит из следующих этапов.
Начинается всё с создания класса. В классе мы фиксируем из каких свойств и методов будет состоять каждый его экземпляр. Также в классе можно задать начальные значения для каждого свойства.
Имея класс, возможно создать его экземпляр — объект.

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

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

Пример создания объекта на основе класса

Создание объекта на основе класса:

Разбор примера

Разберёмся с тем, что здесь происходит.
Начнём с целей создания данного класса. Его задача — хранить в объекте данные о погоде за конкретный день, а также предоставлять сводку за этот день в текстовом виде.

В классе определено четыре скрытых свойства. Это значит, что к ним не будет доступа за пределами объекта. Читать и записывать эти свойства могут только внутренние методы объекта. Сами свойства хранят температурные параметры (температуру, осадки), дату и дополнительный комментарий к записи. Некоторым свойствам задано значение по умолчанию.

Далее идёт перечисление методов. И начинается всё с метода, у которого особое имя и значение — __constructor .

Что такое конструктор объекта

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

Конструкторы объектов используются для инициализации каких-либо значений и выполнении других подготовительных операций. В нашем примере конструктор устанавливает содержимое скрытых свойств.

Обращение к свойствам и методам объекта

Посмотрим, как внутри метода происходит обращение к его свойствам.
Во-первых, для этого используется специальная переменная this, которая всегда присутствует внутри объекта и ссылается на него самого.

Во-вторых, для обращения к методам и свойствам объекта нужен специальный синтаксис: «стрелочка». Такая стрелочка отделяет имя свойства или метода от имени объекта. Это аналог квадратных скобок при работе с массивами.

Метод с именем isCold() нужен, чтобы узнать было ли холодно в тот день, основываясь на показаниях температуры в градусах.
Метод setRainStatus() устанавливает логическое значение, которое показывает статус осадков в день наблюдения.
Метод getDayDescription() формирует текстовое описание погоды на заданную дату.

Создание объекта на основе класса

Написав класс, мы выполнили большую часть работы. Теперь нам предстоит создать новый объект на основе этого класса и показать, как с ним работать.
Новый объект создается с помощью ключевого слова new, после которого идёт имя его класса. В круглых скобках надо передать все аргументы в метод construct, если он был написан. Класс не обязан содержать этот метод, и если его нет, то круглые скобки не обязательны.

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

Классы в PHP для чайников

И так для начала, немного терминологии и азов, для того что бы дальше было проще. Класс — это нечто что может содержать в себе пользовательские функции(методы) и переменные(свойства). Повторим, функции в классе — это методы, а переменные — это свойства.

class MyClass <
//свойства класса
public $var1 = ‘1’ ;
public $var2 = ‘2’ ;

//методы класса
public function func1 () <

public function func2 () <

Ключевое слово public перед методами и свойствами говорит о том что данный метод или свойство доступно из любого места. То есть оно открыто для использования, без каких либо ограничений. Вот список подобных ключевых слов:
public — открыто для использования везде
private — можно использовать только внутри данного класса
protected — можно использовать только внутри данного класса и его наследников и родителей.

Обращение к свойствам и методам классов можно делать по разному, но не все способы идентичны. Например обратиться к методу класса можно так

Преимущество второго способа в том что оно позволяет использовать внутри метода, к которому вы обращаетесь, ключевое слово $this. Оно используеться для обращения к методам и свойствам класса, внутри него самого.

class MyClass <
//свойства класса
public $var1 = ‘1’ ;
public $var2 = ‘2’ ;

//методы класса
public function func1 () <
//обращаемся к методу этого же класса
$this -> func2 ();
>

public function func2 () <


Использование именно объектов дает некоторые преимущества. Например, кроме того, что мы можем использовать $this, мы так же можем сохранить объект в таком виде как он сейчас есть в файл и в любой момент его извлеч. Да именно, это не опечатка.

//меняем значение свойства
$obj -> var1 = ’33’ ;
//вызываем метод
$obj -> func1 ();

//теперь наш объект изменен, ведь мы поменяли значение свойства
// например нам надо запомнить именно это состояние объекта
$object = serialize ( $obj ); //теперь весь объект в виде строки
file_put_contents ( ‘file.dat’ , $object ); //записали объект в файл
$object = file_get_contents ( ‘file.dat’ ); //получили объект из файла в виде строки
$obj = unserialize ( $object ); //объек сново готов к работе, в таком виде как мы его когдато сохранили ?>

Есть еще кое что о чем стоит сказать. На основе одного класса можно создавать сколько угодно объектов, а не только один и работать с ними независимо друг от друга. То есть тут я показываю примеры с одним объектом, но их может быть и больше. С объектами проще работать, когда начинаешь понимать их концепцию. Представьте что нашь мир это программа, в ней есть класс ЧЕЛОВЕК, на основе которого создаються объекты(люди), есть класс МАШИНА, на основе которого создаються объекты(машины). У класса МАШИНА есть свойства цвет, скорость, вес, объем двигателя и есть методы газ, тормоз, поворот. У класса ЧЕЛОВЕК есть свойства рост, вес, пол и есть методы идти, сесть, лежать и т.д. Ну что стало понятнее? Надеюсь да Если что пишите, сделаю еще одну, более продвинутую статью.

Создание класса в PHP

PHP — это объектно-ориентированный язык, и возможностей у него в этом направлении очень много, и совершенно глупо их не использовать. Для тех, кто не знаком с ООП предлагаю почитать эту статью: ООП в JavaScript. Основой ООП является объект, а фабрикой для создания объектов является класс. И как раз о создании классов в PHP мы и поговорим в этой статье.

Класс состоит из следующих частей:

Но прежде, чем добавлять все эти части давайте создадим описание класса (пусть файл называется «myclass.php«):

Здесь мы создали пустой класс с именем «MyClass«. Теперь добавим в наш класс свойства для нашего будущего объекта:

Здесь мы создали три свойства (кстати, свойства иногда ещё называют полями). Обратите внимание, что они доступны за пределами класса (модификатор доступа — «public«). Если бы вместо «public» был бы «private«, то они были бы доступны только внутри самого класса, а если «protected«, то в самом классе и в наследниках (дочерних классах). Впрочем, более подробно, мы поговорим о них в следующих статьях.

Также мы добавили одну константу. И обратите внимание, что перед именем константы нет знака «$«, то есть это не переменная, и этот знак ставить не надо.

Теперь создадим конструктор.

x = $x;
$this->y = $y;
echo «Был создан объект с параметрами: $x и $y»;
>
>
?>

Конструктор в PHP — это функция __construct(). Этой функции мы можем передавать параметры, которые затем каким-либо образом использовать. В данном случае, мы получили параметры из конструктора и записали их в свойства класса. Обратите внимание, что обращение к свойствам класса надо обращаться через $this->имя_ свойства. Также мы вывели строку просто для того, чтобы Вы понимали, что в конструкторе Вы можете делать всё, что пожелаете (как в обычной функции).

Теперь перейдём к последнему пункту созданию класса — это добавление методов. Добавим метод, который считает и возвращает сумму свойств x и y, а также метод, возвращающий константу pi:

x = $x;
$this->y = $y;
echo «Был создан объект с параметрами: $x и $y»;
>
function sum() <
$sum = $this->x + $this->y;
return $sum;
>
function getPI() <
return self::pi;
>
>
?>

Здесь всё очень просто: создаём переменную, в которую записываем сумму двух свойств: x и y. Потом возвращаем результат. Второй метод возвращает константу. Обратите внимание, что мы обращаемся с помощью такой конструкции: «self::имя_константы«. Так обращаются к константе внутри класса.

А теперь главный вопрос: «Как использовать данный класс в PHP?». Для этого создаём ещё один файл, в котором пишем такой код:

Здесь мы сначала подключили наш класс, потом создали объект, передав конструктору параметры (15 и 17). Затем начали выводить свойства. Как видите, синтаксис такой: «имя_объекта->имя_свойства«. Безусловно, данные свойства будут выводиться только если они public, а если они являются private или protected, то, соответственно, Вы увидите ошибку. Также обратите внимание на вывод константы: «имя_класса::имя_константы«.

Затем мы используем два метода (sum() и getPI()) и печатаем возвращаемые ими значения.

Если Вы впервые знакомитесь с ООП, то, думаю, что сейчас Вы в шоке. И это неудивительно, ведь тема эта очень сложная, и по ней пишут целые тома. Я постараюсь в дальнейших статьях раскрыть эту тему, чтобы Вы поняли преимущество ООП, ведь почти все, кто пишет большие скрипты на PHP используют ООП, и без него действительно трудно обойтись. А если Вы делаете небольшие скрипты, то тогда ООП использовать совсем необязательно. Но поверьте моему опыту, что если Вы будете серьёзно программировать (необязательно на PHP), то ООП Вы будете использовать в будущем на полную катушку, и я постараюсь Вам дать тот фундамент, ту базу, от которой Вы сможете уже повышать свой уровень знаний по этой теме.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 20 ):

    Михаил, У Вас ошибка в предложении: «Обратите внимание, что мы обращаемся с помощью такой конструкции: «self:имя_константы». » Надо наверное написать «self::имя_константы» И пишите пожалуйста побольше статей про ООП! Реально полезная штука и многим пригодится

    Есть ли статический поля и методы в PHP. Если есть как надо объявлять и использовать?

    Объектно-ориентированный PHP: специально для начинающих

    В этом уроке вы ознакомитесь с основами объектно-ориентированного программирования в PHP. Вы узнаете о принципах ООП вообще и научитесь писать простенькие скрипты на PHP.

    Добро пожаловать в первый из серии уроков по ООП на PHP! Ознакомившись со всеми уроками данной серии, вы узнаете об основных принципах и концепциях ООП и научитесь быстро и легко создавать полезные приложения на PHP.

    В этом уроке я начну вводить вас в курс дела и расскажу вам об основных понятиях ООП. Вы узнаете:

    • что такое ООП
    • как ООП поможет вам создавать лучшие PHP скрипты
    • некоторые основные понятия, такие как классы, объекты, методы, переменные класса
    • с чего начать написание PHP скрипта

    Вы готовы погрузиться в мир объектов PHP? Тогда вперед!

    Что такое объектно-ориентированное программирование?

    Если вы когда-то создавали собственные функции в PHP и использовали их, то вы использовали такой стиль программирования, как процедурный. В процедурном программировании вы обычно создаете структуры данных — числа, строки, массивы и т.д. — для хранения каких-то данных, а затем обрабатываете эти структуры специальными функциями, которые манипулируют этими данными.

    Илон Маск рекомендует:  isset - Определяет установлена ли переменная

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

    Чаще всего объекты, создаваемые с помощью ООП, отражают реальные сущности. Например, если вы создаете форум для своего сайта, вам следовало бы создать объект Member, который будет хранить информацию о каждом участнике форума (имя, логин, электронный адрес, пароль и др.), а также методы, которые будут обрабатывать эту информацию (регистрация, авторизация, выход из системы, бан и т.д.).

    Зачем использовать ООП?

    Процедурный и объектно-ориентированный — это два разных способа сделать одно и то же. Нельзя сказать, что один из них лучше другого — каждый пишет, как ему нравится, так что вы даже можете легко комбинировать эти два подхода в одном скрипте.

    Однако, вот некоторые преимущества ООП для разработчиков:

    • Легче отражать реальные ситуации: как я отметил выше, объекты отражают реальные сущности — люди, товары, карточки, статьи в блогах и др. Это во многом упрощает задачу, когда вы только начинаете проектировать свое приложение, так как назначение каждого объекта, как и цель отношений между объектами, будет ясно и понятно.
    • Легче писать модульные программы: ООП предполагает написание модулей. Разделяя код на модули, вам будет легче им управлять, дебажить и расширять его.
    • Легче писать код, который будет использоваться много раз: написание кода, который можно будет использовать не один раз, сэкономит время при написании приложения, и со временем вы даже можете создать целую библиотеку такого рода модулей, которые вы сможете использовать во многих приложениях. С помощью ООП становится сравнительно легче писать такой код, так как структуры данных и функции инкапсулируются в единственный объект, который можно использовать любое количество раз.

    Некоторые основные понятия

    Перед тем, как начать писать скрипты, необходимо хорошо разобраться с такими понятиями, как класс, объект, переменная класса и метод.

    Классы

    Класс — это каркас для объекта. Это кусок кода, который определяет:

    • Типы данных, которые будут содержать созданные объекты класса
    • Функции, которые будут содержать эти объекты.

    Когда вы создаете приложение на ООП, вы обычно будете создавать несколько классов, которые будут представлять различные типы сущностей вашего приложения. Например, для создания форума вы можете создать классы Forum, Topic, Post и Member.

    Объекты

    Объект — это переменная специального типа, которая создается через класс. Он содержит действительные данные и функции для манипулирования ими. Вы можете создавать сколько угодно объектов от одного единственного класса. Каждая функция объекта не зависит от другого объекта, даже если они созданы от одного и того же класса.

    Для сравнения с реальными сущностями:

    • Класс — это каркас для автомобиля: он определяет, как автомобиль будет выглядеть и действовать, но это все же абстрактная сущность
    • Объект — это настоящий автомобиль, созданный из каркаса: у него есть настоящие свойства (например, скорость) и поведение (например, ускорение или торможение).

    На заметку: Объект часто называют сущностью класса, а процесс создания объекта класса — реализацией.

    Переменные класса

    Значения данных, которые хранятся в том или ином объекте, записываются в специальные переменные, называемые переменными класса. Переменные класса тесно связаны с его объектом. Несмотря на то что все объекты класса имеют одни и те же переменные, их значения могут отличаться.

    Методы

    Функции, определяемые в классе и применяемые для объектов этого класса, называются методами. Они не во многом отличаются от обычных функций — вы можете передавать им значения, они могут содержать локальные переменные и возвращать значения. Однако, методы чаще работают с переменными объекта. К примеру, метод login() для авторизации пользователей в вашем форуме может устанавливать значение переменной класса loggedIn в true.

    Как создать класс в PHP?

    Теперь, когда вы уже знаете, что такое классы, методы, переменные класса и объекты, пришло время создать пару классов и объектов в коде PHP.

    Для начала посмотрим, как собственно нужно создавать класс. В принципе, скрипт по созданию класса выглядит так:

    К примеру, если вы создаете класс Member для вашего форума, вы напишите так:

    Это достаточно просто. Естественно, класс этот ничего не сделает, пока вы не добавите в него переменные и методы. Тем не менее, приведенный выше код создает валидный класс на PHP, который можно использовать.

    Правило хорошего тона: каждый класс помещайте в отдельный файл с названием, совпадающим с именем класса. Например, поместите класс Member в файл Member.php и храните его в папке, допустим, classes.

    Как создавать объекты в PHP?

    Создать объект можно с помощью ключевого слова new:

    Этот код создаст объект класса ClassName. Вам впоследствии понадобится использовать этот объект, поэтому его нужно хранить в переменной. Например, создадим объект класса Member и сохраним его в переменной $member:

    Мы также можем создать еще один объект того же класса:

    Несмотря на то что мы создали эти два объекта от одного и того же класса, переменные $member и $member2 не зависят друг от друга.

    Создаем переменные класса

    Теперь, когда мы уже умеем создавать классы и объекты классов, давайте посмотрим, как создавать переменные класса. Есть 3 идентификатора доступа для переменных класса, которые можно добавлять в класс:

    • Открытые переменные класса (public): доступны — т.е. их можно прочитать и/или изменять — в любом месте скрипта, независимо от того, где находится этот код — внутри класса или за его пределами
    • Частные переменные класса (private): доступны только методам класса. Лучше всего делать переменные класса именно частными, чтобы отделить объекты от остальной части кода.
    • Защищенные переменные класса (protected): доступны методам собственного класса, а также методам наследуемых классов (мы поговорим о наследовании позже).

    Чтобы создать переменную класса, напишите ключевое слово public, private или protected, а затем введите имя переменной:

    Давайте добавим переменную класса public нашему классу Member для хранения имени пользователя:

    Обратите внимание на то, что мы инициализировали нашу переменную класса, его значение — пустая строка, “”. Это значит, что при создании нового пользователя значение его имени по умолчанию будет равняться пустой строке. Так же, как и в случае с обычными переменными в PHP, переменные класса не обязательно инициализировать, но лучше все-таки не лениться. Если вы не инициализируете переменную класса, то по умолчанию ее значение равно null.

    Доступ к переменным класса

    Для получения доступа к переменной того или иного объекта используется оператор ->:

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

    Запустите данный код, он выведет на экран строку “Fred”, значение переменной класса $member->username. Как видите, вы оперируете переменной объекта так же, как обычной переменной — вы можете задать ей значение и прочитать его.

    Добавление методов в класс

    Что скажете насчет создания методов? Как я ранее упоминал, методы — это обычные функции, являющиеся частью класса. Так что вы, возможно, не удивитесь тому, что и создаются они с помощью того же ключевого слова function. Единственное отличие от создания обычных функций заключается в том, что вы также можете добавить один из идентификаторов доступа (public, private, protected) в ее объявлении. В этом методы схожи с переменными класса:

    На заметку: так же, как и в случае с переменными класса, методы public могут быть вызваны откуда угодно, методы private могут вызываться только в пределах класса, а методы protected — из самого класса и его наследника.

    Давайте попробуем добавить в наш класс некоторые методы и переменные класса:

    • переменная класса private $loggedIn для идентификации пользователя, т.е. зашел он или нет,
    • метод login(), который будет осуществлять вход на форум, устанавливая значение переменной класса $loggedIn в true,
    • метод logout(), который будет осуществлять выход из форума, устанавливая значение переменной класса $loggedIn в false,
    • метод isLoggedIn(), который будет возвращать значение переменной класса $loggedIn.

    Вы наверное заметили, что мы использовали новое ключевое слово $this. В контексте методов объекта специальная переменная $this ссылается на сам объект. Используя $this в методе объекта, метод может получить доступ к любой переменной класса и методу объекта.

    Например, метод login() может получить доступ к переменной класса $loggedIn объекта через $this->loggedIn.

    Кстати, наша переменная класса — частная (private), поэтому ее нельзя вызывать из любой части скрипта, а только из методов login(), logout() и isLoggedIn(). Это хороший подход, так как внутренняя часть объекта (например, то, как именно записывается, авторизовался ли пользователь или нет) находится отдельно от остального кода. По возможности старайтесь использовать именно переменные класса private, чтобы ваши объекты были автономными, мобильными и защищенными.

    На заметку: переменная класса $username в нашем примере — public. Я это сделал только для того, чтобы продемонстрировать, как можно получать доступ к переменным класса объекта. В реальных проектах скорее нужно сделать эту переменную частной и создать специальные переменные класса public для задания значений имени пользователя, если это необходимо.

    Использование методов

    Чтобы вызвать метод объекта, воспользуйтесь оператором ->, с которым вы уже успели подружиться.

    Это работает как и вызов обычной функции. Вы можете передать аргументы в скобках (если конечно он принимает какие-то аргументы), вызов метода также может возвращать определенные значения, которые вы затем можете использовать.

    Мы добавили некоторые методы в наш класс, теперь давайте попробуем их применить для чего-то:

    Данный скрипт отобразит следующее:

    Вот, как он работает:

    1. После описания класса Member мы создали его объект и сохранили в переменной $member. Также мы дали переменной класса $username данного объекта значение “Fred”.
    2. Затем мы вызвали метод $member->isLoggedIn() для того, чтобы определить, залогинился ли пользователь или нет. Данный метод просто-напросто возвращает значение переменной класса $loggedIn. Так как значение по умолчанию этой переменной класса — false, значит результатом вызова $member->isLoggedIn() будет ложь, поэтому отобразится сообщение «Fred is logged out».
    3. Затем вызовем метод login(). Он установит в true значение переменной класса $loggedIn.
    4. Теперь, при вызове метода $member->isLoggedIn() вернется истина, и выведется сообщение «Fred is logged in».
    5. Вызовем метод logout(), который устанавливает в false значение свойства $loggedIn.
    6. В третий раз вызовем метод $member->isLoggedIn(). Сейчас он вернет false, потому что значение свойства $loggedIn опять установлено в ложь. Так, снова выведется сообщение «Fred is logged out».

    На заметку: на случай, если вы в первые увидели такое: . — это тернарный оператор. Это упрощенная версия блоков if … else. Узнать о такого рода операторах можно здесь.

    Выводы

    В этом уроке вы познакомились с основами ООП в PHP. Вы узнали о таких вещах, как:

    • что такое ООП и почему его полезно применять
    • понятия классов, объектов, переменных класса и методов
    • как создавать классы и объекты
    • как создавать и использовать переменные классов
    • понятия идентификаторов доступа public, private, protected
    • как создавать и применять методы классов


    Вы уже много о чем узнали и еще много чему научитесь в следующих уроках. Тем не менее, если вы отработали хорошенько все примеры, приведенные мной, у вас есть крепкая основа. Можете приступать к созданию приложений на ООП.

    До новых встреч!

    Данный урок подготовлен для вас командой сайта ruseller.com
    Источник урока: www.elated.com/articles/object-oriented-php-for-absolute-beginners/
    Перевел: Станислав Протасевич
    Урок создан: 25 Июня 2011
    Просмотров: 144715
    Правила перепечатки

    5 последних уроков рубрики «PHP»

    Фильтрация данных с помощью zend-filter

    Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.

    Контекстное экранирование с помощью zend-escaper

    Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

    Подключение Zend модулей к Expressive

    Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

    Совет: отправка информации в Google Analytics через API

    Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

    Подборка PHP песочниц

    Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

    Классы в php3

    Веб-приложение состоит из множества PHP-классов, и каждый класс, как правило, располагается в отдельном файле. Это приводит к необходимости включения (including) файлов.

    Предположим, например, что у нас есть файл с именем Application.php, который содержит определение класса \Zend\Mvc\Application из предыдущего раздела. Перед тем как создать экземпляр этого класса где-либо в своем коде, вы должны включить содержимое файла Application.php (это можно сделать с помощью оператора require_once , передав ему полный путь к файлу):

    С увеличением размера вашего приложения включение каждого необходимого файла может вызывать трудности. Сам Zend Framework 3 состоит из сотен файлов, и загружать целую библиотеку и все ее зависимости таким образом довольно сложно. Более того, при запуске кода интерпретатору PHP потребуется процессорное время для обработки каждого включенного файла, даже если вы не создавали экземпляр его класса.

    Для решения этой проблемы в PHP была введена опция автозагрузки классов. Функция spl_autoload_register() позволяет вам зарегистрировать функцию автозагрузки. Для сложных сайтов можно даже создать несколько функций автозагрузки, объединенные в стек.

    Если интерпретатор PHP во время выполнения скрипта сталкивается с именем класса, которое еще не было определено, он вызывает все зарегистрированные функции автозагрузки по порядку до тех пор, пока какая либо функция автозагрузки не включит класс. Если же ни одна из функций автозагрузки не сделает этого, будет выброшена ошибка «not found». Это делает возможным «ленивую» загрузку, при которой интерпретатор обрабатывает определение класса только в момент его вызова — когда он на самом деле нужен.

    3.4.1. Автозагрузчик карты классов

    Чтобы дать вам представление о том, как выглядит функция автозагрузки, ниже мы привели ее упрощенную реализацию:

    Илон Маск рекомендует:  cm в CSS

    В примере выше мы определяем функцию автозагрузки autoloadFunc() , которую в дальнейшем будем именовать автозагрузчиком карты классов (class map autoloader).

    Автозагрузчик карты классов использует карту для определения соответствия между именем класса и абсолютным путем к PHP-файлу, содержащему этот класс. Карта классов — это всего лишь обычный PHP-массив, содержащий ключи и значения. Чтобы определить путь к файлу по имени класса, автозагрузчику просто нужно взять значение из массива карты классов. Очевидно, что автозагрузчик работает очень быстро. Однако, его минус в том, что вам необходимо поддерживать карту классов и обновлять ее каждый раз при добавлении в программу нового класса.

    3.4.2. Стандарт PSR-4

    Так как каждый поставщик библиотек использует свои собственные правила наименования и организацию файлов, вам придется регистрировать свою функцию автозагрузки для каждой зависимой библиотеки, что, конечно, может надоедать (и вообще, это ненужный труд). Чтобы решить эту проблему, был введен стандарт PSR-4.

    PSR расшифровывается PHP Standards Recommendation (рекомендации стандартов PHP).

    Стандарт PSR-4 определяет рекомендованную структуру кода, которую приложение или библиотека должны соблюдать, чтобы обеспечить совместимость механизмов автозагрузки.

    Пространства имен класса должны быть организованы следующим образом:

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

    Пространства имен должны иметь соответствие один к одному со структурой каталогов. Каждый разделитель пространств имен ( \ ) конвертируется в константу DIRECTORY_SEPARATOR , отличную для разных ОС.

    К имени класса добавляется суффикс расширения .php при загрузке файла из файловой системы.

    Например, для класса Zend\Mvc\Application , у вас будет следующая структура каталогов:

    Недостатком данной структуры является то, что вам придется размещать свои классы внутри ряда вложенных пустых директорий (Zend и Mvc).

    Чтобы исправить это, PSR-4 позволяет сопоставить последовательности одного или нескольких пространств и подпространств имен «базовый каталог». Например, если у вас есть полностью определенное имя класса \Zend\Mvc\Application и вы определяете соответствие между \Zend\Mvc и каталогом «/path/to/zendframework/zend-mvc/src/», вы можете организовать файлы следующим образом:

    Для соответствующего стандарту PSR-4 кода, мы можем написать и зарегистрировать автозагрузчик, который будем именовать «стандартным» автозагрузчиком:

    Стандартный автозагрузчик работает следующим образом: Предполагая, что пространство имен класса имеет соответствие один к одному со структурой каталогов, функция вычисляет путь к PHP-файлу, преобразовывая обратные слеши (разделители пространств имен) в прямые (разделители пути) и соединяя полученный путь с абсолютным путем к каталогу, где расположена библиотека. Затем функция проверяет, существует ли уже такой PHP-файл, и, если он существует, включает его с помощью оператора require .

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

    Zend Framework 3 работает в соответствии со стандартом PSR-4, что делает возможным автозагрузку всех его компонентов. Он также совместим с другими библиотеками, следующими PSR-4, такими как Doctrine и Symfony.

    3.4.3. Автозагрузчик, предоставляемый Composer’ом

    Composer может генерировать автозагрузчики (как автозагрузчик карты классов, так и стандартный PSR-4 автозагрузчик) для кода пакетов, которые он устанавливает. Zend Framework 3 использует реализацию механизмов автозагрузки, предоставляемую Composer’ом. При установке пакетов Composer автоматически создает файл APP_DIR/vendor/autoload.php, использующий функцию spl_autoload_register() , чтобы зарегистрировать автозагрузчик. Таким образом, все PHP-классы, находящиеся в каталоге APP_DIR/vendor , корректно загружаются автоматически.

    Для автозагрузки PHP-классов, расположенных в ваших собственных модулях (например, в модуле Application ), вам нужно будет указать ключ autoload в файле composer.json :

    Затем все, что нужно будет сделать, это включить этот файл во входном скрипте index.php вашего веб-сайта:

    Файл autoload.php генерируется каждый раз как вы устанавливаете пакет с помощью Composer. Помимо этого, чтобы заставить Composer сгенерировать файл autoload.php, вы можете выполнить команду dump-autoload :

    php composer.phar dump-autoload

    3.4.4. PSR-4 и структура исходных каталогов

    В Zend Skeleton Application вы можете наблюдать стандарт PSR-4 на практике. Для стандартного модуля вашего сайта, модуля Application , PHP-классы, зарегистрированные стандартным автозагрузчиком, хранятся в каталоге APP_DIR/module/Application/src («src» — сокращение от «source» — «источник»).

    Мы будем называть каталог src исходным каталогом модуля.

    Для примера рассмотрим файл IndexController.php модуля Application (рисунок 3.2).

    Рисунок 3.2. Структура каталогов скелетного приложения соответствует стандарту PSR-4

    Как видите, он содержит класс IndexController 1 , принадлежащий пространству имен Application\Controller . Чтобы соблюдать стандарт PSR-4 и использовать стандартный автозагрузчик с этим классом, нужно поместить его в директорию Controller в исходном каталоге модуля.

    1) Класс IndexController — это стандартный контроллер для скелетного сайта. Мы будем говорить о контроллерах в главе Модель-представление-контроллер.

    Объекты и классы в PHP

    Классы и объекты в PHP

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

    В PHP класс определяется с помощью следующего синтаксиса:

    Внутри определения класса можно использовать ключевое слово this для обращения к текущему представителю класса.

    Определение класса, описывающего категории статей, имеющих такие свойства, как название, автор и краткое содержание.

    Инициализация переменных

    В PHP4 можно инициализировать значения с помощью оператора var или с помощью функции-конструктора. С помощью var можно инициализировать только константные значения. Для задания не константных значений используют функцию-конструктор, которая вызывается автоматически, когда объект конструируется из класса. Функция-конструктор должна иметь имя, совпадающее с именем всего класса, в котором она определена.

    При создании объекта «статья» установим его свойства следующим образом: автора – равным строке «Иванов», название и краткое содержание – соответствующим элементам глобального массива $_POST, а дату публикации статьи – текущей дате.

    В PHP5 конструктор класса именуется _construct. Кроме того, в PHP5 появились и деструкторы – функции, которые вызываются автоматически перед уничтожением объекта. В PHP5 функция-деструктор должна быть названа _destruct.

    Объекты

    Класс – это описание данных одного типа, данных типа объект. Классы являются как бы шаблонами для реальных переменных. Переменная нужного типа (объект) создается из класса с помощью оператора new. Создав объект, мы можем применять к нему все методы и получать все свойства, определенные в описании класса. Для этого используют такой синтаксис:
    $имя_объекта->название_свойства или $имя_объекта->название_метода(список аргументов).
    Заметим, что перед названием свойства или метода знака $ не ставят.

    Переменная в PHP имеет только один знак доллара перед именем, поэтому нельзя писать $art->$title. Эта конструкция будет рассмотрена не как обращение к свойству title объекта $art, а как обращение к свойству, имя которого задано переменной $title (например, $art->»»).

    Создавая класс, мы не можем знать, какое имя будет иметь объект этого класса, тем более что объектов может быть много и все могут иметь разные имена. Соответственно мы не знаем, как обращаться к объекту внутри определения класса. Для того чтобы иметь доступ к функциям и переменным внутри определения класса, нужно использовать псевдопеременную $this. Например, $this->title возвращает значение свойства title у текущего объекта данного класса.

    Наследование

    Любой класс может быть расширением другого класса. Расширяющий (или производный) класс, кроме тех свойств и методов, которые описаны в его определении, имеет все функции и свойства основного (базового класса). В нашем примере класс программистов – расширяющий, а класс всех людей – базовый. Из класса нельзя удалить никакие существующие свойства и функции, класс можно только расширить. Расширяющий класс в PHP4 всегда зависит только от одного базового класса, поскольку множественное наследование
    в PHP не поддерживается. Расширяются классы в PHP с помощью ключевого слова extends.

    Создадим объекта класса programmer с помощью конструкции new и используем функции, заданные для класса Person, т.е. устанавливать и получать имя и фамилию программиста и отображать сведения о нем в браузере:

    Конструкторы

    Здесь функция Programmer() является конструктором, т.е. выполняется сразу после создания любого представителя класса Programmer, задавая ему имя «Иван» и фамилию «Петров».

    Оператор ::

    Иногда внутри описания класса возникает необходимость сослаться на функции или переменные из базового класса или ссылаться на функции в классе, ни один представитель которого еще не создан. В PHP4 для этого существует специальный оператор «::»

    Например, вот так можно вызвать в описании класса Programmer функцию show_name() из базового класса Person и функцию say_hello(), заданную в описании класса Programmer, когда ни один объект этого класса еще не был создан:

    В результате работы этой программы получим следующее:

    Привет!
    Меня зовут Вася Сидоров!
    И я знаю теперь еще и PHP

    С помощью команды Programmer::say_hello(); мы вызываем функцию say_hello класса Programmer как таковую, а не как метод, применяемый к объекту данного класса. В этот момент переменных класса нет. Поэтому функции, вызываемые до создания объекта, не могут пользоваться переменными класса и конструкцией this, но могут пользоваться локальными и глобальными переменными.

    В определении класса Programmer мы переопределили функцию show_name(), поэтому вызвать функцию show_name()
    из базового класса Person можно только с помощью оператора «::» Вообще говоря, внутри определения класса мы можем вызывать любые методы и свойства, заданные в его базовом классе с помощью обычного $this, если только порожденный класс не переопределяет эти свойства и методы, как в нашем примере.

    Объектная модель PHP5

    Кроме нового названия для конструкторов и появления деструкторов в PHP5 произошло еще достаточно много изменений.

    Некоторые из них:

    • Передача значений параметров класса и присвоение объектов происходит по ссылке, а не по значению, как это было в PHP4.
    • В PHP5 если создаются две равные переменные типа объект, то они указывают на одно значение и изменяются одновременно
      — механизм создания копий — клонирование.
  • В PHP4 все методы и переменные класса доступны извне, т.е. они всегда являются открытыми.
    В PHP5 переменные и методы можно делать открытыми (доступными отовсюду),
    закрытыми (доступными только внутри класса) и защищенными (доступными внутри класса и в его производных классах)
  • Решение задачи

    Для начала создадим форму, где пользователь выбирает, что он хочет создать,
    – описание статьи или человека (точнее, это будут две формы):

    Теперь напишем файл для обработки этих форм. В нем создадим два класса – статьи и личности. У каждого класса имеется метод для инициализации его переменных и метод для отображения объектов данного класса. При решении задачи будут использованы две функции, встроенные в PHP для работы с классами и объектами. Это функция get_class(объект), возвращающая имя класса, экземпляром которого является объект, переданный ей в качестве параметра. И функция get_class_vars(имя класса), которая возвращает массив всех свойств класса и их значений по умолчанию. Аналогично можно получить массив имен всех методов класса: get_class_methods(имя класса)

    Классы и объекты в PHP

    Сегодня мы поговорим о том, что вообще такое объектно-ориентированное программирование и о том, как оно реализовано в PHP. Здесь же поговорим о классах и объектах, об их различии и предназначении.

    Объектно-ориентированное программирование

    До этого момента мы с вами писали простейшие скрипты, представляющие собой небольшой набор php-файлов, подключаемых один внутри другого. В них всё было довольно просто — у нас были функции, которые мы вызывали одну за другой. С таким подходом можно без проблем делать простые проекты.

    Однако, если приложение становится большим и над проектом работают сразу несколько человек, то требуется использовать другой подход — объектно-ориентированное программирование. Вся его суть лежит в его названии — объектно-ориентированное. То есть основанное на объектах. Если говорить более развернуто, то это подход, базирующийся на объектах и на взаимоотношениях между ними.

    Что вообще за объекты такие?

    Давайте на минутку забудем о программировании и подумаем: что такое объекты. Да это всё, что нас окружает. Взгляните на комнату вокруг. Вот же: стул, стол, цветок, ручка, листок бумаги — всё это является объектами. Вы, в том числе, тоже объект. Вы можете взять ручку и начать что-то писать на листе бумаги. Это — взаимодействие между объектами. А ещё, если присмотреться, то можно понять, что все объекты созданы по какому-то определенному шаблону.

    Возьмем к примеру те же шариковые ручки: одна — желтая, другая — синяя. Да, цвет у них разный, но если вы посмотрите на них, то безошибочно их классифицируете как ручки. И вы понимаете, что для того, чтобы сделать ручку, нужен какой-то чертёж, по которому её будут собирать. И то же самое со столом, стулом, и даже Вами — ваша ДНК содержит «шаблон», по которому вы в итоге собрались.

    Ровно то же самое происходит и в объектно-ориентированном программировании. Виртуальные объекты создаются на основе специальных шаблонов, называемых классами. Класс — это своего рода «чертёж», на основе которого будут созданы объекты. Объект же, как из этого следует — это экземпляр какого-то класса. То есть сущность, созданная по этому шаблону.

    Классы в PHP

    Итак, представим, что мы хотим создать некоторую упрощенную модель котика в PHP. Для этого нам сперва надо сделать его «чертёж», а именно — создать класс. Мы смотрим на котиков и понимаем что это котики. Это происходит по тому, что все котики имеют какие-то общие признаки. По этим признакам мы можем отличать одни классы объектов от других.

    Классы в PHP создаются с помощью слова class, за которым следуем имя класса. Имя класса должно быть написано в CamelCase и начинаться с большой буквы. Затем с новой строки открывается фигурная скобка, далее идёт тело класса, и, наконец, закрывающая фигурная скобка.

    Итак, самый простейший пример класса котика выглядит следующим образом:

    Сам по себе этот код сейчас ничего не выведет. Это — просто шаблон. Точно так же, как если бы мы просто описали функцию.

    Объекты в PHP

    Итак, мы сделали некоторый шаблон, который описывает котиков. Пора бы уже и котика по нему собрать. А именно — создать объект.

    Объекты создаются с помощью ключевого слова new:

    Так мы создали объект с типом Cat и вывели его с помощью var_dump().

    Как видим, в переменной лежит объект (object). И больше пока ничего.

    Мы можем создать ещё несколько котиков, и все они будут объектами этого класса:

    Результат этого кода:

    Видим, что это действительно объекты класса Cat, однако их идентификаторы разные: 1, 2 и 3 (в PHP каждый отдельный объект имеет собственный идентификатор).

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

    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL