# Repaso sobre la Programación Orientada a Objetos

Para ejercitar un poco los conceptos relacionados a la Programación Orientada a Objetos, se explicaran algunos conceptos mediante ejemplos puntuales realizados usando el lenguaje PHP.

En la programación orientada a objetos se usan conceptos que buscan representar acciones o cosas de la vida real en forma de objetos, usando conceptos como clases, objetos, métodos, propiedades, estados, herencia, encapsulación y muchas cosas más, que seran explicadas de forma sencilla en las siguientes lineas.

**Clase**

Es una estructura que define un objeto de la vida real, describiendo sus propiedades y comportamientos. Generalmente una clase se conforma de tres partes fundamentales:

- Nombre: es el nombre de la clase.
- Atributos: representan las propiedades de la clase.
- Métodos: representan el comportamiento u operaciones que tendra la clase.
Objeto

Los objetos representan una entidad del mundo real y representa la instancia de una clase.

Un ejemplo de una clase con una estructura definida se asemeja a lo siguiente.

```php
  <?php
  //nombre de la clase
  class Curso {
  
    // definicion de las propiedades de la clase
    public $nombre;
    public $duracion;
    public $costo;
    public $moneda;
    public $profesor;
    public $disponible;
    
    // definir metodos de la clase
    public function imprimirInfo(){
      return "El Nombre del Curso es: " . $this->nombre . "y quien imparte el curso es: " . $this->profesor . "<br/>";
    }

    public function validarDisponibilidad(){
      if($this->disponible == true){
        return "El Curso esta Disponible";
      } else {
        return "El Curso no está disponible";
      }
    }
  }
  //definicion de una instancia de la clase Curso
  $curso = new Curso();
  //añado propiedades al objeto de la clase Curso
  $curso->nombre = "POO en PHP";
  $curso->duracion = "3 Secciones";
  $curso->costo = 10;
  $curso->moneda = "USD";
  $curso->profesor = "Yesi Days";
  $curso->disponible = true;

  //instancia de un objeto de la clase Curso
  $javascript = new Curso();
  //añado propiedades al objeto de la Clase Curso
  $javascript->nombre = "POO en PHP";
  $javascript->duracion = "3 Secciones";
  $javascript->costo = 10;
  $javascript->moneda = "USD";
  $javascript->profesor = "Yesi Days";
  $javascript->disponible = true;
  
  //imprimo propiedades de los cursos
  var_dump($curso);
  var_dump($javascript);
  //llamo al metodo imprimirInfo del objeto curso y del objeto javascript
  echo $curso->imprimirInfo();
  echo $javascript->imprimirInfo();
  //llamo al metodo validarDisponibilidad del objeto curso y del objeto javascript
  echo $curso->validarDisponibilidad();
  echo $javascript->validarDisponibilidad();

  ?>
```


**Herencia**

Este concepto se refiere a que una clase puede heredar las propiedades o métodos de otra clase, siendo esto necesario cuando una clase va a compartir propiedades o métodos con otra clase pero siempre teniendo alguna propiedad que lo distinga, caso contrario no tiene razón de ser, el aplicar herencia a dicha clase.

**Encapsulamiento**

Este concepto es muy importante en lo referente a la seguridad, ya que así se protegen los datos dentro de un sistema, ya que permite la asignación de permisos o el establecimiento de diferentes niveles de acceso.

Generalmente existen los siguientes niveles:

- Público: este nivel permite que cualquiera pueda acceder a los atributos o métodos de una clase.
- Privado: este nivel permite que solo el objeto que pertenece a una clase en especifico, pueda acceder a los métodos o atributos de la misma.
- Protegido: este nivel permite que se acceda a los atributos o métodos de una clase solo sí se esta en el mismo nivel de jerarquía.
