Классы и объекты

class Transaction { //имя класса = имя файла. один файл на один класс
  public float $amount;     // свойства класса
  public string $description; // можно определить тип данных
  
  public $public; // доступно везде
  private $private; // доступно только внутри класса 
  protected $protected; // доступно только внутри класса а так же наследникам класса

  //магический метод, запускается каждый раз при создании экземпляра
  public function __construct()(float $amount, string $description){ 
    $this->amount = $amount;
    $this->description = $description;
    // $this - относится к вызываемому объекту
  }
  
  public function addTax(float $rate){ // метод класса
    $this->amount += $this->amount * $rate / 100;
  }
  
  public function addTax(float $rate): Transaction { // метод с возвратом значения
                                                    // на случай если нам нужна цепочка методов
    $this->amount += $this->amount * $rate / 100;
    return $this
  }
  
  public function getPrivate(): float { // для получения значений приватных свойств
    return $this->private;
  }
  
  public function __destruct(){
    echo "Ну вот и все...";
    // деструктор можно использовать для закрытия связи с ресурсами (бд к примеру)
    // в случаях когда данные уже получены и других взаимодействий не требуется
    // срабатывает автоматически когда ссылок на объект уже не осталось (ниже по коду)
    // ну или принудительно $transaction = null;  или exit; где угодно
  }
}

//если нет автозагрузки классов то
require_once 'path/to/transaction.php';

//в нужном месте кода создаем экземпляр класса
$transaction = new Transaction(15,'transaction');

$transaction->amount; // получить значение свойства класса
$transaction->amount = 20;// изменить значение свойства класса

$transaction = new Transaction(15,'transaction');

$transaction->addTax(8);


// создать экземпляр из переменной
$class= 'someClass';
$variable = new $class(); 

object

//stdClass - Пустой класс общего назначения с динамическими свойствами.
$str = '{"a":1,"b":2,"c":3}';
$arr = json_decode($str,true); // станет ассоциативным массивом
echo $arr['a']; // 1

$arr = json_decode($str); // экземпляр класса. ключи -> свойства
echo $arr->a; // 1

//создание пустого экземпляра
$obj = new stdClass(); // еще короче  = (object) null;
$obj->a = 1;  //свойство будет создано

//одномерные массивы -> object
$arr = [1,2,3];
$obj = (object)$arr;
echo $obj->{1}; // 2 тут индексы -> свойства

//скалярный тип
$obj = (object) 1;
echo $obj->scalar; // 1
// для чисел, чисел с плавающей точкой, строк, логических значений

Определение свойств в __construct

class Class{
  __construct(
  public string $public;
  private int $private;
  ){
    echo $this->public;
  }
}

Nullsafe Operator

class Customer{
  public ?PaymentProfile $paymentProfile = null;
}

class PaymentProfile {
  public int $id;
  
  public function __construct(){
    $this->id = rand();
  }
} 

class Transaction{
  public ?Customer $customer = null; // может быть не обязательным
  __construct(
  public float $amount;
  private string $description;
  ){
    
  }
}

$transaction = new Transaction(5,'text');

echo $transaction->customer->paymentProfile->id; // вот за это бан, что то может быть null

echo $transaction->customer?->paymentProfile->id;
// так безопасно, если customer = null то выполнение прервется
// и вся конструкция целиком вернет null а не warning
// еще актуальнее если бы было ->customer()->
// потому что customer()->.. ?? 'если null' не будет работать вовсе