Php введение в ооп

Содержание

  • ReflectionClass::__construct — Создаёт объект класса ReflectionClass
  • ReflectionClass::export — Экспортирует класс
  • ReflectionClass::getConstant — Возвращает определенную константу
  • ReflectionClass::getConstants — Возвращает константы
  • ReflectionClass::getConstructor — Возвращает конструктор класса
  • ReflectionClass::getDefaultProperties — Возвращает свойства по умолчанию
  • ReflectionClass::getDocComment — Возвращает doc-блоки комментариев
  • ReflectionClass::getEndLine — Возвращает номер последней строки
  • ReflectionClass::getExtension — Возвращает объект класса ReflectionExtension для расширения, определяющего класс
  • ReflectionClass::getExtensionName — Возвращает имя расширения, определяющее класс
  • ReflectionClass::getFileName — Возвращает имя файла, в котором определен класс
  • ReflectionClass::getInterfaceNames — Возвращает имена интерфейсов
  • ReflectionClass::getInterfaces — Возвращает интерфейсы
  • ReflectionClass::getMethod — Возвращает экземпляр ReflectionMethod для метода класса
  • ReflectionClass::getMethods — Возвращает список методов в виде массива
  • ReflectionClass::getModifiers — Возвращает информацию о модификаторах класса
  • ReflectionClass::getName — Возвращает имя класса
  • ReflectionClass::getNamespaceName — Возвращает название пространства имён
  • ReflectionClass::getParentClass — Возвращает родительский класс
  • ReflectionClass::getProperties — Возвращает свойства
  • ReflectionClass::getProperty — Возвращает экземпляр ReflectionProperty для свойства класса
  • ReflectionClass::getReflectionConstant — Получает ReflectionClassConstant для константы класса
  • ReflectionClass::getReflectionConstants — Получает константы класса
  • ReflectionClass::getShortName — Возвращает короткое имя
  • ReflectionClass::getStartLine — Возвращает номер начальной строки
  • ReflectionClass::getStaticProperties — Возвращает статические свойства
  • ReflectionClass::getStaticPropertyValue — Возвращает значение статического свойства
  • ReflectionClass::getTraitAliases — Возвращает массив псевдонимов трейтов
  • ReflectionClass::getTraitNames — Возвращает массив имён трейтов, используемых в этом классе
  • ReflectionClass::getTraits — Возвращает массив трейтов, используемых в этом классе
  • ReflectionClass::hasConstant — Проверяет, определена ли константа
  • ReflectionClass::hasMethod — Проверяет, задан ли метод
  • ReflectionClass::hasProperty — Проверяет, определено ли свойство
  • ReflectionClass::implementsInterface — Проверяет, реализуется ли интерфейс
  • ReflectionClass::inNamespace — Проверяет, определён ли класс в пространстве имён
  • ReflectionClass::isAbstract — Проверяет, является ли класс абстрактным
  • ReflectionClass::isAnonymous — Проверяет, является класс анонимным
  • ReflectionClass::isCloneable — Проверяет, можно ли клонировать этот класс
  • ReflectionClass::isFinal — Проверяет, является ли класс окончательным (final)
  • ReflectionClass::isInstance — Проверяет, принадлежит ли объект классу
  • ReflectionClass::isInstantiable — Проверяет, можно ли создать экземпляр класса
  • ReflectionClass::isInterface — Проверяет, является ли класс интерфейсом
  • ReflectionClass::isInternal — Проверяет, является ли класс встроенным в расширение или в ядро
  • ReflectionClass::isIterable — Проверить, является ли класс итерируемым
  • ReflectionClass::isIterateable — Псевдоним ReflectionClass::isIterable
  • ReflectionClass::isSubclassOf — Проверяет, является ли класс подклассом
  • ReflectionClass::isTrait — Проверяет, является ли это трейтом
  • ReflectionClass::isUserDefined — Проверяет, является ли класс пользовательским
  • ReflectionClass::newInstance — Создаёт экземпляр класса с переданными аргументами
  • ReflectionClass::newInstanceArgs — Создаёт экземпляр класса с переданными параметрами
  • ReflectionClass::newInstanceWithoutConstructor — Создаёт новый экземпляр класса без вызова конструктора
  • ReflectionClass::setStaticPropertyValue — Устанавливает значение статического свойства
  • ReflectionClass::__toString — Возвращает строковое представление объекта класса ReflectionClass

Автоматическая загрузка классов


Как правило, полезно хранить каждый PHP класс в отдельном файле. Например, в приложении веб-форума, вы бы хранили класс Member в файле Member.php, а класс Topic — в файле Topic.php. Скорее всего, вы будете хранить все эти файлы в папке classes где-то на сайте:

classes/
  Member.php
  Topic.php

Затем, если понадобится создать объект класса, например, Member, PHP сначала придется подключить файл с этим классом:

