Salta el contingut

POO: Programació Orientada a Objectes

Per què objectes?

La POO és un paradigma(tècnica) de la programació que utilitza objectes per al seu desenvolupament. Permet entre altres coses una millor reutilització i consistència del codi.

Ara bé, això requereix un aprenentatge de com desenvolupar aquesta arquitectura.

A més dona una seguretat als desenvolupadors en la generació de codi que ha desenvolupat i publicat una altra persona.

Elements de la POO

Elements base d'una POO són les classes i els objectes.

Classe

Una classe és un model abstracte que s'utilitza per englobar propietats i mètodes i que comparteixen un mateix comportament.

Per exemple

Classe persona
    Propietats:
        - Nom
        - Cognoms
        - Data Naixement
    Mètodes:
        - Edat

Objecte

Un objecte serà una instància d'aquesta classe i serà la que usarem per a desenvolupar.

D'alguna manera l'objecte és la variable de tipus classe en php.

<?php
    $persona = new Persona();
?>

Mètode

Un mètode serà una de les funcions que podrem cridar de l'objecte declarat.

<?php
    function Edat();
    {
     // ...
    }
?>

Esdeveniment i missatges

Un esdeveniment és un succés en el desenvolupament de l'aplicació.

Un missatge és la couminació del succés dirigida a l'objecte.

Propietats i atributs

Les propietats i atributs, són les variables que contenen dades associats a l'objecte

<?php
    $nom = "Mariona";
    $cognoms = "Li Vull";
    $dataneixament = "30/11/2001";
?>

Característiques conceptuals de POO

La POO té unes catacterístiques en el seu desenvolupament que l'identifiquen i sobretot diferencien d'altres paradigmes de la programació.

Per exemple:

Abstracció

Aillament d'un element del seu contexte. Defineix les caractarísitques esencials d'un objecte.

Encapsulament

Ajuntar en un mateix nivell d'abstracció, a tots els elements del mateix objecte: propietats i mètodes.

Modularitat

Característica que permet dividir una aplicació en diverses parts més petites (mòduls), independents una de l'altra.

Ocultació(Aïllament)

Els objctes estan aïllats de l'exterior (visibilitat), protegint a les seves propietats de no ser modificades per elements externs que no haurien de tenir accés.

Polimorfisme

Capacitat que es dona a diferents objectes, la possibilitat de poder tenir o usar amb propietats i mètodes d'igual nom, sense que un interferexi en l'altra. Això sobretot quan treballem amb herència.

Herència És la relació existent entre dues o més classes. On una és la principal (mare) i l'altra secundàries (filles) que hereden les propietats i mètodes.

Per exemple:

Tenim una classe Elements Propietats: Nom Ubicació

Tenim una classe Ordinador que hereda Elements Propietats: IP RAM

La classe ordinador podrà usar i accedir a les propietats nom i ubicació per herència.

Com ho fem amb PHP

Manual oficial de PHP

Usarem la paraula clau 'class' per definir el nom d'una classe. Recordem que una classe és com si fos la definició del tipus que usarem per definir l'objecte.

<?php
    class NomClasse
    {
        // ...
    }
?>

Notació CamelCase

Utilitzarem la regla de CamelCase, on paraules compostes eliminant els espais i posant en majúscula la primera lletra de cada paraula. El nom ve de la semblança d'aquestes majúscules, entre les altres lletres, amb els geps d'un camell.

Exemple: NomPersona

Declaració d'una classe abstracta

Una classe abstracta és aquella que no cal que la instanciem a un objecte. Però si que podrem heredar-les en algun moment.

Ho fem afegint al davant abstract

<?php
    abstract class NomClasseAbstracta
    {
        // ...
    }
?>

Aquest tipus de classes serà la que tindrà mètodes abstractes i servirà per declarar classes genèriques.

nota

Les classes genèriques les farem servir per heredar propietats i mètodes abstractes genèrics a les classes que l'hereta.

Herència de classes

Els objectes poden heretar propietats i mètodes d'altres objectes.

Per això tenim el concepte d'herència de classes. Podrem definir una classe com a extensió d'una classe mare que utilitza la paraula clau 'extends'

<?php
    class NomClasseFilla extends NomClasseMare
    {
        // heredem les propietats i mètodes de NomClasseMare
    }
?>

Declaració de classes finals

Una classe final no pot ser heredada per una altra.

Es defineix amb final

<?php
    final class NomClasseAbstracta
    {
        // Aquesta classe no podrà ser heradada
    }
?>

Per tant, si volem definir i usar una classe:

