<?php

// *********************************************************************
// 
//  Clase Producto
//
//  Taller de Programación Orientada a Objetos
//  para programadores de PHP
//
//  http://www.linuxcabal.org
//
//  Autor: Jerónimo Sánchez <jsanchez@consecutio.com>
// 

class Producto {
    
    // atributos = variables miembro
    
    // conviene que todos los atributos sean declarados con el 
    // modificador de acceso "protected", y definir métodos "getter" y
    // "setter" para acceder a ellos de manera controlada.
    
    // es una buena costumbre inicializar los atributos con un valor
    // que tenga sentido. todos los objetos que se creen a partir de esta
    // clase tendrán al menos un valor para sus atributos.
    
    protected $codigo = '';         // código: VARCHAR(10) 
    protected $descripcion = '';    // descripción: VARCHAR(255)
    protected $precio = 0.0;        // precio: FLOAT(10,2)
    
    // ---------------------------------------------------------------------
    
    // constructor
    
    // si no declaramos un constructor, el motor de PHP crea uno por
    // nosotros de manera automática. se llama constructor por defecto 
    // no toma ningún parámetro y no hace absolutamente nada.
    // es como si hubiéramos escrito:
    
    // public function __construct () {
    // }
    
    // ---------------------------------------------------------------------

    // métodos "getter" y "setter"
    
    // recuerda: mediante los métodos "getter" y "setter" evitas que
    // otros programadores puedan acceder a los atributos de los objetos
    // de manera descontrolada.
    
    public function obtenerCodigo () {
        
        return $this->codigo;
        
    }
    
    public function ponerCodigo ($c) {
        
        // antes de poner el valor del atributo "codigo"
        // decidimos que queremos validarlo: sólo aceptaremos cadenas. 
        
        if (is_string($c)) {
            $this->codigo = $c;
        } else {
            echo 'ERROR: '.$c.' no es un valor correcto para el codigo<br />';
        }
        
    }
    
    public function obtenerDescripcion () {
        return $this->descripcion;
    }

    public function ponerDescripcion ($desc) {
        
        // en este caso no realizamos ninguna validación.
        // no obstante, gracias a que modificamos el valor
        // dentro de un método "setter", tenemos la posibilidad
        // de añadir validación en el futuro sin afectar
        // a otros programadores.
        
        $this->descripcion = $desc;
        
    }

    public function obtenerPrecio () {
        return $this->precio;
    }

    public function ponerPrecio ($p) {
        $this->precio = $p;
    }

    // ---------------------------------------------------------------------

    // otros métodos...
    
}

?>
