PHP Procedural

  1. Microservicios (procedural): endpoints con funciones.
  2. Monolith MVC
  • Modelo Procedural: funciones que consultan la DB.
  • Vista Procedural: HTML + variables PHP (include, require).
  • Controlador Procedural: Recibe la request ($_GET, $_POST), llama funciones del modelo y carga la vista.

PHP OOP

  1. Microservicios (OOP): servicios encapsulados en clases y/o alternativa usando DAO.
  2. Monolith MVC
  • Modelo con DAO: DAO para acceso a datos, Modelo para lógica.
  • Modelo OOP: Modelo maneja negocio y persistencia en la misma clase.
  • Vista OOP: Clases de vista.
  • Controlador OOP: Clases controller o front controller.

Ejemplos usando MySQL:

Microservicios (Procedural RESTful)

/api/db.php

<?php
function getConnection(
    string $host = "localhost",
    string $user = "root",
    string $password = "",
    string $database = "mi_base"
): mysqli {
    $conn = mysqli_connect($host, $user, $password, $database);
    if (!$conn) {
        die("Error de conexión: " . mysqli_connect_error());
    }
    return $conn;
}

/api/users/index.php

<?php
header("Content-Type: application/json");
require "users.php";

$method = $_SERVER["REQUEST_METHOD"];
$id = 0;
if (isset($_GET["id"])) {
    $id = (int) $_GET["id"];
}

switch ($method) {
    case "GET": {
        if ($id !== 0) {
            echo json_encode(getUserById($id));
        } else {
            echo json_encode(getUsers());
        }
        break;
    }
    case "POST": {
        $data = json_decode(file_get_contents("php://input"), true);
        echo json_encode(createUser($data));
        http_response_code(201);
        break;
    }
    default: {
        http_response_code(405);
        echo json_encode(array("error" => "Método no permitido"));
        break;
    }
}

/api/users/users.php

<?php
require __DIR__ . "/../db.php";

function getUsers(): array {
    $conn = getConnection();
    $sql = "SELECT id, name FROM users";
    $result = mysqli_query($conn, $sql);

    $usuarios = array();
    while ($row = mysqli_fetch_assoc($result)) {
        $usuarios[] = $row;
    }
    mysqli_close($conn);
    return $usuarios;
}

function getUserById(int $id): array {
    $conn = getConnection();
    $stmt = mysqli_prepare($conn, "SELECT id, name FROM users WHERE id = ?");
    mysqli_stmt_bind_param($stmt, "i", $id);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);
    $usuario = mysqli_fetch_assoc($result);
    if (!$usuario) {
        $usuario = array();
    }
    mysqli_stmt_close($stmt);
    mysqli_close($conn);
    return $usuario;
}

function createUser(array $data): array {
    $name = "Desconocido";
    if (isset($data["name"]) && is_string($data["name"]) && trim($data["name"]) !== "") {
        $name = trim($data["name"]);
    }

    $conn = getConnection();
    $stmt = mysqli_prepare($conn, "INSERT INTO users (name) VALUES (?)");
    mysqli_stmt_bind_param($stmt, "s", $name);
    mysqli_stmt_execute($stmt);

    $id = mysqli_insert_id($conn);

    mysqli_stmt_close($stmt);
    mysqli_close($conn);

    return array("id" => (int)$id, "name" => $name);
}

MVC Procedural

modelo.php

<?php
require "db.php";

function getUsers(): array {
    $conn = getConnection();
    $sql = "SELECT id, name FROM users";
    $result = mysqli_query($conn, $sql);

    $usuarios = array();
    while ($row = mysqli_fetch_assoc($result)) {
        $usuarios[] = $row;
    }
    mysqli_close($conn);
    return $usuarios;
}

vista.php

<?php
<h1>Usuarios</h1>
<ul>
<?php
for ($i = 0; $i < count($usuarios); $i++) {
    echo "<li>" . htmlspecialchars($usuarios[$i]["name"]) . "</li>";
}
?>
</ul>

