Абстракция реализованная через ассоциативные массивы не обеспечивает безопасность типов (можно ошибочно вызывать функцию, предназначенную для одной абстракции, например, точки, на другой абстракции, например, сегменте )
Ключевое слово public делает свойства публичными, то есть доступными снаружи для чтения и модификации (по аналогии со структурами, ассоциативными массивами
instance – экземпляры класса
new Point() – создание экземпляра класса Point
$point->x = 5 – доступ к свойстве через “->“
gettype($circle); // object; gettype() – определение типа переменной
В этом файле больше не может быть никаких инструкций, не считая определения пространств имён (необязательно, но следует из стандартов кодирования PSR-12.)
Если пространство имен содержит только функции, то пространство имен заканчивается на файл <?php // file: src/solution.php namespaceApp\solution; function …
Для классов следующий синтаксис (файл должен называться в точности как класс и с учётом регистра) <?php // file: src/Point.php namespaceApp; classPoint { }
Использование класса
Первый вариант: <?php namespaceAnotherApp; useApp\Point; $point = new Point();
Второй вариант <?php namespaceAnotherApp; $point = new \App\Point();
В отличии от функций (autoload/files , composer.json , require__DIR__ . ‘/vendor/autoload.php’; ) “autoload”: { “files”: [ “src/Points.php”, “src/Segments.php” ] } для классов в PHP есть специальный механизм автозагрузки (пример) . “autoload”: { “psr-4”: {“App\\”: “src/”} } т.е в папке src относительно расположения файла composer.json находится пространство имён App
Доступно динамическое обращение к свойствам <?php $propertyName = ‘key’; $obj->$propertyName = ‘value’; $obj->$propertyName; // value $obj->key; // value
На практике стандартное сравнение может не подойти и приходится реализовывать свой метод объекта для сравнения
класс можно указывать в определении функции – function areUsersEqual(User $user1, User $user2) (при передачи в функцию значения типа отличного от объекта класса User – вылетит ошибка)
Пример конструктора classPoint { public $x; public $y; publicfunction__construct($x, $y) { $this->x = $x; $this->y = $y; } } Функцию __construct нельзя вызвать, она вызывается автоматически при создании объекта класса
Конструктор не должен ничего возвращать
“Внутренний” вызов конструктора – __construct($this, $x, $y), где $this – созданный объект класса
Основная задача конструктора — заполнить свойства объекта переданными параметрами
Константы должны хранить данные (неизменяемые), имеющие отношение ко всему типу в целом, а не к его объектам
Доступ к константе через “:”: DateTime::RSS
Внутри класса можно обратиться так: self::RSS
Предопределенные константы (не требуют префикса ” self “)
__CLASS__ — текущее имя класса
__METHOD__ — текущее имя метода
Константа ” class ” – вызывается только через имя класса ( возвращает полное имя класса относительно пространство имёна, в котором происходит её вызов )
с 7.1 константы имеют модификаторы (public, private)
Код, в котором произошла ошибка, выбрасывает исключение, а код, в котором ошибка обрабатывается – её ловит
Исключение: throw new \Exception("text exception")
Поймать исключение: try { // Функция, которая вызывает readFile. Возможно не напрямую, а через другие функции. // Для механизма исключений это не важно. openFile($filepath); } catch (\Exception $e) { // Этот блок выполняется только в одном случае, если в блоке try было выброшено исключение showErrorToUser($e); }
объекты класса \Exception содержат сообщение, переданное в конструктор, трассировка стека и другие полезные данные: protected string $message ; protected int $code ; protected string $file ; protected int $line ; final public getMessage ( void ) : string final public getPrevious ( void ) : Throwable final public getCode ( void ) : mixed final public getFile ( void ) : string final public getLine ( void ) : int final public getTrace ( void ) : array final public getTraceAsString ( void ) : string public __toString ( void ) : string
throw прерывает дальнейшее выполнение кода, до ближайшего в стеке вызовов блока catch