« Поставить закладку » « Сделать стартовой »

« Форумы » « Блоги » « Статьи » « Новости » « Файлы » « Realcoding IRC » « Site map » « Поиск »


Главная Главная
Анонсы Анонсы
Форумы Форумы
Каталог Каталог
Поиск Поиск
Опросы Опросы
Книжный магазин Книжный магазин
Реклама на сайте
Публикации Публикации
Партнеры Партнеры
Карта Карта сайта
Рассылки Рассылки
RSS экспорт
Настройки Настройки
О нас пишут О нас пишут
Контакты Контакты
Гостевая книга Гостевая книга

Тестирование 64-битных приложений

ПнВтСрЧтПтСбВс
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          
    Популярное
Java и .Net - способность к взаимодействию через CORBA

Функция GetWindowRect

Тесты

Будущее CSS

Персональный CSS хак для Internet Explorer 7

Функция AccessResource

Функция EnumWindows

Секреты Delphi. Использование TClientDataset в двухуровневых приложениях. Часть 3

Функция FrameRgn

Interbase BLOB-поля




    Архив файлов



    Сообщества



    Документация

Статьи:: Интернет технологии :: PHP :: Объектно-ориентированное программирование в PHP


отправить ссылку другу версия для печати  Обсудить на форуме

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





Никита Кислицин

(nikitoz@real.xakep.ru) http://xa.nikitos.inc.ru

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

Что такое ООП?

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

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

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

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

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

Причем же здесь PHP?

Может показаться, что объектно-ориентированный подход применим лишь для системных языков программирования. Это не так, функции ООП присутствуют и в скриптовых языках типа Perl и PHP. И использовать объектный подход оказывается очень и очень удобно. Ниже я расскажу о семантике ООП в PHP и рассмотрю процесс создания несложного класса для работы с сетевыми соединениями через proxy-сервер.

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

<?

class ClassName {

/* Ниже - определение свойств. Оператором var инициализируется параметр, его наличие обязательно */

var $a1="value1"; /* Свойство можно инициализировать некоторым значением по умолчанию */

var $a2; /* Но делать это необязательно */

/* Ниже - определение методов. Они вводятся ключевым словом function */

function func1($a3, $a4) {

/* здесь следует описание метода. Как видно, функция принимает два параметра, являющимися свойствами описываемого класса; вообще, для указания на создаваемый класс используется переменная $this (ведь у класса может быть множество экземпляров с самыми разными именами). */

} }

?>

Создание нового экземпляра класса реализуется при помощи оператора new:

$NewObject=new ClassName;

Теперь ссылаться на свойства и методы этого объекта можно уже известным способом: $NewObject->var1.

Наследование позволяет создавать новые классы путем добавления атрибутов к уже существующему классу. Это реализуется при помощи оператора extends:

<?

/* Ниже мы создадим новый класс ClassName, который унаследует все атрибуты ClassName, но будет иметь и собственные */

class ClassName2 extends ClassName {

/* определяем новые свойства */

var $a3="value3";

/* Определение дополнительных методов */

function func2($a65) {

/* описание функции */

}

}

?>

Кодим

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

<?

