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

Поиск по сайту



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. Это указатель, с помощью которого объект может ссылаться на самого себя.

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

РЕЗУЛЬТАТ ПРИМЕРА 1:

Маша! Привет!

Миша! Привет!

Яша! Пока!

Яша! Привет!

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

Пример 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>
РЕЗУЛЬТАТ ПРИМЕРА 2:

Кто-то там! Привет!

Миша! Привет!

Маша! Привет!

Сложив все, изложенное выше, можно создать более осмысленный класс. Например, класс, который будет располагать данные в виде таблицы с поименнованными столбцами.

Пример 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 выводит таблицу на экран.

РЕЗУЛЬТАТ ПРИМЕРА 3:
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:

Маша! Какая встреча!

Начиная с 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>
РЕЗУЛЬТАТ ПРИМЕРА 5:

Маша! Какая встреча!

Маша! Привет!

Итак, производный класс может наследовать, переопределять и дополнять свойства и методы другого класса.

В следующем примере создан класс 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 ;

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

РЕЗУЛЬТАТ ПРИМЕРА 6:
abc
132
31
431

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



Ещё примеры работы с DOM на PHP

Читать дальше: Работа с формами на PHP

Популярное:


Содержание:


Новое за неделю



Сейчас на сайте: 489