controlador.php

<?php
require "modelo.php";
$usuarios = getUsers();
include "vista.php";

Microservicios (OOP RESTful)

/api/db.php

<?php
class Database {
    public static function getConnection(
        string $host = "localhost",
        string $user = "root",
        string $password = "",
        string $database = "mi_base"
    ): mysqli {
        $conn = new mysqli($host, $user, $password, $database);
        if ($conn->connect_error) {
            die("Error de conexión: " . $conn->connect_error);
        }
        return $conn;
    }
}

/api/users/index.php

<?php
header("Content-Type: application/json");
require "UserService.php";

$service = new UserService();
$method = $_SERVER["REQUEST_METHOD"];
$id = 0;
if (isset($_GET["id"])) {
    $id = (int) $_GET["id"];
}

switch ($method) {
    case "GET": {
        if ($id !== 0) {
            echo json_encode($service->getUserById($id));
        } else {
            echo json_encode($service->getUsers());
        }
        break;
    }
    case "POST": {
        $data = json_decode(file_get_contents("php://input"), true);
        echo json_encode($service->createUser($data));
        http_response_code(201);
        break;
    }
    default: {
        http_response_code(405);
        echo json_encode(array("error" => "Método no permitido"));
        break;
    }
}

/api/users/UserService.php

<?php
require __DIR__ . "/../db.php";

class UserService {
    public function getUsers(): array {
        $conn = Database::getConnection();
        $sql = "SELECT id, name FROM users";
        $result = $conn->query($sql);

        $usuarios = array();
        while ($row = $result->fetch_assoc()) {
            $usuarios[] = $row;
        }
        $conn->close();
        return $usuarios;
    }

    public function getUserById(int $id): array {
        $conn = Database::getConnection();
        $stmt = $conn->prepare("SELECT id, name FROM users WHERE id = ?");
        $stmt->bind_param("i", $id);
        $stmt->execute();
        $result = $stmt->get_result();
        $usuario = $result->fetch_assoc();
        if (!$usuario) {
            $usuario = array();
        }
        $stmt->close();
        $conn->close();
        return $usuario;
    }

    public function createUser(array $data): array {
        $name = "Desconocido";
        if (isset($data["name"]) && is_string($data["name"]) && trim($data["name"]) !== "") {
            $name = trim($data["name"]);
        }

        $conn = Database::getConnection();
        $stmt = $conn->prepare("INSERT INTO users (name) VALUES (?)");
        $stmt->bind_param("s", $name);
        $stmt->execute();
        $id = $conn->insert_id;

        $stmt->close();
        $conn->close();

        return array("id" => (int)$id, "name" => $name);
    }
}

Microservicios (OOP RESTful con DAO)

/api/users/UserDAO.php

<?php
require __DIR__ . "/../db.php";

class UserDAO {
    public function getAll(): array {
        $conn = Database::getConnection();
        $sql = "SELECT id, name FROM users";
        $result = $conn->query($sql);

        $usuarios = array();
        while ($row = $result->fetch_assoc()) {
            $usuarios[] = $row;
        }
        $conn->close();
        return $usuarios;
    }

    public function getById(int $id): array {
        $conn = Database::getConnection();
        $stmt = $conn->prepare("SELECT id, name FROM users WHERE id = ?");
        $stmt->bind_param("i", $id);
        $stmt->execute();
        $result = $stmt->get_result();
        $usuario = $result->fetch_assoc();
        if (!$usuario) {
            $usuario = array();
        }
        $stmt->close();
        $conn->close();
        return $usuario;
    }

    public function create(array $data): array {
        $name = "Desconocido";
        if (isset($data["name"]) && is_string($data["name"]) && trim($data["name"]) !== "") {
            $name = trim($data["name"]);
        }

        $conn = Database::getConnection();
        $stmt = $conn->prepare("INSERT INTO users (name) VALUES (?)");
        $stmt->bind_param("s", $name);
        $stmt->execute();
        $id = $conn->insert_id;

        $stmt->close();
        $conn->close();

        return array("id" => (int)$id, "name" => $name);
    }
}

