Как писать классы в PHP

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

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

Пример простого PHP класса, показывающего, как устроены php-класса и как с ними работать:

<?php
Class Sample // Объявляем новый класс с именем Sample
{
    var $Title;     // объявляем внутреннюю переменную класса
    var $Content;   // еще одна переменная
 
/* эти функции будут работать только внутри класса Sample */
/* или внутри классов-наследников данного класса */
function setTitle($title) // устанавливает значение в переменную $Title
{
/* Обратите внимание, что бы обратиться к переменной, */
/* нужно сначало написать $this-> а потом только имя переменной */
    $this->Title = $title;
}
 
function setContent($content) // устанавливает значение переменной $Content
{
    $this->Content = $content;
}
 
/* для обращения к функциям внутри класса используется тот же */
/* подход, что и для переменных, т.е. $this->имя_функции(параметры) */
function setAll($title, $content) // Устанавливает переменные $Title и $Content
{
    // с помощью функций данного класса
    $this->setTitle($title);
    $this->setContent($content);
   // или через переменные
    //$this->Title = $title;
    //$this->Content = $content;
}
}
 
$newClass = new Sample(); // Создаем экземпляр класса Sample
$newClass->Title = "Заголовок"; // Изменение переменной класса Sample
$newClass->setAll("Заголовок", "Содержание"); // Обращение к функциям класса Sample
echo $newClass->Content; // Вывод в браузер переменной Content, находящейся в классе Sample
?>

В программировании классов на PHP5 появилось много нового, к примеру, теперь можно "защищать" функции и переменные, просто добавив перед ними "protected", "private" или "public".

protected – Защищает переменную или функцию от изменения вне класса или его наследников. Т.е. ее можно изменять только внутри класса и его наследников.

private – дает доступ к элементу класса исключительно внутри того класса, в котором этот элемент объявлен. , Это очень полезно, если используется закрытый код (Zen Optimizer или что-то подобное), например, для проверки кода активации условно-бесплатного php-скрипта.

public – разрешает доступ к переменной или функции любыми известными методами и способами.

Если вы хотите узнать больше о новых возможностях объектно-ориентированного программирования в PHP? читайте статью о новых возможностях PHP5, раздел про классы и их особенности в php5.

Подписывайтесь на наши группы в социальных сетях
Подписаться
Уведомить о
16 комментариев
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Anjey

Очень хорошо описано и рассказано!!! Автору большое спасибо!!!...........

Mr.Grey

Воообще программирую не так давно, и с классами не работал. При работе с библиотекой FPDF возникли вопросы. В статье всё просто и понятно, что нужно в ней нашел и проблему свою решил. Спасибо за инфу...

Дмитрий

Класс и объект это не одно и то же! Постараюсь объяснить через абстракцию.
Представьте себе перстень с печаткой - это класс. Его отпечаток(ки) на глине это объект(ы).
Добавьте в отпечаток еще штрихов и залейте металлом - получился новый класс наследовавший свойства старого плюс свои новые дополнительные свойства.

Dyavol

Зря, что нигде не учат классы как плавный переход от структур (или, как в паскале их называют "записи").
Тогда класс это просто структура, которая усовершенствована ещё и своими собственными функциями.

Таки класс и объект это разные вещи. Класс это аналог типа (да чё там аналог, класс это тоже такой тип переменных), а вот объект это переменная этого типа.
То есть
Class Sample
Тут Sample это класс
А вот тут
$newClass = new (Sample);
Переменная $newClass это объект класса Sample (iago как раз это и имел ввиду)

stadm

Описание на троечку. Если б не был знаком с ООП в целом, статья была бы абсолютно бесполезной.

Владимир

Единственная полезная строка: "И вообще, C++ и PHP очень похожи."
Давно пишу на php, и довольно сложные вещи были - но обходился только функциональным программированием. Решил перейти на ООП в php..

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

Если нужно просто считать базу - вывести в браузер - записать в базу, никаких классов не нужно, только усложнение кода.

Идущий мимо программист

Изучите классы в C++ - почти то же самое.
И вообще, C++ и PHP очень похожи.

kuzroman

Ну вы еще подеритесь тут))

alex

Нифига не понятно.... Все в php понял, но про классы нигде внятно не написано.....

Guest

Ничерта не понятно. Обычно, когда беруться описывать классы, то начинают с того, как описать конструктор/деструктор, например. Затем уже переходят к полям, методам и всему остальному. Про наследование ни слова не написали. Складывается впечатление, что классы в ПХП - это поименованные блоки кода, как и функции. Какая тогда выгода от ООП в данном случае?@misha:
Я б называл переменные класса свойством класса, как в Delphi
"Свойство" в дельфи - это такая конструкция языка, которая умеет возвращать откуда-то и (возможно) записывать куда-то значение заданного типа. Но само свойство ничего не хранит, в отличии от полей.

chelny

to iago

>>""пременные класса" - это и есть объекты..."

пременные класса это поля обьекта, а обьектом является класс

>> "эти функции будут работать только внутри класса Sample" - дикая чушь.."

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

anton

к сожалению нет поддержки множественного наследования, поэтому...
Вася, при чем тут множественное наследование??

АНтон

Кто писал этот говнокод? Откройте любой php-файл phpmyadmin и посмотрите что такое "удобочитаемый код"!

iago

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

В поисках ответа

Здравствуйте,
Хотелось бы задать вопрос: Какой приоритет в классах над простыми функциями, множество статей посвящённых классам, а где их лучше применять и где не стоит этого делать?