Отправляет email-рассылки с помощью сервиса Sendsay

Web-Мастеринг - с нуля до профи

  Все выпуски  

Первый выпуск в 2007-ом году!


Познавательное программирование

(comp.soft.prog.urisprog)

Выпуск 35


Здравствуйте, Уважаемые подписчики!
DVDSELLER.RU
СЕРИАЛЫ НА DVD ПОЧТОЙ
ВАВИЛОН-5, КРЕСТОВЫЙ ПОХОД, КЛАН СОПРАНО, ЛЕКС, ЗАЧАРОВАННЫЕ, ЮЖНЫЙ ПАРК и прочие сериалы на сайте WWW.DVDSELLER.RU!
Заказать эти сериалы можно также по e-mail: dvdseller@bk.ru

Объекты в PHP

PHP, как и любой уважающий себя современный язык, имеет поддержку объектно-ориентированного программирования. Об этом и пойдёт речь в этом выпуске.

Объекты в PHP описываются следующим образом:

class className //Определение объекта className
{
var $property; //Определение переменной объекта

function className() //Функция, описанная внутри объекта и имеющая то же имя, что и имя
{ //объекта, является конструктором этого объекта (по аналогии с C++)
$this->property=0; //Переменная $this внутри методов объекта ссылается на сам объект
};

function setProperty($property) // Определение метода объекта
{
$this->property = $property; // Обратите внимание, property в
// левой части выражения - это
// переменная объекта (доступ через
// $this), а в правой части - аргумент
// функции с тем же именем, что
// и переменная объекта.
};
};


Как и функции, объекты должны иметь уникальное имя. Однако в отличие от функций объявление объекта еще не дает возможности работать с ним. Для того, чтобы работать с объектом, необходимо создать экземпляр этого объекта (instance). Это делается также, как и во многих других языках:

//Описание объекта Man
class Man
{
var $firstName;
var $lastName;
var $age;


function Man($fName,$lName,$age)
{
$this->firstName = $fName;
$this->lastName = $lName;
$this->age = $age;
};

function getName()
{
return($this->firstName." ".$this->lastName);
};

function setAge($newAge)
{
$this->age = $newAge;
};
};

//Создание экземпляра объекта
$john = new Man('John','Smith',23); // Здесь мы передаем параметры непосредственно в конструктор объекта


Теперь переменная $john содержит экземпляр объекта Man. К слову сказать, хотя в PHP можно задавать конструкторы объектов, поддержки деструкторов для объектов до сих пор нет. Неясно, чем вызвано подобное ограничение, но это факт.

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

echo "Hello, my name is ".$john->getName();
echo "I'm ".$john->age." years old";


Кстати, я думаю, вы уже заметили, что имена переменных, являющихся переменными объектов, записываются без символа $ перед ними? Это происходит потому, что PHP рассматривает связку "(переменная-объект)->(переменная объекта)" как одну переменную. Зато это позволит вам очень элегантно делать например вот такие вещи:

$methodName = 'getName';
echo "My name is ".$john->$methodName;


Но объекты как таковые не были бы так интересны, если бы существовали сами по себе. Однако это не так и самым интересным, нужным и полезным свойством объектов является их наследование. Посмотрим, как это выглядит на примере уже описанного выше объекта Man:

// Описание объекта Worker, наследованного от объекта Man
class Worker extends Man
{
var $profession;
var $salary = 500; // Заметьте, переменные объектов могут быть
// инициализированы каким-то значением
// уже на этапе их описания. Однако это
// значение может быть только константой
// (не переменной!)

function Worker($fName,$lName,$age,$profession='engineer',$salary=500)
{
// PHP не вызывает конструктор родительского объекта автоматически,
// поэтому вам необходимо делать это самим
$this->Man($fName,$lName,$age);
$this->profession = $profession;
$this->salary = $salary;
};
};

// Создаем экземпляр объекта Worker
$worker = new Worker('Jack','Robertson',29,'programmer');

// Только что созданный экземпляр объекта Worker унаследовал все переменные и методы объекта Man
echo "Hello, I'm ".$worker->getName();

Переменные и методы можно не только добавлять, но и переопределять методы родительского объекта:

// Создадим новый вариант объекта Worker, переопределив метод getName()
class Worker extends Man
{
var $profession;
var $salary;
function getName()
{
return(parent::getName().", ".$this->profession);
};
};

//Создаем экземпляр объекта Worker и попытаемся получить его имя:
$worker = new Worker('Jack','Robertson',29,'programmer');
echo $worker->getName();

Результатом работы предыдущего примерв будет строка: "Jack Robertson, programmer". Вы заметили использование нового оператора :: ? Этот оператор позволяет вызывать из метода объекта метод одного из родительских объектов, даже если тот уже переопределен при более "поздних" наследованиях. Использование ключевого слова parent в этом выражении позволяет вызвать метод непосредственного предка этого объекта. Однако в более сложных случаях, когда степень наследования объектов выше - можно использовать непосредственно имя объекта, метод которого необходимо вызвать. В нашем случае можно было бы написать: Man::getName().







Все вопросы, пожелания и предложения ведущему рассылки, прошу слать на e-mail: urisff@inbox.ru

Все статьи публикуются здесь только с разрешения (или рекомендации) автора.

Если вы хотите опубликовать здесь свою статью, то сделайте это, переслав её мне (желательно в виде html, причём без картинок).

В случае, если вы будете использовать приведённые в этой рассылке материалы, не забудьте сделать ссылку на эту рассылку.

Ведущий рассылки:
Набатников Иван, urisff@inbox.ru
http://www.tireal.com


В избранное