<?php
require_once( "classes/Member.php" );
$member = new Member();
?>

Хранение классов таким образом — вещь полезная не только для вашей психики, но и для использования такого удобного свойства, как автоматическая загрузка (autoloading).

Автоматическая загрузка работает так. Где-то в начале приложения PHP вы создаете специальную функцию __autoload(). В последствии, если где-то в коде будет попытка создать объект класса, о котором ничего не известно, PHP автоматически вызовет данную функцию, передав ей в качестве параметра имя искомого класса. Вся работа функции заключается в том, чтобы найти нужный файл и подгрузить его к скрипту, тем самым загрузить сам класс. После этого PHP уже сможет создать объект данного класса.

Давайте приведем пример. Напишем функцию __autoload() для автоматической загрузки классов из папки classes:

<?php
 
function __autoload( $className ) {
  $className = str_replace( "..", "", $className );
  require_once( "classes/$className.php" );
  echo "Loaded classes/$className.php<br>";
}
 
$member = new Member();
echo "Created object: ";
print_r( $member );
 
?>

Вот, как это работает. Сперва, создаем функцию __autoload() с входным параметром $className. В начале, функция убирает все подстроки “..” из полученного параметра, это делается в целях безопасности. Затем, с помощью функции require_once(), она подгружает нужный файл. Функции известно, что он находится в папке classes, и его расширение — .php. Функция также выводит на страницу сообщение, так что мы сразу увидим, что она отработала.

Затем протестим нашу функцию, создав объект класса Member. Так как мы предварительно не подгрузили файл с данным классом, PHP запустит функцию __autoload(), передав ей имя класса — “Member”. Она, в свою очередь, будет искать файл classes/Member.php. Затем PHP создает-таки объект Member. В завершении, отображаем сообщение о том, что объект создан.

Чтобы протестировать работу данного скрипта, создадим папку classes в том же каталоге, что и скрипт. Создадим в ней файл Member.php с простеньким классом:

<?php
  
class Member {
}
 
?>

Теперь, когда мы запустим скрипт, загрузится файл classes/Member.php, создастся объект класса Member, и на экране отобразится следующее:

Loaded classes/Member.php
Created object: Member Object ( )

Автоматическая загрузка поможет вам сэкономить уйму времени, тем более, если у вас огромное количество классов. Вместо того, чтобы вызывать функцию require_once() в начале каждого файла, вы просто создаете в начале всего приложения функцию __autoload(), и отдаете управление загрузкой классов в руки PHP!

Introduction

PHP doesn’t have a convenient literal syntax for creating an object and initializing properties. This makes creating objects and initializing their state quite laborious. Every time you have to:

  1. Instantiate an object.
  2. Assign each needed accessible properties with the value.
  3. Pass created a fully initialized object.

In current PHP implementation with Typed Properties, it is possible to instantiate class which doesn’t require nullability for all properties and when they’re not initialized we finish with properties in an uninitialized state.

That’s where object initializer optimization can benefit with single expression statement and it can be used to initialize any kind of object (including anonymous classes) ensuring all required properties are properly initialized, otherwise a is thrown.

The initializer block can use any properties and variables available in the containing scope, but one has to be wary of the fact that initializers are run after constructors.

Классы


Класс — это шаблон, по которому создаются объекты.

Напомню, что классы — это описания объектов. Мы не можем создать объект «на лету», как это происходит с массивами. Объект может быть создан только на основе своего описания — класса. Этим, кстати, реализация объектов в PHP отличается от JavaScript. В JS объектам не нужны никакие классы, и они могут быть созданы и модифицированы когда угодно и как угодно.

Класс как чертёж

Зачем же нужны классы, и почему объекты не могут существовать без них?

Здесь аналогия очень простая: класс – это чертёж, максимально подробное описание того, как должно выглядеть изделие. Сам по себе класс не является чем-то физическим и осязаемым, то есть мы не можем использовать его в коде непосредственно. Вместо этого класс является схемой, структурой, на основе которой будет создан объект.

Жизненный цикл объекта

Любая работа с объектами в PHP состоит из следующих этапов. Начинается всё с создания класса. В классе мы фиксируем из каких свойств и методов будет состоять каждый его экземпляр. Также в классе можно задать начальные значения для каждого свойства. Имея класс, возможно создать его экземпляр — объект.

Классы в PHP принято сохранять в отдельных файлах, поэтому вначале вы подключаете этот сценарий там, где он необходим. Затем вызываете процедуру создания нового объекта на основе этого класса.

Чтобы использовать объект в дальнейшем, его следует, как всегда, назначить переменной. Затем вы будете работать с объектом через переменную: вызывать методы и обращаться к свойствам.

Описание класса:

Создание объекта на основе класса:

Разбор примера

Разберёмся с тем, что здесь происходит. Начнём с целей создания данного класса. Его задача — хранить в объекте данные о погоде за конкретный день, а также предоставлять сводку за этот день в текстовом виде.

