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().
|