Instanciable (declarada o heredada) class Crear una classe que podem declarar un objecte o pugui ser heredada
Abstracta abstract Crear una classe que només serà model d'una altra classe i no podrà ser instanciada
Heredada extends Crear una classe que podem heredar a una altra classe filla
final final Crear una classe que podem declarar un objecte i no pugui ser heredada per cap altra classe

Instanciar o declarar un objecte d'una classe

Per crear una instancia d'una classe hem de fer servir new.

L'objecte que declarem serà la variable de tipus classe que definim. Cal declarar la classe primer i llavors l'objecte.

<?php
    class Persona
    {
        // ...
    }

    //creem l'objecte(variable) de la classe Persona
    $persona = new Persona();
?>

Note

Al definir la variable objecte de la classe Persona, usem Persona(), això activarà al constructor que li podrem enviar paràmetres, que observarem més endavant.

Propietats

Les propietats representen característiques del mateix objecte.

Les definim usant la paraula var davant del nom de la propietat.

<?php
     class Persona
    {
        // Propietats
        var $nom;
        var $cognoms;
        var $dataneixament;
    }
?>

La visibilitat de les propietats poden ser:

- Públiques: Podran ser accessibles des de qualsoval part de l'aplicació. Usarem `public`
- Privades: Només podran ser accessibles des de la classe que les ha definit. Usarem `private`
- Protegides: Només podran ser accessibles des de la classe que les ha definit i les que l'hereden. Usarem `protected`
- Estàtiques: El valor serà estàtic i podran ser accedides des fora la classe sense necessitat de ser declarat l'objecte. Usarem 'static`

Note

Les propietats estàtiques s'usen per exemple per definir una classe de connexió a la BdD i a on tenim les dades de la cadena de connexió.

class DadesConnexióBdD
{
    public static $usuari = "root";
    public static $pass = "1234";
}
<?php
     class Persona
    {
        // Propietats
        public $nom;
        public $cognoms;
        private $dataneixament;
        protected $ciutat;  
        public static $tipus = "Persona";
    }
?>

Accedir a les propietats

De manera bàsica i directe, des de dins la classe:

<?php
    class Persona
    {
        private $nom;

        $this->nom = "Carme";
    }
?>

Si la propietat és estàtica, usarem ::i la paraula clau self o parentsegons es tracta d'ella mateixa de la classe heredada:

<?php
    echo self::$tipus;
?>

Des de fora de la classe, de manera bàsica:

<?php
    $persona = new Persona();

    echo $persona->nom;
?>

Només podrem accedir a variable públiques i no estàtiques.

Per accedir a una variable pública i estàtica, ho fare directament, sense haver-la de declarar.

<?php
    echo Persona::$tipus;
?>

Mètodes

El mètode en una classe ens permetrà crear funcions per accedir a les propietats de manera segura i modificar, calcular, ... o aplicar una lògica que ens faci falta.

Per declarar un mètode usarem function.

<?php
     class Persona
    {
        // Propietats

        // Mètodes
        function Caminar()
        {
            // codi del mètode. Podrem accedir a les propietats.
        ]
    }
?>

Podem tenir paràmetres en la crida dels mètodes, a dins del parèntesis.

<?php
     class Persona
    {
        // Propietats
        private kms;

        // Mètodes
        function Caminar($km)
        {
            $this->kms = $this->kms + $km;
        ]
    }
?>

Públic, privat, protegit o estàtic

Igual que les propietats, els mètodes poden ser:

- públics: disponibles des de fora la classe
- privats: només accessibles des de dins la classe
- protegits: I podrà accedir si hi ha herència
- estàtics: si és públic no caldrà declarar un objecte per accedir-hi

Mètodes màgics

Tenim una llista de mètodes màgics que podem usar i que tenen una funcionalitat predefinida per PHP.

__construct()

Serà executat de manera automàtica al moment d'instanciar o declarar una variable objecte d'una classe.

La seva funcionalitat és la d'executar unes instruccions al moment de declarar-la i abans de ser utilitzada.

<?php
    class Pilota
    {

        var $color;
        var $pressio;

        public __construct()
        {
            $this->pressio=0;
        }
    }
?>

__destruct

S'executa quan es destrueix l'objecte. Això passa quan s'arriba al final de l'execució del PHP o bé es fa un unset(). Entre altres coses s'allibera memòria.

Es pot aprofitar per fer algunes tasques de l'estil desar informació a $_SESION[], guardar alguna cosa a la BdD o similar.

<?php
    class Pilota
    {

        var $color;
        var $pressio;

        public __destruct()
        {
            echo "destruim objecte!";
        }
    }
?>

Note

Podeu trobar altres mètodes màgics que poden ser interessants:

mètodes màgics de PHP