В классе определено четыре скрытых свойства. Это значит, что к ним не будет доступа за пределами объекта. Читать и записывать эти свойства могут только внутренние методы объекта. Сами свойства хранят температурные параметры (температуру, осадки), дату и дополнительный комментарий к записи. Некоторым свойствам задано значение по умолчанию.

Далее идёт перечисление методов. И начинается всё с метода, у которого особое имя и значение — .

Что такое конструктор объекта


Методы объекта вызываются из внешнего кода, при явном обращении к ним с указанием имени. Но если назвать один метод то он будет вызываться автоматически в момент создания объекта на основе класса.

Конструкторы объектов используются для инициализации каких-либо значений и выполнении других подготовительных операций. В нашем примере конструктор устанавливает содержимое скрытых свойств.

Обращение к свойствам и методам объекта

Посмотрим, как внутри метода происходит обращение к его свойствам. Во-первых, для этого используется специальная переменная this, которая всегда присутствует внутри объекта и ссылается на него самого.

Во-вторых, для обращения к методам и свойствам объекта нужен специальный синтаксис: «стрелочка». Такая стрелочка отделяет имя свойства или метода от имени объекта. Это аналог квадратных скобок при работе с массивами.

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

Создание объекта на основе класса

Написав класс, мы выполнили большую часть работы. Теперь нам предстоит создать новый объект на основе этого класса и показать, как с ним работать. Новый объект создается с помощью ключевого слова new, после которого идёт имя его класса. В круглых скобках надо передать все аргументы в метод , если он был написан. Класс не обязан содержать этот метод, и если его нет, то круглые скобки не обязательны.

В коде мы передаём в конструктор почти все параметры погодных наблюдений. Затем для созданного объекта вызываются его методы: первый устанавливает значения осадков, а второй возвращает текстовое описание погоды.

Setting and Getting Property Values

The following examples assume $company is the root of a tree of data objects created from the schema and instance document shown above.

Example #1 Access via property name

Data object properties can be accessed using the object property access syntax. The following sets the company name to ‘Acme’.

Example #2 Access via property name as array index

We can also access properties using associative array syntax. The simplest form of this uses the property name as the array index. For example, the following sets the company name and gets the employeeOfTheMonth.

Example #3 Data Object iteration

We can iterate over the properties of a data object using foreach. The following iterates over the properties of the employee of the month.

which will output:

name: Jane Doe
SN: E0003

The ‘manager’ property is not output, because it has not been set.

Example #4 Access many-valued property by name

Many-valued data object properties can also be accessed using the object property name syntax. The following gets the list of departments.

Example #5 Many-valued element access

We can access individual elements of many-valued properties using array syntax. The following accesses the first department in the company.

Example #6 Many-valued property iteration

Many-valued properties can also be iterated over using foreach. The following iterates over the company’s departments.

Each iteration will assign the next department in the list to the variable $department.


Example #7 Chained property access

We can chain property references on a single line. The following sets and gets the name of the first department.

Using the associative array syntax, this is equivalent to

In either case, the dept_name variable is set to ‘Emerging Technologies’.

Example #8 XPath navigation

The associative array index can be an XPath-like expression. Valid expressions are defined by an augmented sub-set of XPath.

Two forms of indexing into many-valued properties are supported. The first is the standard XPath array syntax with the indexing starting at one, the second is an SDO extension to XPath with an index starting at zero. The standard syntax is:

and the SDO XPath extension syntax is:

Both these examples get the second employee from the first department.

Example #9 XPath querying

We can use XPath to query and identify parts of a data object based on instance data. The following retrieves the manager from the ‘Advanced Technologies’ department.

Example #10 Creating child data objects

A data object can be a factory for its child data objects. A child data object is automatically part of the data graph. The following add a new employee to the ‘Advanced Technologies’ department.

Example #11 Unset a primitive property

We can use the isset() and unset() functions to test and remove items from the data object.

The following clears the name of the first department.

Example #12 Unset a data object

unset can also be used to remove a data object from the tree. The following example shows John Jones leaving the company.

Example #13 Unset a referenced data object

The following removes the ’employeeOfTheMonth’ from the company. If this were a containment relationship then the employee would be removed from the company (probably not a good idea to sack your best employee each month!), but since this is a non-containment reference, the employee being referenced will remain in the department in the company, but will no longer be accessible via the employeeOfTheMonth property.

Example #14 Access via property index

Data object properties can be accessed via their property index using array syntax. The property index is the position at which the property’s definition appears in the model (in this case the xml schema). We can see from the schema listing above that the company name attribute is the second company property (the SDO interface makes no distinction between XML attributes and elements). The following sets the company name to ‘Acme’, with the same result as

Using the index directly in this way is likely to be fragile. Normally the property name syntax should be preferred, but the property index may be required in special cases.


С этим читают