PHP const vs static

Часто стал замечать во время ревью, что некоторые (да я и сам давно) путают static и const, считая что, то и то — константы. Увы это не так.

static — Это статическое свойство класса, которое может быть вызвано без создания экземпляра(объекта) класса. То есть обратиться мы к нему сможем через:

<?php

class Foo {
    static $var = 10;
}

echo Foo::$var;

Так же данное свойство можно будет переопределить. По умолчанию static is public

const — Это константа класса, которая может быть вызвана только через класс. Не может быть переопределена. Так же по умолчанию public

Laravel zip content validator

Laravel Zip Content Validator by Orkhan Ahmadov is a custom validation rule for checking the contents of an uploaded ZIP file:

use Orkhanahmadov\ZipValidator\Rules\ZipContent;

public function rules()
{
    return [
        'file' => [
            'required',
            'file',
            'mimes:zip',
            new ZipContent('thumb.jpg', 'assets/logo.png')
        ],
    ];
}

In addition to checking the existence of file paths, you can also validate the maximum size of a file. The unit of the value is bytes: 100000 equals 100KB:

new ZipContent(['thumb.jpg' => 100000, 'logo.png']);

You can also use an “or” style of validation. Here’s an example of “or” validation in tandem with maximum size:

new ZipContent(['thumb.jpg|thumb.png' => 100000]);

Finally, you can reject empty files with false as a second argument:

new ZipContent(['thumb.jpg', 'style.css'], false);

https://github.com/orkhanahmadov/laravel-zip-validator

ООП. Три основные парадигмы .

Основные принципы в ООП и наверное единственные это:

  • Полиморфизм
  • Инкапсуляция
  • Наследование

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

Полиморфизм

Если говорить кратко, полиморфизм — это способность объекта использовать методы производного класса, который не существует на момент создания базового.

Плохой пример 🙂

<?php
abstract class Aggregator {
    protected $name;
    public function __constructor(string $name) {
        $this->name = $name;
    }
    
    abstract public function doSomeThing();
}

class YandexAggregator extends Aggregator {
    public function __constructor(string $name) {
        $this->name = 'Yandex' . $name;
        parent::__constructor($name);
    }
}
Инкапсуляция

Это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя.

Т.е. Это сокрытие кода от пользователя.

Наследование

Думаю здесь все понятно из названия 🙂

Laravel Response Builder

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

Внимание! Проверьте требования перед выбором версии:

https://github.com/MarcinOrlowski/laravel-api-response-builder/blob/master/docs/docs.md

О типизации в php 7.4

Теперь можно будет так:

<?php
class User {
    public int $id;
    public string $name;

    public function __construct(int $id, string $name) {
        $this->id = $id;
        $this->name = $name;
    }
}
<?php
class User {
    /** @var int $id */
    private $id;
    /** @var string $name */
    private $name;

    public function __construct(int $id, string $name) {
        $this->id = $id;
        $this->name = $name;
    }

    public function getId(): int {
        return $this->id;
    }
    public function setId(int $id): void {
        $this->id = $id;
    }

    public function getName(): string {
        return $this->name;
    }
    public function setName(string $name): void {
        $this->name = $name;
    }
}

В пример все типы:

<?php
class Example {
    // All types with the exception of "void" and "callable" are supported
    public int $scalarType;
    protected ClassName $classType;
    private ?ClassName $nullableClassType;

    // Types are also legal on static properties
    public static iterable $staticProp;

    // Types can also be used with the "var" notation
    var bool $flag;

    // Typed properties may have default values (more below)
    public string $str = "foo";
    public ?string $nullableStr = null;

    // The type applies to all properties in one declaration
    public float $x, $y;
    // equivalent to:
    public float $x;
    public float $y;
}

Источник: https://wiki.php.net/rfc/typed_properties_v2

PHP Russia 2019 ElisDN

Про UseCase, фреймворки и в целом ООП.

ООП следует использовать по максимуму. К примеру объекты не использовать как ActiveRecord для связки с таблицой в БД, а полноценно с входящими в конструктор объектами Content, Price, etc.

new Lot($id, $var1, $var2, $title, $content, $blitzPrice, $startPrice)  // half solid
new Lot($id, $var1, $var2, new Content($title, $content), new Price($startPrice, $blitzPrice)) // full solid