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 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, причём без картинок).
В случае, если вы будете использовать приведённые в этой рассылке материалы, не забудьте сделать ссылку на эту рассылку.