Clase sakila

<?php

class Sakila {

private $server = "localhost";
 private $user = "root";
 private $password = "";
 private $db = "sakila";
 private $conn;

function __construct() {
 try {
 $this->conn = new PDO("mysql:host=$this->server;dbname=$this->db", $this->user, $this->password);
 $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$this->conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
 $this->conn->exec("SET CHARACTER SET utf8");
 } catch (PDOException $e) {
 echo "Connection failed: " . $e->getMessage();
 }
 }

/**
 * Inserta un nuevo actor o devuelve el id si ya existe
 * @param string valor de first_name
 * @param string valor de last_name
 * @return int id
 */
 function newActor($first_name, $last_name) {
 if (!empty($first_name) && !empty($last_name)) {
 $sql = "select * from actor where first_name='$first_name' and last_name='$last_name'";
 $c = $this->conn->query($sql);
 if ($actor = $c->fetch()) {
 return $actor['actor_id'];
 }
 $sql = "insert into actor (first_name,last_name) values ('$first_name','$last_name')";
 $this->conn->exec($sql);
 return $this->conn->lastInsertId();
 } else {
 return null;
 }
 }

/**
 * Inserta una película en una categoría
 * @param int id de la categoría
 * @param string título de la película
 */
 function newFilm($category_id, $film) {

$sql = "insert into film(title,language_id) values ('$film',1)";
 $this->conn->exec($sql);
 $film_id = $this->conn->lastInsertId();
 $sql = "insert into film_category(film_id,category_id) values($film_id,$category_id)";
 $this->conn->exec($sql);
 }

/**
 * Crea un select con todas las categorías
 */
 function selectCategory() {
 $sql = "select * from category";
 $q = $this->conn->query($sql);
 $categorias = $q->fetchAll();
 ?>
 <select name="category">
 <?php foreach ($categorias as $categoria) {
 ?>
 <option value="<?= $categoria['category_id'] ?>"><?= $categoria['name'] ?></option>
 <?php } ?>
 </select>
 <?php
 }

}

Añadir película y categoría con clases

sakila.php

<?php

class Sakila {

private $server = "localhost";
 private $user = "root";
 private $password = "";
 private $db = "sakila";
 private $conn;

function __construct() {
 try {
 $this->conn = new PDO("mysql:host=$this->server;dbname=$this->db", $this->user, $this->password);
 $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$this->conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
 $this->conn->exec("SET CHARACTER SET utf8");
 
 } catch (PDOException $e) {
 echo "Connection failed: " . $e->getMessage();
 }
 }

function newFilm($category_id, $film) {
 
 $sql = "insert into film(title,language_id) values ('$film',1)";
 $this->conn->exec($sql);
 $film_id = $this->conn->lastInsertId();
 $sql = "insert into film_category(film_id,category_id) values($film_id,$category_id)";
 $this->conn->exec($sql);
 }

function selectCategory() {
 $sql = "select * from category";
 $q = $this->conn->query($sql);
 $categorias = $q->fetchAll();
 ?>
 <select name="category">
 <?php foreach ($categorias as $categoria) {
 ?>
 <option value="<?= $categoria['category_id'] ?>"><?= $categoria['name'] ?></option>
 <?php } ?>
 </select>
 <?php
 }

}

index.php

<?php
 include "sakila.php";
 $sakila = new Sakila();

$category = filter_input(INPUT_GET, "category", FILTER_VALIDATE_INT);
 $film = filter_input(INPUT_GET, "film");
 if (!empty($category) && !empty($film)) {
 $sakila->newFilm($category, $film);
 }
 ?>
 <form>
 Categoría: 
 <?php $sakila->selectCategory(); ?>
 <br/>
 Película: <input type="text" name="film"><br/>
 <input type="submit">

</form>

Añadir película y categoría

<?php
 $server = "localhost";
 $user = "root";
 $password = "";
 $db = "sakila";

try {
 $conn = new PDO("mysql:host=$server;dbname=$db", $user, $password);
 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
 $conn->exec("SET CHARACTER SET utf8");

$category = filter_input(INPUT_GET, "category", FILTER_VALIDATE_INT);
 $film = filter_input(INPUT_GET, "film");
 if (!empty($category) && !empty($film)) {
 $sql="insert into film(title,language_id) values ('$film',1)";
 $conn->exec($sql);
 $film_id=$conn->lastInsertId();
 $sql="insert into film_category(film_id,category_id) values($film_id,$category)";
 $conn->exec($sql);
 }

$sql = "select * from category";
 $q = $conn->query($sql);
 $categorias = $q->fetchAll();
 } catch (PDOException $e) {
 echo "Connection failed: " . $e->getMessage();
 }
 ?>
 <form>
 Categoría: 
 <select name="category">
 <?php foreach ($categorias as $categoria) {
 ?>
 <option value="<?= $categoria['category_id'] ?>"><?= $categoria['name'] ?></option>
 <?php } ?>
 </select>
 <br/>
 Película: <input type="text" name="film"><br/>
 <input type="submit">

</form>

Ejemplos __get y __set y herencia

<?php

class Empleado {

private $nombre;
 private $sueldo;

function __construct($nombre, $sueldo) {
 $this->nombre = $nombre;
 }

function paga() {
 return $this->sueldo / 12;
 }

public function __get($propiedad) {
 if (property_exists($this, $propiedad)) {
 return $this->$propiedad;
 } else {
 throw new Exception("No existe la propiedad");
 }
 }

public function __set($property, $value) {
 if (property_exists($this, $property)) {
 if ($property == "sueldo") {
 if ($value > 600) {
 $this->sueldo = $value;
 } else {
 throw new Exception("Sueldo debe ser > 600");
 }
 } elseif (!empty($value)) {
 $this->$property = $value;
 }
 }
 }

}

