Proprietà Backed vs Proprietà Virtuali in PHP


1. Differenza tra Proprietà Backed e Proprietà Virtuali

Proprietà Backed

Le proprietà backed sono le proprietà dichiarate esplicitamente nella classe.


class BlogData
{
    public readonly string $title;

    public readonly Status $status;

    public function __construct(string $title, Status $status)
    {
        $this->title = $title;
        $this->status = $status;
    }
}
  • Dichiarazione Esplicita: Le proprietà backed vengono dichiarate usando le parole chiave public, protected o private nella classe.
  • Memorizzazione Diretta: Il valore della proprietà è memorizzato direttamente in memoria e si accede tramite ->.
    echo $blogData->title;
  • Comportamento Automatico: PHP gestisce automaticamente le operazioni di lettura e scrittura a meno che non siano sovrascritte con metodi come __get() o __set().
  • Tipizzazione: Le dichiarazioni di tipo garantiscono che solo dati compatibili possano essere assegnati.
  • Prestazioni: Accesso più rapido perché i dati sono memorizzati direttamente in memoria.

Proprietà Virtuali

Le proprietà virtuali non sono dichiarate esplicitamente nella classe.
Possono essere assegnate e lette direttamente utilizzando la sintassi (deprecata) $obj->virtualProperty1 = 3;; oppure possono essere simulate utilizzando metodi magici di php __get() e __set().

Proprietà Virtuali con i metodi magici di php __get() e __set()

  • Nessuna Dichiarazione Esplicita: Le proprietà virtuali non sono dichiarate ma vengono implementate dinamicamente tramite metodi magici.
  • Comportamento Dinamico: I metodi __get e __set possono includere logica per manipolare o validare i dati durante l’accesso o l’assegnazione.
  • Memorizzazione: Il valore della proprietà non viene automaticamente memorizzato, tipicamente viene memorizzato ad es. in una proprietà dell’oggetto di tipo array ed $dati).
  • Logica Personalizzata: Offrono flessibilità per aggiungere comportamenti come validazione, logging o caricamento ritardato.
  • Prestazioni: Più lente delle proprietà backed a causa dell’overhead dovuto ai metodi magici.
Caratteristica Proprietà Backed Proprietà Virtuali
Dichiarazione Esplicita nella classe Non dichiarata, simulata
Memorizzazione Diretta nella memoria dell’oggetto Personalizzata (es. array interno)
Velocità di Accesso Più veloce Più lenta (overhead dei metodi magici)
Tipizzazione Gestita automaticamente da PHP Deve essere implementata manualmente

Quando si utilizzano i metodi magici `__get()` e `__set()`, si definisce un comportamento personalizzato per leggere e scrivere proprietà che non sono dichiarate esplicitamente nella classe.

  • Controllo personalizzato: È possibile aggiungere logica durante l’accesso o l’assegnazione di proprietà, ad esempio validazione, logging o calcoli dinamici.
  • Overhead maggiore: Ogni accesso o modifica richiede l’esecuzione di un metodo magico, con un leggero costo in termini di prestazioni.

class User {
	private $data = array();
        public function __set(string $prop, $value): void {
            switch ($prop) {
                case 'name':
                    if (!is_string($value)) {
                        throw new TypeError("Name must be a string");
                    }
                    if (strlen($value) === 0) {
                        throw new ValueError("Name must be non-empty");
                    }
                    break;
            }
            $this->data[$prop] = $valore;
        }
	public function __get($prop) {
		return @$this->data[$prop];
	}
}
$obj = new User();
if (!isset($obj->name)) {
	$obj->name = "Giacomo";
}
echo $obj->name; // Giacomo

Assegnazione Dinamica Diretta

Se la classe non definisce esplicitamente proprietà e non implementa i metodi magici, PHP permette di creare proprietà pubbliche dinamiche semplicemente assegnandole utilizzando la sintassi (deprecata) $obj->virtualProperty1 = 3;.

  • Nessun controllo: L’assegnazione e l’accesso sono diretti, senza possibilità di validare o manipolare i dati.
  • Isolato al singolo oggetto: Le proprietà create in questo modo sono specifiche dell’istanza.
  • Prestazioni più veloci: Non essendo invocati metodi, l’operazione è più veloce rispetto ai metodi magici.

Configurazione di LEMP Stack con Docker e Certificati SSL


Questo tutorial ti guida passo dopo passo nella configurazione di uno stack LEMP con Docker e Docker Compose, integrando la protezione SSL tramite Let’s Encrypt.

Prerequisiti

  • Un server Ubuntu con un utente non root abilitato a sudo e un firewall attivo.
  • Docker e Docker Compose installati.
  • Un dominio registrato con i record DNS configurati (A e www).

Fase 1: Configurazione del Server Web

Crea la directory di configurazione del progetto e il file nginx.conf:


mkdir -p webserver_www/nginx-conf
nano webserver_www/nginx-conf/nginx.conf

            

Inserisci il seguente blocco di configurazione:


server {
    listen 80;
    server_name your_domain www.your_domain;
    root /var/www/html;

    location ~ /.well-known/acme-challenge {
        allow all;
    }

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass php_fpm:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ /\.ht {
        deny all;
    }
}

            

