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>

Ejemplo login

<?php
 session_start();

//Si hay un usuario no hago nada. Si no hay usuario le pongo un enlace al login
 if (empty($_SESSION['user'])) {
 ?>
 <h2>No estás autorizado. Por favor haz login</h2>
 <a href="index.php">Página de login</a>
 <?php
 }
 else{
 echo "Yupiiii!";
 }
 ?>
<?php
 session_start();
 
 //Si me han mandado un usuario y un pass y son 'JUAN' y '1234'
 //El login es correcto, creo una variable de sesión usuario y le pongo 'JUAN'

$user = filter_input(INPUT_GET, 'user');
 $password = filter_input(INPUT_GET, 'password');
 if ($user == 'JUAN' && $password == '1234') {
 $_SESSION['user'] = $user;
 }
 ?>

<form>
 <p>Usuario:<input type="text" name="user"></p>
 <p>Password:<input type="password" name="password"></p>
 <input type="submit">
 </form>

PHP DateTime y DateInterval

Vamos a ver algunas propiedades del objeto DateTime para manejar fechas y horas y del objeto DateInterval que se usa para algunas propiedades.

El objeto DateTime se instancia con la palabra clave new. Por defecto tendrá la fecha actual, pero podemos pasarle una cadena que nos indicará la fecha que queramos. Esta es similar a las que pasamos en strtotime y permite palabras como ‘tomorrow’, o ‘next month’:

$currentDateTime = new DateTime(); 
$yesterday = new DateTime('yesterday'); 
$twoDaysLater = new DateTime('+ 2 days'); 
$oneWeekEarly = new DateTime('- 1 week'); 
$dateTime = new DateTime('2015-01-01 12:30:12');

Otros ejemplos:

$valid_time_formats = ['now', 'jan 1 2016', '12 hours ago', 'next year', 'first day of next month', 'last day of this month', '12/25/2015', '@612835200'];

Una vez tenemos un objeto DateTime podemos formatearlo como se hacía con date():

$now = new DateTime();   
$ymdNow = $now->format('Y-m-d'); 
print_r($now->format('jS F Y'));   
print_r($now->format('ga jS M Y'));   
print_r($now->format('Y/m/d s:i:H'));

Podemos comparar dos fechas:

$today = new DateTime('today'); 
$yesterday = new DateTime('yesterday');  

var_dump($today > $yesterday); 
var_dump($today < $yesterday); 
var_dump($today == $yesterday);

// Output 
bool(true) 
bool(false) 
bool(false)

Podemos modificar una fecha con la propiedad modify, que permite añadir o quitar elementos igual que en strtotime:

$today = new DateTime('today');

$today->modify('-2 days');

Ejemplos de modificadores:

$modifiers = ['now', '+10 seconds', '+10 minutes', '+1 day', 'last second tomorrow', 'last day of this month', '12/31', '+3 months', '+1 year'];

Las fechas se pueden restar. Esto nos devuelve un objeto de tipo DateInterval, que veremos más adelante:

$today = new DateTime('today'); 
$yesterday = new DateTime('yesterday');  

$interval = $today->diff($yesterday);
echo $interval->format('%d day ago')

El formato de interval es parecido al de date, pero con el %.

También podemos añadir o restar intervalos a las fechas:

$today = new DateTime('today');
 
$today->add(new DateInterval('P2D'));
$today->sub(new DateInterval('P2D'));

El objeto DateInterval merece apartado propio. Se crea con una duración de un periodo determinado:

PYMDTHMS
P: period
Y: years
M: months
D: days
T: time
H: hours
M: minutes
S: seconds

Ejemplos:

P1Y 1 año
P1M 1 mes
P1D 1 día
P30D 30 días
PT1H 1 hora
PT5M 5 minutos
PT35S 35 segundos
P1Y6M29DT4H34M23S 1 año, 6 meses, 29 días, 4 horas, 34 minutos, 23 segundos

$Duration = new DateInterval( "P1Y2M3DT4H5M6S" );
print_r( $Duration );
Resultado:

DateInterval Object
(
[y] => 1
[m] => 2
[d] => 3
[h] => 4
[i] => 5
[s] => 6
...
)

$Duration = new DateInterval('P345D');
echo $Duration->format('P%yY%mM%dDT%hH%iM%sS'); // P0Y0M345DT0H0M0S

Algunos enlaces de utilidad:

https://www.startutorial.com/articles/view/master-php-datetime

http://www.bonify.io/blog/2014/09/its-about-time-we-talk-about-phps-datetime

http://php.net/manual/es/class.datetime.php

An Introduction to the PHP DateInterval Class

http://php.net/manual/es/class.dateinterval.php

Ejemplos cookie e include

Archivo muestracookie:

<?php
//Comprueba si hay una cookie llamada nombre y muestra el valor
$nombre = filter_input(INPUT_COOKIE, "nombre");
if (!empty($nombre)) {
 ?>
 <h4>Usuario: <?= $nombre ?></h4>
 <?php
}
?>

Index.php:

<?php
 //Comprueba que me hayan pasado un nombre, y si es así lo guarda en la cookie
 $nombre = filter_input(INPUT_GET, "nombre");

if (!empty($nombre)) {
 setcookie("nombre", $nombre, time() + 86400);
 }

include "muestracookie.php";
 ?>
 <form>
 Pon tu nombre: <input type="text" name="nombre">
 <input type="submit">
 </form>

Uso en otras páginas:

<?php
 include "muestracookie.php";
 ?>

Funciones de fecha y hora

Obtener la fecha actual:

print date('d-M-Y');

//Otros formatos:
$hoy = date("F j, Y, g:i a");                 // March 10, 2001, 5:16 pm
$hoy = date("m.d.y");                         // 03.10.01
$hoy = date("j, n, Y");                       // 10, 3, 2001
$hoy = date("Ymd");                           // 20010310
$hoy = date('h-i-s, j-m-y, it is w Day');     // 05-16-18, 10-03-01, 1631 1618 6 Satpm01
$hoy = date('\i\t \i\s \t\h\e jS \d\a\y.');   // it is the 10th day.
$hoy = date("D M j G:i:s T Y");               // Sat Mar 10 17:16:18 MST 2001
$hoy = date('H:m:s \m \i\s\ \m\o\n\t\h');     // 17:03:18 m is month
$hoy = date("H:i:s");                         // 17:16:18
$hoy = date("Y-m-d H:i:s");                   // 2001-03-10 17:16:18 (el formato DATETIME de MySQL)

Crear una fecha:

mktime (hora,minuto,segundo,mes,dia,año)
$mañana        = mktime(0, 0, 0, date("m")  , date("d")+1, date("Y"));
$mes_anterior  = mktime(0, 0, 0, date("m")-1, date("d"),   date("Y"));
$año_siguiente = mktime(0, 0, 0, date("m"),   date("d"),   date("Y")+1);

Convertir cadenas en fecha:

echo strtotime("now"), "\n";
echo strtotime("10 September 2000"), "\n";
echo strtotime("+1 day"), "\n";
echo strtotime("+1 week"), "\n";
echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
echo strtotime("next Thursday"), "\n";
echo strtotime("last Monday"), "\n";