/api/users/UserService.php

<?php
require "UserDAO.php";

class UserService {
    private UserDAO $dao;

    public function __construct() {
        $this->dao = new UserDAO();
    }

    public function getUsers(): array {
        return $this->dao->getAll();
    }

    public function getUserById(int $id): array {
        return $this->dao->getById($id);
    }

    public function createUser(array $data): array {
        return $this->dao->create($data);
    }
}

/api/users/index.php

<?php
header("Content-Type: application/json");
require "UserService.php";

$service = new UserService();
$method = $_SERVER["REQUEST_METHOD"];
$id = 0;
if (isset($_GET["id"])) {
    $id = (int) $_GET["id"];
}

switch ($method) {
    case "GET": {
        if ($id !== 0) {
            echo json_encode($service->getUserById($id));
        } else {
            echo json_encode($service->getUsers());
        }
        break;
    }
    case "POST": {
        $data = json_decode(file_get_contents("php://input"), true);
        echo json_encode($service->createUser($data));
        http_response_code(201);
        break;
    }
    default: {
        http_response_code(405);
        echo json_encode(array("error" => "Método no permitido"));
        break;
    }
}

MVC OOP

Modelo con DAO

UserDAO.php

<?php
require "db.php";

class UserDAO {
    public function getAll(): array {
        $conn = Database::getConnection();
        $sql = "SELECT id, name FROM users";
        $result = $conn->query($sql);

        $usuarios = array();
        while ($row = $result->fetch_assoc()) {
            $usuarios[] = $row;
        }
        $conn->close();
        return $usuarios;
    }
}

UserModel.php

<?php
require "UserDAO.php";

class UserModel {
    private UserDAO $dao;

    public function __construct() {
        $this->dao = new UserDAO();
    }

    public function allUsers(): array {
        return $this->dao->getAll();
    }
}

Modelo OOP (sin DAO, todo en la clase)

UserModel.php

<?php
require "db.php";

class UserModel {
    public function allUsers(): array {
        $conn = Database::getConnection();
        $sql = "SELECT id, name FROM users";
        $result = $conn->query($sql);

        $usuarios = array();
        while ($row = $result->fetch_assoc()) {
            $usuarios[] = $row;
        }
        $conn->close();
        return $usuarios;
    }
}

Vista OOP

UserView.php

<?php
class UserView {
    public function render(array $usuarios): void {
        ?>
        <h1>Usuarios</h1>
        <ul>
        <?php
        for ($i = 0; $i < count($usuarios); $i++) {
            echo "<li>" . htmlspecialchars($usuarios[$i]["name"]) . "</li>";
        }
        ?>
        </ul>
        <?php
    }
}

Controlador OOP (Clases Controller)

UserController.php

<?php
require "UserModel.php";
require "UserView.php";

class UserController {
    private UserModel $model;
    private UserView $view;

    public function __construct() {
        $this->model = new UserModel();
        $this->view = new UserView();
    }

    public function index(): void {
        $usuarios = $this->model->allUsers();
        $this->view->render($usuarios);
    }
}

$controller = new UserController();
$controller->index();

Controlador OOP (Front Controller)

index.php

<?php
require "UserController.php";

$path = "users/index";
if (isset($_GET["path"])) {
    $path = $_GET["path"];
}

$parts = explode("/", $path);

if (count($parts) === 2) {
    $controllerName = $parts[0];
    $method = $parts[1];

    if ($controllerName === "users") {
        $controller = new UserController();
        if (method_exists($controller, $method)) {
            $controller->$method();
        } else {
            echo "404 Not Found";
        }
    } else {
        echo "404 Not Found";
    }
} else {
    echo "404 Not Found";
}