Вы находитесь на странице: 1из 6

Ответы на вопросы от Кондратюк Татьяны

1. Когда происходит запуск конструктора? Назначение конструктора.

Конструктор — функция, предназначенная для инициализации объектов класса.


Конструктор схож с методом, но отличается от метода тем, что не имеет явным
образом определённого типа возвращаемых данных, не наследуется, и обычно
имеет различные правила для рассматриваемых модификаторов.

Внутренние поля объекта напрямую недоступны, и пользователь может


работать с объектом только как с единым целым, через открытые (public)
методы. Каждый метод, в идеале, должен быть устроен так, чтобы объект,
находящийся в «допустимом» состоянии, после вызова метода также оказался в
допустимом состоянии. И первая задача конструктора — перевести поля
объекта в такое состояние.

Вторая задача — упростить пользование объектом. Объект — не «вещь в себе»,


ему часто приходится требовать какую-то информацию от других объектов:
например, объектFile, создаваясь, должен получить имя файла.

2. Понятие класса.

Класс – это шаблон кода, который будет использоваться для создания объектов
на основе этого класса.

Класс – это формальное описание некоторого объекта, у которого есть свойства


и методы.

Пример:

Класс – автомобиль.

Объекты – автомобили.

Свойства: материал изготовления, цена, детали и т.д.

Методы: ездить, использовать бензин и т. д.

Каждый класс должен быть в отдельном файле. Кроме описания класса в


данном файле ничего быть не должно.

Название файла принято задавать с большой буквы. Желательно, чтобы


название класса совпадало с именем файла класса.
Модификатор доступа public. Данный модификатор означает, что свойство,
метод или конструктор будут доступны для всех объектов, которые их
используют.

Модификатор доступа protected означает, что данный элемент объекта может


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

Модификатор доступа private означает, что данный элемент объекта может быть
использован только в самом объекте и нигде больше.

3. Зачем нужны статические свойства и методы?

Статические методы - это функции, используемые в контексте класса. Они сами


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

Если после модификатора мы добавим слово static перед свойством или


методом, то мы говорим, что это свойство или метод становятся статическими.
Зачем нужны такие объекты? Бывают ситуации, когда мы не планируем
создавать объект на основе класса или нам нужно именно в классе работать со
свойствами и методами класса. В этом случае используются статические
свойства и методы.

В статических методах не доступна переменная $this, так как на основе класса


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

Поскольку доступ к статическому элементу осуществляется через класс, а не


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

Пример.

print StaticExample::$aNum;

StaticExample::sayHello();

4. Какой класс называется абстрактным? Зачем нужны абстрактные классы.

Абстрактный класс - это класс , который содержит или наследует без


переопределения хотя бы одну чистую виртуальную функцию. Абстрактный
класс определяет интерфейс для переопределения производными классами.

Абстрактный класс нужен, когда нужно семейство классов, у которых есть


много общего.
Пример.

Представьте, что у вас есть магазин (абстрактный класс), а в нем разные типы
товаров (обычные классы): велосипеды и машины. Так вот, у каждого типа

товара есть что-то общее, например, их можно продать (абстрактный метод). К


примеру, велосипеды вы можете продать по формуле с одной скидкой, а
автомобили по другой. Таким образом, классы велосипед и автомобиль будут
использовать один и тот же метод (продать), но функционал будет разный у
каждого. А "объединит" это все как раз абстрактный класс.

Перед классом находится служебное слово abstract. Это обозначение того, что
класс абстрактный, то есть на основе этого класса нельзя создавать экземпляры
класса (объекты). Класс используется при создании других классов, например,
классов-наследников.

5. Зачем нужны интерфейсы?

Интерфейс – это описание public методов, которые представляют собой только


название метода, описание их аргументов и возвращаемый тип. Тело метода в
интерфейсе не описывается.

Интерфейсы стоит создавать когда есть общая задача и несколько вариантов ее


решения, применяемых в зависимости от ситуации. Например задача
сохранения данных, а в качестве решения сохранение данных: в базу данных; в
файл; в сессию и др. В данном случае есть смысл создать один общий
интерфейс с обязательными методами вроде insert() - непосредственное
сохранение данных. В зависимости от места хранения данных, каждый класс
будет по своему реализовывать сохранение данных, но называться данный
метод всегда будет insert(), если мы пропишем его в интерфейсе.

6. Что такое трейты?

Трейт - это механизм обеспечения повторного использования кода в языках с


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

Трейт очень похож на класс , но предназначен для группирования функционала


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

7. Что позволяет сделать автозагрузка?

Автозагрузка отлично экономит время. Это позволяет писать скрипты не


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

Пример.

<?php require_once 'PEAR.php';

require_once 'PEAR/DependencyDB.php';

class PEAR_Registry extends PEAR { //... }

Позже появилась функция spl_autoload_register(), позволившая убрать вызовы


require/require_once. Замечательным было то, что теперь появилась возможность
использовать классы без необходимости знания где они расположены.

Пример.

<?php class postActions extends sfActions {

public function executeList() {

$this->posts = PostPeer::doSelect(new Criteria()); } }

8. Для чего используют пространства имен?

Несмотря на существующий инструмент автозагрузки, с загрузкой файлов


иногда возникают проблемы. Происходит это чаще всего тогда, когда их имена
совпадают. Очень часто моделям и контроллерам, разным файлам проекта со
структурой построения соответствующей модели MVC дают одинаковые имена.
Чтобы не было сложностей с загрузкой файлов с одинаковыми именами из
разных папок, используют пространства имен.

Класс можно поместить в отдельное именованное пространство и в дальнейшем


использовать его по этому имени. Для того чтобы указать это пространство для
конкретного класса используется слово namespace, за которым следует само
имя. Указывается оно в файле с классом, перед определением класса. Для того,
чтобы указать, что мы используем определенное пространство имен,
используется служебное слово use.

9. Назначение Model, VIew и Controller в модели MVC.

Обозначение Назначение
Model предоставляет данные и реагирует на команды контроллера, изменяя своё
состояние.

View отвечает за отображение данных модели пользователю, реагируя на


изменения модели.

Controller интерпретирует действия пользователя, оповещая модель о


необходимости изменений.

10. Объяснить суть механизма наследования. Рассказать, как создаются классы-


наследники в PHP.

С помощью наследования мы можем создавать классы, которые будут


содержать в себе все свойства и методы родительского класса. То есть,
дочерние классы наследуют свойства и методы класса родителя.

Дочерний класс является расширением родительского класса, так как кроме


унаследованных свойств и методов он содержит собственные.

Наследование устанавливается использованием слова extends при создании


класса.

Пример.

<?php

//Объявили родительский класс

class first_name{

//Объявили, но неинициализировали свойство класса

public $my_first_name;

//Метод устанавливает имя

function set_first_name($text){

$this->my_first_name=$text;

//Создаем новый объект

$person=new first_name();
//Установили значение имени

$person->set_first_name('Владимир');

//Вызовет ошибку, т.к. метод не существует!!!

//$person->set_last_name('Путин');

//Создаем класс-потомок

class full_name extends first_name{

//Добавили новое свойство

public $my_last_name;

//Добавили новый метод, который

function set_last_name($text){

//устанавливает фамилию

$this->my_last_name=$text;

Классы-потомки наследуют все доступные свойства и методы своего


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

Когда в классе-потомке переопределяются методы родительского класса, число


и типы их аргументов должны оставаться прежними, иначе будет вызвана
ошибка. Это не относится к методам-конструкторам, которые могут быть
переопределены с другими параметрами.

Наследование нескольких классов в PHP недопустимо, поэтому у каждого


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