Nota: Ricordati di sostituire your_domain con il tuo dominio effettivo.

Fase 2: Definizione delle Variabili Ambientali

Crea un file .env per definire variabili sensibili:


nano webserver_www/.env

            

Inserisci i seguenti valori:


MYSQL_ROOT_PASSWORD=your_root_password
MYSQL_USER=your_php_fpm_user
MYSQL_PASSWORD=your_php_fpm_password
MYSQL_DATABASE=your_database

            

Fase 3: Configurazione di Docker Compose

Crea il file docker-compose.yml per definire i servizi:


version: '3'
services:
  db:
    image: mysql:8.0
    env_file: .env
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - app-network

  php_fpm:
    image: php:8.2-fpm
    volumes:
      - php_fpm:/var/www/html
    networks:
      - app-network

  nginx:
    image: nginx:1.21-alpine
    ports:
      - "80:80"
    volumes:
      - php_fpm:/var/www/html
      - ./nginx-conf:/etc/nginx/conf.d
    networks:
      - app-network

  certbot:
    image: certbot/certbot
    volumes:
      - certbot-etc:/etc/letsencrypt
      - php_fpm:/var/www/html
    command: certonly --webroot --webroot-path=/var/www/html --email you@example.com --agree-tos --no-eff-email --staging -d your_domain -d www.your_domain

volumes:
  dbdata:
  php_fpm:
  certbot-etc:

networks:
  app-network:
    driver: bridge

            

Fase 4: Configurazione Certificati SSL

Esegui il comando per ottenere i certificati:


docker-compose up -d certbot

            

Verifica la presenza dei certificati con:


docker-compose exec nginx ls -la /etc/letsencrypt/live

            

Fase 5: Modifica della Configurazione Nginx

Modifica nginx.conf per abilitare HTTPS:


server {
    listen 443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
}

            

Fase 6: Rinnovo Automatico dei Certificati

Crea uno script di rinnovo:


#!/bin/bash
docker-compose run certbot renew && docker-compose kill -s SIGHUP nginx

            

Configura un cron job:


crontab -e
# Aggiungi la seguente riga
0 12 * * * /path/to/ssl_renew.sh >> /var/log/cron.log 2>&1

            

Installazione del LEMP Stack su Ubuntu

Questa guida descrive i passaggi per installare il LEMP Stack (Linux, Nginx, MySQL, PHP) su un server Ubuntu.
Al termine, configureremo un esempio di pagina PHP per mostrare una lista di articoli di un e-commerce.

Passaggi principali

  1. Installazione di Nginx
  2. Installazione di MySQL
  3. Installazione di PHP
  4. Configurazione di Nginx per PHP
  5. Test di una pagina PHP
  6. Esempio di pagina PHP per e-commerce

1. Installazione di Nginx

Aggiorna i pacchetti e installa Nginx:

sudo apt update
sudo apt install nginx

Verifica che Nginx sia in esecuzione:

sudo systemctl status nginx

2. Installazione di MySQL

Installa il server MySQL:

sudo apt install mysql-server

Esegui lo script di sicurezza:

sudo mysql_secure_installation

3. Installazione di PHP

Installa PHP e il modulo per MySQL:

sudo apt install php-fpm php-mysql

4. Configurazione di Nginx per PHP

Crea un blocco server per il tuo dominio:

sudo nano /etc/nginx/sites-available/ecommerce

Inserisci la seguente configurazione:

server {
    listen 80;
    server_name ecommerce.test www.ecommerce.test;
    root /var/www/ecommerce;
    index index.php index.html;
    location / {
        try_files $uri $uri/ =404;
    }
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }
}

Attiva il sito e ricarica Nginx:

sudo ln -s /etc/nginx/sites-available/ecommerce /etc/nginx/sites-enabled/
sudo systemctl reload nginx

5. Test di una pagina PHP

Crea un file info.php:

sudo nano /var/www/ecommerce/info.php

Aggiungi il seguente codice:

<?php
phpinfo();

Visita http://ecommerce.test/info.php per verificare.

6. Esempio di pagina PHP per e-commerce

Crea un file products.php:

sudo nano /var/www/ecommerce/products.php

Aggiungi il seguente codice:

<?php
// Connessione al database
$conn = new mysqli('localhost', 'username', 'password', 'ecommerce');
if ($conn->connect_error) {
    die("Connessione fallita: " . $conn->connect_error);
}

// Query per ottenere gli articoli
$result = $conn->query("SELECT id, nome, prezzo FROM prodotti");
if ($result->num_rows > 0) {
    echo "<table><tr><th>ID</th><th>Nome</th><th>Prezzo</th></tr>";
    while ($row = $result->fetch_assoc()) {
        echo "<tr><td>" . $row["id"] . "</td><td>" . $row["nome"] . "</td><td>" . $row["prezzo"] . "</td></tr>";
    }
    echo "</table>";
} else {
    echo "Nessun prodotto trovato.";
}
$conn->close();

Visita http://ecommerce.test/products.php per visualizzare la lista di prodotti.

Riferimenti