+375 (29) 803-95-65
заказать звонок

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

Надеюсь, вы нашли эту статью до того, как возненавидели свой старый код за то, что теперь внести в него изменения, ничего при этом не сломав, стало задачей высокого порядка. Лично мне — не удалось. :)

Здесь на практическом примере будет показано как использовать объектно-ориентированное программирование в ваших проектах.

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

В жизни мы оперируем объектами, используя методы работы с ними. Мы пьем из кружки, надеваем ботинки, звоним по телефону. «Кружка» – объект, «пить» – метод. Заметьте, вы не думаете: «Сейчас я опущу руку к столу, протяну пальцы к ручке кружки, сомкну их, подниму кружку ко рту, наклоню, совершу глотательное движение,  done» - вы просто взяли и выпили. Вспомните об этом, когда в следующий раз будете доставать запись из базы, производить с ней разные манипуляции и выводить на экран.


Сковороды бывают разные: без ручки / с антипригарным покрытием / черные / красные и вообще. Это свойства объектов. Ими одна сковородка отличается от другой, объединившись в класс «Сковороды». И для каждой - общий набор методов.

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

Как быть, если вы не знаете, как использовать кружки  в PHP?
Это очевидно – прыгайте в окно.

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

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

Скорее всего, вы создадите форму для ввода содержания статьи form.php:

<form action="action.php" method="POST">
    <p>
        Название:
    </p>
    <p>
        <input name="name" type="text">
    </p>
    <p>
        Дата публикации:
    </p>
    <p>
        <input name="date" type="text">
    </p>
    <p>Содержание:</p>
    <p>
        <textarea name="content" rows="5"></textarea>
    </p>
    <p><input type="submit" value="Отправить"></p>
</form>

Напишете action.php для обработки формы:

<?
if(!$_POST['name'] || !$_POST['date'] || !$_POST['content']) die('Заполните все поля!'); 
// проверка на заполненность полей
if(!preg_match('/^[0-9]{4}\-[0-9]{2}\-[0-9]{2}$/', $_POST['date'])) die('Неверный формат даты!'); 
// на случай, если в базу вы хотите вносить дату только в формате ГГГГ-ММ-ДД

/* Готовим данные к записи - экранируем спецсимволы */
$name = htmlspecialchars($_POST['name'], ENT_QUOTES);
$date = $_POST['date'];
$content = htmlspecialchars($_POST['content'], ENT_QUOTES);

$q = mysql_query("INSERT INTO table SET `name` = '$name', `date` = '$date', `content` = '$content' ") or die(mysql_error()); 
// ну или как-то по-другому вносите в базу

 

Сделаете index.php, который примет параметр «id», который будет отвечать за номер искомой статьи:

<?
if(!$_GET['id']) die('404');
$id = (int) $_GET['id'];
$q = mysql_query("SELECT * FROM table WHERE id = '$id' ") or die(mysql_error());
if(!mysql_num_rows($q)) die('404');
$r = mysql_fetch_array($q);
$name = html_entity_decode($r['name']);
$title = $name . ' | SuperSite';
$content = nl2br( html_entity_decode($r['content']) );
$date = explode($r['date'], '-');
$day = $date[0];
$month = $date[1];
$year = $date[2];
switch ($month) {
    case '01':
        $month_text = 'января';
        break;
    /* ... */
    /* и так до декабря */
}
?>
<!DOCTYPE html>
<html>
<head>
    <title><?=$title?></title>
</head>
<body>
    <h1><?=$name?></h1>
    <p>Дата публикации: <?=$day .' '. $month_text .' '. $year?></p>
    <p>
        <?=$content?>
    </p>
</body>
</html>

 

Ну, как-то так. Кода много, все некрасиво.
Можно было так:


form.php

<?
require 'page.class.php';
$Page = new Page;
$Page->renderForm();

action.php

<?
require 'page.class.php';
$Page = new Page;
$Page->save($_POST);

index.php

<?
require 'page.class.php';
$Page = new Page($_GET['id']);
?>
<!DOCTYPE html>
<html>
<head>
    <title><?=$Page->title?></title>
</head>
<body>
    <h1><?=$Page->name?></h1>
    <p>Дата публикации: <?=$Page->formatDate?></p>
    <p>
        <?=$Page->content?>
    </p>
</body>
</html>

Стало красивее. Мы теперь как будто на кнопки нажимаем: «Проверка формы», «Сохранение формы», «Вывод формы».

Правда, добавился файл page.class.php. Вот, что он содержит:

<?
class Page{
    var $id;
    var $name;
    var $title;
    var $content;
    var $date;
    var $formatDate;
    function __construct($id = null){
        if($id){
            $id = (int) $id;
            $q = mysql_query("SELECT * FROM table WHERE id = '$id' ") or die(mysql_error());
            if(!mysql_num_rows($q)) die('404'); // если запись не найдена
            $r = mysql_fetch_array($q);

            $this->id = $id;
            $this->name = html_entity_decode($r['name']);
            $this->title = $this->name . ' | SuperSite';
            $this->content = nl2br( html_entity_decode($r['content']) );
            $this->formatDate = getFormatDate($r['date']);
        }
    }
    function getFormatDate($date){
        $date = explode($date, '-');
        $day = $date[0];
        $month = $date[1];
        $year = $date[2];
        switch ($month) {
            case '01':
                $month_text = 'января';
                break;
            /* ... */
            /* и так до декабря */
        }
        return $day .' '. $month_text .' '. $year;
    }
    function renderForm(){
        $form = <<<HTML
            <form action="action.php" method="POST">
                <p>
                    Название:
                </p>
                <p>
                    <input name="name" type="text">
                </p>
                <p>
                    Дата публикации:
                </p>
                <p>
                    <input name="date" type="text">
                </p>
                <p>Содержание:</p>
                <p>
                    <textarea name="content" rows="5"></textarea>
                </p>
                <p><input type="submit" value="Отправить"></p>
            </form>
HTML;
        echo $form;
    }
    function validateForm($data){
        if(!$data['name'] || !$data['date'] || !$data['content']) die('Заполните все поля!');
        if(!preg_match('/^[0-9]{4}\-[0-9]{2}\-[0-9]{2}$/', $data['date'])) die('Неверный формат даты!');
        return true;
    }
    function save($data){
        if(!$this->validateForm($data)) return false;

        $name = htmlspecialchars($data['name'], ENT_QUOTES);
        $date = $data['date'];
        $content = htmlspecialchars($data['content'], ENT_QUOTES);

        $q = mysql_query("INSERT INTO table SET `name` = '$name', `date` = '$date', `content` = '$content' ") or die(mysql_error());
    }
}

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

Вам еще многое предстоит узнать, здесь изложены азы. Информации об объектно-ориентированном программировании достаточно - если понимаете суть, разобраться в синтаксисе и мелочах не составит труда. Начните с наследования (конструкция «extends»), констант и статичных методов. Удачи. :)

больше об ООП читайте на php.net