Какая разница между $this и self в PHP?
$this используется для вызова не статических методово и свойств классов, а ключевое слово self используется для вызова статических членов класса.
Возможности ключегого свойства self не ограничиваются вызовом статических членов класса, в контексте нестатических свойств self также обеспечивает возможность обхода таблиц виртуальных методов для текущего объекта. Например, parent::methodName() вызывает метод родительского класса, а self::methodName() вызывает метод, который реализован в текщем классе.
Сколько типов данных в РНР?
PHP поддерживает восемь простых типов данных:
Четыре скалярных: bool, integer, float, string
Два смешанных типа: array, object
Два специальных типа: resource, NULL
Существет также несколько псевдотипов: mixed (mixed говорит о том, что параметр может принимать множество (но не обязательно все) типов), number (number говорит о том, что параметр может быть либо integer, либо float.) и callback (Некоторые функции, такие как call_user_func() или usort() принимают в качестве параметра определенные пользователем callback-функции. Callback-функции могут быть не только простыми функциями, но также методами объектов, включая статические методы классов.)
Что можешь сказать про типизацию данных в PHP? — и как реализовать статическую типизацию
Типизация данных в PHP не строгая, то есть тип переменной определяется интерпретатором автоматически.
Делаем PHP строго типизированным
Что такое static функция и чем она отличается от “обычной” (не static)?
Статические методы удобно использовать там, где для его работы не требуется создание экземпляра класса.
Со static:
$s = str::hash($s);
Без static:
$str = new str();
$s = $str->hash($s);
Статическое свойство — общее для всех экземпляров класса (точнее ни одному из них не принадлежит). Полезно, если вы создаете объекты в разных местах программы, но отовсюду вам нужен доступ к общей переменной. Частный случай — реализация синглетона, когда вам нужен один и тот же экземпляр в разных местах программы (статик-свойство — сам объект):
class db {
protected static $instance;
private function __construct() {}
private function __clone() {}
private function __wakeup() {}
public static function get() {
if (is_null(self::$instance)) self::$instance = new db;
return self::$instance;
}
public function query() {}
}
db::get()->query();
Что такое конструктор?
Это специальная функция вызываемая при создании объекта.
Поддерживает ли РНР множественное наследование?
Нет. Класс в PHP может иметь только одного родителя
Какие магические методы знаешь? Что это вообще такое?
В дословном переводе — Магические Методы (Magic Methods). Эти методы зарезирвированы в php и все начинаются с двойного подчеркивания (__), вообще свои методы не рекомендуется называть используя в начале __. Список всех волшебных методов:
__construct — конструктор класса, вызывается при создании объекта
__destruct — деструктор класса, вызывается при уничтожении объекта
__call — В контексте объекта при вызове недоступных методов вызывается этот метод
__callStatic — В статическом контексте при вызове недоступных методов вызывается этот метод
__get — будет выполнен при чтении данных из недоступных свойств.
__set — будет выполнен при записи данных в недоступные свойства.
__isset — будет выполнен при использовании isset() или empty() на недоступных свойствах.
__unset — будет выполнен при вызове unset() на недоступном свойстве.
__sleep — Функция serialize() проверяет, присутствует ли в вашем классе метод с «магическим» именем __sleep(). Если это так, то этот метод выполняется прежде любой операции сериализации. Он может очистить объект и предполагается, что будет возвращен массив с именами всех переменных объекта, который должен быть сериализован. Если метод ничего не возвращает кроме NULL, то это значит, что объект сериализован и выдается предупреждение E_NOTICE. Рекомендованное использование __sleep() состоит в завершении работы над данными, ждущими обработки или других подобных задач очистки. Кроме того, этот метод можно выполнять в тех случаях, когда нет необходимости сохранять полностью очень большие объекты.
__wakeup — функция unserialize() проверяет наличие метода с «магическим» именем __wakeup(). Если такой имеется, то он может воссоздать все ресурсы объекта, принадлежавшие ему. Обычно __wakeup() используется для восстановления любых соединений с базой данных, которые могли быть потеряны во время операции сериализации и выполнения других операций повторной инициализации.
__toString — позволяет классу решать самостоятельно, как он должен реагировать при преобразовании в строку. Например, что напечатает echo $obj;. Этот метод должен возвращать строку, иначе выдастся неисправимая ошибка E_RECOVERABLE_ERROR.
__set_state — Этот статический метод вызывается для тех классов, которые экспортируются функцией var_export() начиная с PHP 5.1.0. Параметр этого метода должен содержать массив, состоящий из экспортируемых свойств в виде array(‘property’ => value, …).
__clone — По завершении клонирования, если у класса был определен метод __clone(), то этот метод __clone() вызывается у свежесозданной копии объекта, для возможного изменения всех необходимых свойств.
__invoke — вызывается, когда скрипт пытается выполнить объект как функцию.
Что такое MVC?
Шпаргалка по MV-паттернам для проектирования веб-приложений
Реализация MVC паттерна на примере создания сайта-визитки на PHP
Создание простой MVC-системы на PHP 5
Что такое шаблоны (паттерны) проектирования?
Паттерны проектирования (шаблон, pattern) — это эффективные способы решения характерных задач проектирования, в частности проектирования компьютерных программ. Паттерн не является законченным образцом проекта, который может быть прямо преобразован в код, скорее это описание или образец для того, как решить задачу, таким образом, чтобы это можно было использовать в различных ситуациях.
Обзор паттернов проектирования
Расскажи основные принципы ООП.
Абстра́кция — в объектно-ориентированном программировании это придание объекту характеристик, которые отличают его от всех других объектов, четко определяя его концептуальные границы. Основная идея состоит в том, чтобы отделить способ использования составных объектов данных от деталей их реализации в виде более простых объектов, подобно тому, как функциональная абстракция разделяет способ использования функции и деталей её реализации в терминах более примитивных функций, таким образом, данные обрабатываются функцией высокого уровня с помощью вызова функций низкого уровня. Такой подход является основой объектно-ориентированного программирования. Это позволяет работать с объектами, не вдаваясь в особенности их реализации. В каждом конкретном случае применяется тот или иной подход: инкапсуляция, полиморфизм или наследование. Например, при необходимости обратиться к скрытым данным объекта, следует воспользоваться инкапсуляцией, создав, так называемую, функцию доступа или свойство. Абстракция данных — популярная и в общем неверно определяемая техника программирования. Фундаментальная идея состоит в разделении несущественных деталей реализации подпрограммы и характеристик существенных для корректного ее использования. Такое разделение может быть выражено через специальный «интерфейс», сосредотачивающий описание всех возможных применений программы. С точки зрения теории множеств, процесс представляет собой организацию для группы подмножеств своего множества. См. также Закон обратного отношения между содержанием и объемом понятия.
Инкапсуля́ция — свойство языка программирования, позволяющее пользователю не задумываться о сложности реализации используемого программного компонента (что у него внутри?), а взаимодействовать с ним посредством предоставляемого интерфейса (публичных методов и членов), а также объединить и защитить жизненно важные для компонента данные. При этом пользователю предоставляется только спецификация (интерфейс) объекта. Пользователь может взаимодействовать с объектом только через этот интерфейс. Реализуется с помощью ключевого слова: public. Пользователь не может использовать закрытые данные и методы. Реализуется с помощью ключевых слов: private, protected, internal. Инкапсуляция — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с абстракцией, полиморфизмом и наследованием). Сокрытие реализации целесообразно применять в следующих случаях: предельная локализация изменений при необходимости таких изменений, прогнозируемость изменений (какие изменения в коде надо сделать для заданного изменения функциональности) и прогнозируемость последствий изменений.
Насле́дование — один из четырёх[источник?] важнейших механизмов объектно-ориентированного программирования (наряду с инкапсуляцией, полиморфизмом и абстракцией), позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом. Другими словами, класс-наследник реализует спецификацию уже существующего класса (базовый класс). Это позволяет обращаться с объектами класса-наследника точно так же, как с объектами базового класса. Простое наследование Класс, от которого произошло наследование, называется базовым или родительским (англ. base class). Классы, которые произошли от базового, называются потомками, наследниками или производными классами (англ. derived class). В некоторых языках используются абстрактные классы. Абстрактный класс — это класс, содержащий хотя бы один абстрактный метод, он описан в программе, имеет поля, методы и не может использоваться для непосредственного создания объекта. То есть от абстрактного класса можно только наследовать. Объекты создаются только на основе производных классов, наследованных от абстрактного. Например, абстрактным классом может быть базовый класс «сотрудник вуза», от которого наследуются классы «аспирант», «профессор» и т. д. Так как производные классы имеют общие поля и функции (например, поле «год рождения»), то эти члены класса могут быть описаны в базовом классе. В программе создаются объекты на основе классов «аспирант», «профессор», но нет смысла создавать объект на основе класса «сотрудник вуза».
Полиморфи́зм — возможность объектов с одинаковой спецификацией иметь различную реализацию. Язык программирования поддерживает полиморфизм, если классы с одинаковой спецификацией могут иметь различную реализацию — например, реализация класса может быть изменена в процессе наследования[1]. Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций». Полиморфизм — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с абстракцией, инкапсуляцией и наследованием). Полиморфизм позволяет писать более абстрактные программы и повысить коэффициент повторного использования кода. Общие свойства объектов объединяются в систему, которую могут называть по-разному — интерфейс, класс. Общность имеет внешнее и внутреннее выражение: внешняя общность проявляется как одинаковый набор методов с одинаковыми именами и сигнатурами (именем методов и типами аргументов и их количеством); внутренняя общность — одинаковая функциональность методов. Её можно описать интуитивно или выразить в виде строгих законов, правил, которым должны подчиняться методы. Возможность приписывать разную функциональность одному методу (функции, операции) называется перегрузкой метода (перегрузкой функций, перегрузкой операций).
Чем отличается класс от объекта?
Класс определяет структуру и поведение. Объект определяет состояние (наполнение структуры) и меняет его в зависимости от поведения, заданным классом.
Может быть вам легче будет понять, если вы будете думать о классе как о наборе функций, а об объекте как о наборе данных.
Некоторые функции в классе могут быть использованы только с набором данных (т.е. объектом), который передается неявно, когда вы указываете $object->method().
Другие функции не требуют объекта, поэтому могут быть вызваны напрямую из класса.
С этой точки зрения очень логично выглядит Python, где у любого метода есть явный аргумент self, указывающий на объект, из которого был вызван метод. А запись object.method(5) является краткой записью ObjectClass.method(object, 5).
Класс — это бог, который есть всегда. И бог по образу и подобию своему создаёт экземпляры — человеков. Каждый человек наделён своим набором свойств (рост, вес, …) и методов (плавать, ходить, летать). А бог в свою очередь наделён общими для всех методами: принимать мольбы, карать, посылать манну небесную и сотворить чудо. Эти методы могут быть приватными. Т.е. бог например может принимать мольбы только людей, а не марсиан. А вот сотворить чудо может как для людей, так и для марсиан — ему не жалко.
Что такое абстрактный класс? Можно ли создать экземпляр абстрактного класса?
Абстрактный класс в php и абстрактный класс в любом другом языке программирования, являет собой базовый класс, не предназначенный для создания его экземпляров. Основной смысл и назначение абстрактных классов заключается в расширении возможностей его дочерних классов. Чтобы сделать класс абстрактным, нужно перед объявлением класса поставить идентификатор: abstract. дентификатор abstract, перед объявлением функции говорит о том, что данная функция должна быть обязательно определена в классе потомке.
Какая разница между абстрактным классом и интерфейсом?
Представьте себе пальчиковую батарейку. Вы ее держите в руках и точно знаете, что это пальчиковая батарейка. Если вас попросить описать те критерии, которые позволяют вам утверждать, что это батарейка (к примеру, размером с палец, если засунуть в фонарик — он засветится, вольтметр покажет 1.5 вольта, с одной стороны пимпочка ас другой плоско), то этот список и будет описанием интерфейса «пальчиковая батарейка».
Интерфейс ничего не говорит про, то как батарейка работает и позволяет манипулировать ею просто не задумываясь как она это делает. Фонарику все равно как она устроена, ему главное получить обещанные 1,5 вольта с полюса с пимпочкой и плоского полюса. Обещание — это и есть интерфейс — договор между двумя объектами. И еще, вы просто не узнаете по внешнему виду что у вас в руках — батарейка 777, алкалайн, дюраселл, NiMH аккумулятор или портативный атомный реактор. Придется заглянуть под интерфейс и посмотреть внутреннюю реализацию.
Абстрактный класс это недонаследник — наследник, который программисту предстоит еще доделать. Это уже почти сформированный класс, который вот-вот и можно будет инстансировать объекты. Он используется, если разработчик хочет направить другого разработчика в нужное русло, обеспечить его тем поведением, которое ему пригодится при завершении класса. Это как придумать Фрукт, ожидая, что в будущем кто-то додумает Яблоко, Лимон, Грушу…
Из этого всего можно сделать самый короткий вывод 5 уровня:
- интерфейс говорит о поведении класса и заставляет отвечать его на вопрос «что я делаю?», а абстрактный класс определяет класс-наследник и заставляет его отвечать на вопрос «кто я?».
Абстрактный(Abstract) класс — класс, который имеет хотя б 1 абстрактный (не определенный) метод; обозначается как abstract.
Интерфейс — такой же абстрактный класс,только в нем не может быть свойств и не определены тела у методов.
Так же стоит заметить, что абстрактный класс наследуется(etxends), а интерфейс реализуется (implements). Вот и возникает разница между ними, что наследовать мы можем только 1 класс, а реализовать сколько угодно.
ВАЖНО! При реализации интерфейса, необходимо реализовать все его методы, иначе будет Fatal error, так же это можно избежать, присвоив слово abstract.
Пример:
interface I {
public function F();
public function say();
}
abstract class A implements I {
function say() {
echo 'Hello';
}
// function F() - не реализована
}