Поиск по сайту
PHP Поиск
Объектное программирование
Объект - это набор специальных переменных - свойств и специальных функций - методов. Для доступа к свойствам и методам объекта служит оператор "->". Объект создается с помощью оператора new на основании шаблона, называемого классом. Класс определяется ключевым словом class.
Пример 1
<html>
<head>
<title>Класс со свойством и методом</title>
</head>
<body>
<?php
class классN1
{
var $имя = "Маша";
function Привет()
{
echo "<H1 align=center>$this->имя! Привет!</H1>";
}
function Пока( $a )
{
$this->имя = $a;
echo "<H1 align=center>$this->имя! Пока!</H1>";
}
}
$obj = new классN1();
$obj->Привет();
$obj->имя = "Миша";
$obj->Привет();
$obj->Пока("Яша");
$obj->Привет();
?>
</body>
</html>
Внутри класса использована специальная переменная this. Это указатель, с помощью которого объект может ссылаться на самого себя.
Методу Пока передан аргумент точно так же, как и обычной функции. При вызове этого метода объект меняет свое свойство имя.
Маша! Привет!
Миша! Привет!
Яша! Пока!
Яша! Привет!
Если создать метод, имя которого совпадает с именем класса, то этот метод будет вызываться автоматически при каждом создании объекта. Такой метод называется конструктором. Конструктор может принимать аргументы, что значительно упрощает работу с классами.
Пример 2
<html>
<head>
<title>Класс с конструктором</title>
</head>
<body>
<?php
class классN1
{
var $имя;
function классN1( $a="Кто-то там" )
{
$this->имя = $a;
}
function Привет()
{
echo "<H1 align=center>$this->имя! Привет!</H1>";
}
}
$obj0 = new классN1();
$obj1 = new классN1("Миша");
$obj2 = new классN1("Маша");
$obj0->Привет();
$obj1->Привет();
$obj2->Привет();
?>
</body>
</html>
Кто-то там! Привет!
Миша! Привет!
Маша! Привет!
Сложив все, изложенное выше, можно создать более осмысленный класс. Например, класс, который будет располагать данные в виде таблицы с поименнованными столбцами.
Пример 3
<html>
<head>
<title>Класс Table</title>
</head>
<body>
<?php
class Table
{
var $headers = array();
var $data = array();
function Table ( $headers )
{
$this->headers = $headers;
}
function addRow ( $row )
{
$tmp = array();
foreach ( $this->headers as $header )
{
if ( ! isset( $row[$header] )) $row[$header] = "";
$tmp[] = $row[$header];
}
array_push ( $this->data, $tmp );
}
function output ()
{
echo "<PRE><B>";
foreach ( $this->headers as $header ) echo "$header ";
echo "</B><BR>";
foreach ( $this->data as $y )
{
foreach ( $y as $x ) echo "$x ";
echo "<BR>";
}
echo "</PRE>";
}
}
$test = new Table (array("a","b","c"));
$test->addRow(array("a"=>1,"b"=>3,"c"=>2));
$test->addRow(array("b"=>1,"a"=>3));
$test->addRow(array("c"=>1,"b"=>3,"a"=>4));
$test->output();
?>
</body>
</html>
Свойства класса Table - массив имен столбцов таблицы и двумерный массив строк данных. Конструктор класса Table получает массив имен столбцов таблицы. Метод addRow добавляет в таблицу новую строку данных. Метод output выводит таблицу на экран.
a b c 1 3 2 3 1 4 3 1
Наследование
На основе существующих классов можно создавать новые, используя механизм наследования. Механизм наследования - это использование определенного ранее класса в качестве родительского. При этом набор свойств и методов родительского класса можно расширять. Имейте в виду, что производный класс имеет только одного родителя.
Чтобы создать новый класс, наследующий поведение существующего класса, надо использовать ключевое слово extends в его объявлении. Например:
class классN2 extends классN1
{
.......
}
Здесь классN1 - родительский класс, классN2 - производный.
Если производный класс не содержит собственного конструктора, то при создании его объекта используется конструктор родительского класса. Если в производном класса существует собственный конструктор, то конструктор родительского класса не вызывается. При необходимости вызвать конструктор родительского класса это надо сделать явно. Например:
классN1::классN1();
Производный класс будет иметь все свойства и методы родительского класса. Но их можно и переопределить в производном классе.
Пример 4
<html>
<head>
<title>Переопределение метода родительского класса</title>
</head>
<body>
<?php
class классN1
{
var $имя = "Маша";
function Привет()
{
echo "<H1 align=center>$this->имя! Привет!</H1>";
}
}
class классN2 extends классN1
{
function Привет()
{
echo "<H1 align=center>$this->имя! Какая встреча!</H1>";
}
}
$obj = new классN2();
$obj->Привет();
?>
</body>
</html>
Метод Привет переопределен для производного класса. Свойство имя наследуется от родительского.
Маша! Какая встреча!
Начиная с 4-й версии PHP, в объекте производного класса можно вызвать метод родительского класса, который был переопределен.
Пример 5
<html>
<head>
<title>Вызов метода родительского класса</title>
</head>
<body>
<?php
class классN1
{
var $имя = "Маша";
function Привет()
{
echo "<H1 align=center>$this->имя! Привет!</H1>";
}
}
class классN2 extends классN1
{
function Привет()
{
echo "<H1 align=center>$this->имя! Какая встреча!</H1>";
классN1::Привет();
}
}
$obj = new классN2();
$obj->Привет();
?>
</body>
</html>
Маша! Какая встреча!
Маша! Привет!
Итак, производный класс может наследовать, переопределять и дополнять свойства и методы другого класса.
В следующем примере создан класс HTMLTable, основанный на классе Table из примера 3. Новый класс формирует данные, сохраненные методом addRow родительского класса, и выводит их в HTML-таблицу. Свойства $cellpadding и $bgcolor дают возможность изменять соответствующие аргументы, при этом переменной $cellpadding присваивается значение по умолчанию, равное 2.
Пример 6
<html>
<head>
<title>Классы Table и HTMLTable</title>
</head>
<body>
<?php
class Table
{
var $headers = array();
var $data = array();
function Table ( $headers )
{
$this->headers = $headers;
}
function addRow ( $row )
{
$tmp = array();
foreach ( $this->headers as $header )
{
if ( ! isset( $row[$header] )) $row[$header] = "";
$tmp[] = $row[$header];
}
array_push ( $this->data, $tmp );
}
function output ()
{
echo "<PRE><B>";
foreach ( $this->headers as $header ) echo "$header ";
echo "</B><BR>";
foreach ( $this->data as $y )
{
foreach ( $y as $x ) echo "$x ";
echo "<BR>";
}
echo "</PRE>";
}
}
class HTMLTable
{
var $cellpadding = "2";
var $bgcolor;
function HTMLTable ( $headers, $bg="FFFFFF" )
{
Table::Table( $headers );
$this->bgcolor = $bg;
}
function setCellpadding ( $padding )
{
$this->cellpadding = $padding;
}
function output ()
{
echo "<table cellpadding=$this->cellpadding><tr>";
foreach ( $this->headers as $header )
echo "<th bgcolor=$this->bgcolor>$header";
foreach ( $this->data as $y )
{
echo "<tr>";
foreach ( $y as $x )
echo "<td bgcolor=$this->bgcolor>$x";
}
echo "</table>";
}
}
$test = new HTMLTable ( array("a","b","c"), "#00FFFF" );
$test->setCellpadding ( 7 );
$test->addRow(array("a"=>1,"b"=>3,"c"=>2));
$test->addRow(array("b"=>1,"a"=>3));
$test->addRow(array("c"=>1,"b"=>3,"a"=>4));
$test->output();
?>
</body>
</html>
Обратите внимание на то, что значение свойства сellpadding меняется с помощью отдельного метода setCellpadding. Конечно, значения свойств можно менять непосредственно, вне объекта:
$test->сellpadding = 7 ;
Но это считается дурным тоном, т.к. в сложных объектах при изменении одного из свойств могут изменяться и другие свойства.
| a | b | c |
|---|---|---|
| 1 | 3 | 2 |
| 3 | 1 | |
| 4 | 3 | 1 |
Использовать или нет технику объектного программирования? С одной стороны, проект, интенсивно использующий объектную технику, может занимать слишком много ресурсов во время выполнения. С другой стороны, правильно организованный объектный подход значительно сократит время разработки и сделает программу более гибкой.
Ещё примеры работы с DOM на PHP
Читать дальше: Работа с формами на PHP
Популярное:
- Генератор Sitemap
- Отправить SMS
- Генератор Robots.txt
- Полезные ссылки
- Чей IP-адрес?
- Чей домен?
- Где телефон?
- Примеры Ajax
- Примеры PHP
- Примеры Javascript
- Примеры HTML, CSS
- Справочник PHP
- GIF-аниматор
- Сайт в ТОП
Содержание:
- HTML
- JavaScript
- PHP + MySQL
- Введение в PHP
- Основы языка
- Использование
массивов - $_server
- Создание функций
- Строки
- Функции работы
со строками - Объектное
программирование - Формы
- Файлы
- MySQL
- Cookie
- htaccess
- Безопасность
- Сессии
- Отправка почты
- Кэширование
- Дата, время
- Математические
функции - Дополнительные
возможности - Регулярные
выражения - Библиотека Curl
- IMAP, POP3, NNTP
- Оптимизация
- Примеры скриптов
- XML + XSLT
- AJAX
- Графика CorelDRAW
- SEO
- Сервисы
- Разное
- Шаблоны сайтов
Новое за неделю
Сейчас на сайте: 489