class HttpConnection {

var $ProxyHost;

var $ProxyPort;

function HttpOpenConnection ($Host, $Path, $Port) {

/* Проверяем, хочет ли юзер использовать прокси-сервер для соединения */

if (!isset($ProxyHost) || !isset($ProxyHost)) {

/* Подключаемся без использования прокси-сервера, поскольку

пользователь не определил соответствующие свойства класса */

$ConnectionHost=$Host;

$ConnectionPort=$Port;

echo $Port;

} else {

$ConnectionHost=$this->$ProxyHost;

$ConnectionPort=$this->$ProxyPort;

}

/* Следует заметить, что и запрос прокси-серверу, и запрос веб-браузеру имеют один и тот же вид (см. соответствующие RFC-документы). Поэтому вся разница между прямым подключением и коннектом через проксик заключается в удаленном сокете, с которым осуществляется связь. */

$Query="GET http://"."$Host:$Port".$Path." HTTP/1.1rn".

"Accept: */*rn"."User-Agent: Xa-style phpClass v1.0rn".

"Host:$Hostrnrn";

/* Открываем сокет с удаленной точкой связи */

$SocketPointer=fsockopen($ConnectionHost, $ConnectionPort);

if ($SocketPointer) { /* Если соединение установлено */

fputs($SocketPointer, $Query); /* Пишем в сокет запрос */

return $SocketPointer; /* Возвращаем указатель на соединение */

} else return false; /* Если соединение не удалось установить, возвращаем false */

}

?>

<?

/* Пример использования класса */

Require Class.php; /* подключаем класс */

$conn=new HttpConnection; /* создаем новый экземпляр класса */

$conn->ProxyHost="192.168.0.1"; /* Определяем свойства объекта */

$conn->ProxyPort=3128;

$fp=$atom->ShowFile("www.host.ru", "/index.html", 80); /* Вызываем метод ShowFile */

?>




Рубрика: PHP




Инструменты Internet Explorer 8 Beta 2 для разработчиков.

Вебмастеру

В марте этого года мы уже писали об инструментах для разработчика в IE8 Beta 1, но IE8 Beta2 позволяет более полно использовать инструменты за счет значительных изменений в имеющихся функциях, а также новых возможностей. В принципе инструменты для разработчика должны обладать следующими свойствами: Быть интегрированными и простыми в использовании; Иметь визуальный интерфейсC их помощью можно быстро протестировать сайт.


Подробнее... | Рубрика: Вебмастеру | Добавлено: 05.09.2008

Google Developer Day 2008 в Москве.

Мероприятия

Дата проведения: 28 октября 2008 г.; Место проведения: Амбер Плаза, Москва, Россия. Конференция для веб-разработчиков и разработчиков мобильных приложений в Москве. Узнайте, как наилучшим образом использовать инструменты разработки и API от Google, чтобы создавать социальные, мобильные и картографические приложения, как использовать AJAX/JavaScript инструменты и библиотеки от Google и многое другое из первых уст.


Подробнее... | Рубрика: Мероприятия | Добавлено: 05.09.2008

ТОП 10 самых раздражающих факторов для программиста.

Разное

Совсем недавно наткнулся в интернете на забавный "хит-парад" наиболее раздражающих вещей для программиста. Поскольку он был на английском — решил перевести текст и несколько адаптировать к нашим реалиям…


Подробнее... | Рубрика: Разное | Добавлено: 03.09.2008

Остальные статьи:

Windows Server 7, 8 и 9
jQuery для JavaScript-программистов
Инновационный веб-броузер Google Chrome стартует уже сегодня
Windows 7: подход к производительности системы
Trac + Subversion @ Ubuntu: Revisited
[g]Vim в режиме Python: Рекомпиляция в Windows
Java + JSON. Пути к дружбе
Драйвер SQL Server 2005 для PHP
Типы данных в MySQL (сжатый справочник для PHP программиста)
PHP класс для работы с Яндекс.XML
Ошибки начинающих PHP разработчиков
Наследование шаблонов в Smarty
Особенности хранения сессий PHP в memcached
Internet Explorer 8 beta 2
9 правил для начинающего Ajax-разработчика
ExtJS 2.2 - полная поддержка Firefox 3, новые виджеты и другие нововведения


Цитата дня (все,добавить):



    Рубрикатор

Программирование

C/С++
Обучение
Windows API
XAML
Моделирование
Паттерны
Visual Basic 7 .NET
WxWidgets
Функции WinApi
Функции С++
Разработка под Mac OS
Eiffel
Visual Studio 2008
UI дизайн
Алгоритмы
Конкурсные статьи
Turbo Pascal
Visual Studio
CASE-средства
Visual Studio 2005
Без VCL
Delphi
Тех. документация
Тестирование
Software Testing
ООП
TCP/IP
Google Android
Windows Installer
.NET Framework
Драйвера
C# C Sharp
Справка
Проектирование
Информ. системы
Visual Basic
Assembler
Оптимизация кода
Gtk+
Компоненты
Реинжиниринг
Управление проектами
Extreeme programming
Lotus Notes
Алгебраическое проектирование

Интернет технологии

PHP
Perl
ASP
WAP
Cookies
SSI
CGI
Web Servers
VB Script
DNS
CSS
XML
Html
Java Script
Java2ME
Firewall
Flash
.htaccess
Apache
VRML
Протоколы
Поисковые системы
Технология JAVA
Учебник по PHP
Учебник по JavaScript
Учебник по XML
Java Q&A
AJAX
DHTML
XHTML
Dreamweaver
Web 2.0
Python
Вебмастеру
Cisco
Ruby on Rails
Silverlight

Базы данных

Access
InterBase
MySQL
Oracle
ADO .NET
Основы SQL
Учебник по Access 2002
MS
Microsoft FoxPro
Доступ к данным
XML в MS SQL Server 2000
ODBC и MyODBC
Обучение
Caché
DB2
PostgresSQL
Sybase
Теория
Хранилища данных
Безопасность
Реляционные данные
MySQL и mSQL

Остальное:

Разное
Обзоры книг
Безопасность
Графика и дизайн
Юмор
Linux
Фракталы
Microsoft Axapta
Многоядерность
Сети
Microsoft Office
Работа
MS-DOS
Криптография
Графика и игроделание
Новости SDK
Системы защиты
Учебник по AutoCad
CVS
Windows XP
Windows Server 2003
Windows Vista
Windows 7
Мероприятия

    Кто на сайте
Вы не зарегистрированы.
Имя:

Пароль:

Запомнить

Регистрация позволит Вам пользоваться дополнительными сервисами.
Сейчас на сайте:
Гостей: 103
Пользователей: 0