Вызвать конструктор класса php

Вызвать конструктор класса php

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

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

Пример #1 Конструкторы при наследовании

class BaseClass function __construct () print «Конструктор класса BaseClass\n» ;
>
>

class SubClass extends BaseClass function __construct () parent :: __construct ();
print «Конструктор класса SubClass\n» ;
>
>

class OtherSubClass extends BaseClass // наследует конструктор BaseClass
>

// Конструктор класса BaseClass
$obj = new BaseClass ();

// Конструктор класса BaseClass
// Конструктор класса SubClass
$obj = new SubClass ();

// Конструктор класса BaseClass
$obj = new OtherSubClass ();
?>

В отличие от других методов, PHP не будет генерировать ошибку уровня E_STRICT , если __construct() переопределяется с другими параметрами, отличными от тех, которые были объявлены в родительском методе __construct().

Конструкторы — это обычные методы, которые вызываются при инстанциировании соответствующих объектов. Следовательно, они могут иметь произвольное количество аргументов, которые могут быть обязательными, могут быть типизированными и иметь значения по умолчанию. Аргументы конструктора указываются в круглых скобках после имени класса.

Пример #2 Использование аргументов в конструкторах

class Point protected int $x ;
protected int $y ;

public function __construct ( int $x , int $y = 0 ) $this -> x = $x ;
$this -> y = $y ;
>
>

// Передаём оба параметра.
$p1 = new Point ( 4 , 5 );
// Передаём только обязательные параметры. Для $y используется значеие по умолчанию 0.
$p2 = new Point ( 4 );
// Вызываем с именованными параметрами (начиная с PHP 8.0):
$p3 = new Point ( y : 5 , x : 4 );
?>

Читайте также:  Java string contains ignore case

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

Конструкторы в старом стиле

До PHP 8.0.0, классы в глобальном пространстве имен будут интерпретировать метод, названный так же, как класс, как конструктор старого стиля. Этот синтаксис считается устаревшим и будет вызывать ошибку уровня E_DEPRECATED , но всё равно эти методы будут вызываться в качестве конструктора. Если в классе присутствуют и __construct() и метод с именем класса, то в качестве конструктора будет вызван __construct().

Для классов, находящихся в собственном пространстве имён и для всех классов, начиная с PHP 8.0.0, метод названный по имени класса будет игнорироваться.

В новом коде всегда используйте __construct().

Определение свойств объекта в конструкторе

Начиная с PHP 8.0.0, параметры конструктора можно использовать для задания соответствующих свойств объекта. Это довольно распространённая практика, присваивать свойствам объекта параметры переданые в конструктор не производя никаких дополнительных преобразований. Определение свойств класса в конструкторе позволяет значительно сократить количество шаблонного кода для такого случая. Пример выше можно будет переписать следующим образом.

Пример #3 Использование определения свойств в конструкторе

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

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

Замечание:

Свойства объектов не могут быть типа callable в связи с неоднозначностью которую они представляют для движка PHP. Соответственно и свойства определяемые в конструкторе также не могут быть типа callable . Любые другие декларации типов допустимы.

Замечание:

Атрибуты, заданные для таких аргументов, будут применены как для них самих, так и для соответствующих свойств.

Статические методы создания объекта

PHP поддерживает только один конструктор для класса. Однако в некоторых случаях есть необходимость создавать объект разными путями в зависимости от разных входных даных. Рекомендуемый способ — использовать статические методы как обёртки над конструктором.

Читайте также:  Notepad выровнять код html

Пример #4 Использование статических методов для создания объектов

private ? int $id ;
private ? string $name ;

private function __construct (? int $id = null , ? string $name = null ) $this -> id = $id ;
$this -> name = $name ;
>

public static function fromBasicData ( int $id , string $name ): static $new = new static( $id , $name );
return $new ;
>

public static function fromJson ( string $json ): static $data = json_decode ( $json );
return new static( $data [ ‘id’ ], $data [ ‘name’ ]);
>

public static function fromXml ( string $xml ): static // Put your own logic here.
$data = convert_xml_to_array ( $xml );
$new = new static();
$new -> id = $data [ ‘id’ ];
$new -> name = $data [ ‘name’ ];
return $new ;
>
>

$p1 = Product :: fromBasicData ( 5 , ‘Widget’ );
$p2 = Product :: fromJson ( $some_json_string );
$p3 = Product :: fromXml ( $some_xml_string );

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

В примере выше три публичных статических метода демонстрируют различные способы создания экземпляра объекта.

  • fromBasicData() принимает явные параметры, создаёт экземпляр класса через конструктор и возвращает объект.
  • fromJson() принимает JSON строку, производит над ней некоторые преобразования, извлекает данные необходимые для создания объекта и, так же как и предыдущий метод, вызывает конструктор и возвращает созданный объект.
  • fromXml() принимает XML строку, извлекает нужные данные и, так как в конструкторе нет обязательных параметров, вызывает его без них. После этого, так как ему доступны скрытые свойства, он присваевает им значения напрямую. После чего возвращает готовый объект.
Читайте также:  Strftime function in php

Во всех трёх случаях, ключевое слово static транслируется в имя класса в котором этот код вызывается. В нашем случае Product .

Деструкторы

PHP 5 предоставляет концепцию деструктора, аналогичную с той, которая применяется в других ОО-языках, таких как C++. Деструктор будет вызван при освобождении всех ссылок на определенный объект или при завершении скрипта (порядок выполнения деструкторов не гарантируется).

Пример #5 Пример использования деструктора

class MyDestructableClass
function __construct () print «Конструктор\n» ;
>

function __destruct () print «Уничтожается » . __CLASS__ . «\n» ;
>
>

$obj = new MyDestructableClass ();

Как и в случае с конструкторами, деструкторы, объявленные в родительском классе, не будут вызываться автоматически. Для вызова деструктора родительского класса, требуется вызвать parent::__destruct() в теле деструктора дочернего класса. Подобно конструкторам, дочерний класс может унаследовать деструктор из родительского класса, если он не определен в нем.

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

Замечание:

Деструкторы, вызываемые при завершении скрипта, вызываются после отправки HTTP-заголовков. Рабочая директория во время фазы завершения скрипта может отличаться в некоторых SAPI (например, в Apache).

Замечание:

Попытка выбросить исключение из деструктора (вызываемого во время завершения скрипта) вызывает фатальную ошибку.

Источник

Оцените статью