class comercial extends empleado {

private $comision = .1;
 protected $ventas;

public function __construct($nombre, $sueldo, $ventas) {
 parent::__construct($nombre, $sueldo);
 $this->ventas = $ventas;
 }

function paga() {
 $p = parent::paga();
 return $p + $this->ventas * $this->comision / 12;
 }

}

index.php

$juan = new Empleado("Juan", 300);
        $p=new comercial("Juasdan", 300,9000);
        echo $p->nombre;
        echo $p->paga();
        try {
            $juan->sueldo = 6000;
            echo $juan->sueldo;
            echo $juan->paga();
        } catch (Exception $error) {
            echo $error->getMessage();
        }

Cesta de la compra con clases

cesta.php:

<?php

class cesta {

private $cesta = [];

function anyadir($producto,$precio){
 $this->cesta[]=['producto'=>$producto,'precio'=>$precio];
 }
 function verCesta() {
 ?>
 <table border="1">
 <tr><td>Producto</td><td>Precio</td></tr>
 <?php foreach ($this->cesta as $elemento) {
 ?>
 <tr><td><?= $elemento['producto'] ?></td><td><?= $elemento['precio'] ?></td>
 </tr> <?php } ?>
 </table> <?php
 }

}

index.php

<?php
 include_once "cesta.php";
 session_start();
 if (!isset($_SESSION['cesta'])) {
 $_SESSION['cesta'] = new cesta();
 }
 $producto = filter_input(INPUT_GET, 'producto');
 $precio = filter_input(INPUT_GET, 'precio', FILTER_VALIDATE_INT);
 if (!empty($producto) && !empty($precio)) {
 $_SESSION['cesta']->anyadir($producto, $precio);
 }
 $_SESSION['cesta']->verCesta();
 
 ?>

<form>
 <p>Producto:<input type="text" name="producto"></p>
 <p>Precio:<input type="text" name="precio"></p>
 <input type="submit">
 </form>

 

Operador resolución de ámbito (::)

<?php

class ClaseSencilla {

// Declaración de una propiedad
 public $var = 'un valor predeterminado';
 static $nombre = "Clase";

// Declaración de un método
 public function mostrarVar() {
 echo $this->var;
 }

public function __construct($var = "Instancia por defecto") {
 $this->var = $var;
 }

public function __destruct() {
 //Si hay algo que destruir
 }

static function hola() {
 echo "Hola que tal";
 }

}

ClaseSencilla::hola();

echo ClaseSencilla::$nombre;

class MyClass {

protected function myFunc() {
 echo "MyClass::myFunc()\n";
 }

}

class OtherClass extends MyClass {

// Sobrescritura de definición parent
 public function myFunc() {
 // Pero todavía se puede llamar a la función parent
 parent::myFunc();
 echo "OtherClass::myFunc()\n";
 }

}

$class = new OtherClass();
 $class->myFunc();
 ?>

Ejemplos clases

<?php

class ClaseSencilla {

// Declaración de una propiedad
 public $var = 'un valor predeterminado';

// Declaración de un método
 public function mostrarVar() {
 echo $this->var;
 }

public function __construct($var = "Instancia por defecto") {
 $this->var = $var;
 }

public function __destruct() {
 //Si hay algo que destruir
 }

}

$instancia = new ClaseSencilla("Instancia 1");
 $instancia->mostrarVar();

$otraInstancia = new ClaseSencilla("Instancia 2");
 $otraInstancia->mostrarVar();

$otraMas = new ClaseSencilla();
 $otraMas->mostrarVar();

//Visibilidad

/**
 * Definición de MyClass
 */
 class MyClass {

public $variablePublica = 'Public';
 protected $variableProtegida = 'Protected';
 private $variablePrivada = 'Private';

function printHello() {
 echo $this->variablePublica;
 echo $this->variableProtegida;
 echo $this->variablePrivada;
 }

}

$obj = new MyClass();
 echo $obj->variablePublica; // Funciona bien
 //echo $obj->variableProtegida; // Error Fatal
 //echo $obj->variablePrivada; // Error Fatal
 $obj->printHello(); // Muestra Public, Protected y Private

/**
 * Definición de MyClass2
 */
 class MyClass2 extends MyClass {

// Se pueden redeclarar las propiedades pública y protegida, pero no la privada
 public $public = 'Public2';
 //protected $protected = 'Protected2';

function printHello() {
 echo $this->public;
 echo $this->protected;
 // echo $this->private; // Undefined
 }

}

$obj2 = new MyClass2();
 echo $obj2->public; // Funciona bien
 //echo $obj2->protected; // Error Fatal
 //echo $obj2->private; // Undefined
 $obj2->printHello(); // Muestra Public2, Protected2, Undefined
 ?>

Cesta de la compra sesiones

funciones.php

function verCesta($cesta) {
 ?>
 <table border="1">
 <tr><td>Producto</td><td>Precio</td></tr>
 <?php foreach ($cesta as $elemento) {
 ?>
 <tr><td><?= $elemento['producto'] ?></td><td><?= $elemento['precio'] ?></td>
 </tr> <?php } ?>
 </table> <?php
}

index.php

<?php
 include_once "funciones.php";
 session_start();
 $producto = filter_input(INPUT_GET, 'producto');
 $precio = filter_input(INPUT_GET, 'precio');
 if (!empty($producto) && !empty($precio)) {
 $_SESSION['cesta'][] = ['producto' => $producto, 'precio' => $precio];
 }
 if (isset($_SESSION['cesta'])) {
 verCesta($_SESSION['cesta']);
 }
 ?>

<form>
 <p>Producto:<input type="text" name="producto"></p>
 <p>Precio:<input type="text" name="precio"></p>
 <input type="submit">
 </form>