Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Объекты в PHP

Статус
В этой теме нельзя размещать новые ответы.

KinG_95

Компетентный
Помимо функций 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
PHP:
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;
        };
};
// Создание экземпляра объекта
PHP:
$john = new Man('John','Smith',23);
// Здесь мы передаем параметры непосредственно // в конструктор объекта

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

После того, как переменной присвоен созданный экземпляр объекта - с этой переменной можно делать все , что можно делать с этим объектом:
PHP:
echo "Hello, my name is ".$john->getName();
echo "I'm ".$john->age." years old";
Кстати, я думаю, вы уже заметили, что имена переменных, являющихся переменными объектов, записываются без символа $ перед ними? Это происходит потому, что PHP рассматривает связку "(переменная-объект)->(переменная объекта)" как одну переменную. Зато это позволит вам очень элегантно делать например вот такие вещи:
PHP:
$methodName = 'getName';
echo "My name is ".$john->$methodName;
Отдуши, не правда ли? :)
Но объекты как таковые не были бы так интересны, если бы существовали сами по себе. Однако это не так и самым интересным, нужным и полезным свойством объектов является их наследование. Посмотрим, как это выглядит на примере уже описанного выше объекта Man:

// Описание объекта Worker, наследованного от объекта Man

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

        function Worker($fName,$lName,$age,$profession='engineer',$salary=500)
        {
// PHP не вызывает конструктор родительского объекта автоматически,
// поэтому вам необходимо делать это самим
PHP:
$this->Man($fName,$lName,$age);
                $this->profession = $profession;
                $this->salary = $salary;
        };
};
// Создаем экземпляр объекта Worker
PHP:
$worker = new Worker('Jack','Robertson',29,'programmer');
// Только что созданный экземпляр объекта Worker унаследовал все переменные и методы объекта Man
PHP:
echo "Hello, I'm ".$worker->getName();
Переменные и методы можно не только добавлять, но и переопределять методы родительского объекта:

// Создадим новый вариант объекта Worker, переопределив метод getName()
PHP:
class Worker extends Man
{
        var $profession;
        var $salary;            

        function getName()
        {
                return(parent::getName().", ".$this->profession);
        };
};

// Создаем экземпляр объекта Worker и попытаемся получить его имя:
PHP:
$worker = new Worker('Jack','Robertson',29,'programmer');
echo $worker->getName();
--------------------------------------------------
Результатом работы предыдущего примерв будет строка: "Jack Robertson, programmer". Вы заметили использование нового оператора :: ? Этот оператор позволяет вызывать из метода объекта метод одного из родительских объектов, даже если тот уже переопределен при более "поздних" наследованиях. Использование ключевого слова parent в этом выражении позволяет вызвать метод непосредственного предка этого объекта. Однако в более сложных случаях, когда степень наследования объектов выше - можно использовать непосредственно имя объекта, метод которого необходимо вызвать. В нашем случае можно было бы написать: Man::getName().
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу