POO: Nesta clase falta algo

PHP No Comments »

O definir unha clase podemos deixar métodos sen definir, que se chaman métodos abstractos. Pois unha clase que ten métodos abstractos é unha clase abstracta.

E cal é a utilidade dunha clase que ten métodos sen definir, pois que sexan definidos con ese nome e eses parámetros nas clases que herdan da clase dada.

Para definir un método como abstracto debe levar a palabra reservada abstract antes da visibilidade do método e non ter definido o seu funcionamento (non levar chaves {} nin código). E se un método é abstracto, a clase será abstracto e terá que levar diante da palabra class a palabra abstract (abstract class nome_clase).

abstract class claseAbstracta
{
    abstract function metodoBaleiro();
}

class claseFilla extends claseAbstracta
{
    function metodoBaleiro() {
    }
}

Hai que ter en conta varias cousas:

  • Unha clase filla ten que definir todos os métodos abstractos da clase da que herda (clase pai), de xeito obligatorio
  • Os métodos abstractos, na súa definición na clase filla, teñen que ter unha visibilidade superior ou igual a indicada na clase pai, e dicir, se na clase pai se definiu o método abstracto como protexido, na definición na clase filla o método pode ser protexido, tamen público (maís visibilidade) pero non privado.
  • Non se poden instanciar obxetos dunha clase abstracta (porque ten métodos que non están definidos)
  • POO: Imos herdar algo

    PHP No Comments »

    Outro concepto, o da herdanza. Unha clase pode herdar doutra (a que chamaremos clase pai para entendernos), o que significa que as propiedades e métodos públicos e protexidos da clase pai pasan a estar dispoñibles na clase que herda (a que chamaremos clase filla). Esto quere dicir, que todas as propiedades públicas e protexidas que teña a clase pai, tamén as ten a clase filla, aínda que non foran definidas; e o mesmo pasa cos métodos da clase pai, que se poderán empregar na clase filla, como se os definísemos nela.

    Para que unha clase herde dunha existente na definición da clase e despois do seu nome hai que poñer a palabra reservada extends e o nome da clase pai.

    class clasePai
    {
        public $publica = 'Publica';
        protected $protexida = 'Protexida';
        private $privada = 'Privada';
    
        static function metodoBaleiro(){
    			echo 'Baleiro';
        }
    }
    
    class claseFilla extends clasePai
    {
    		function imprimirPropiedades() {
    			echo $this->publica;   // Herdada da clasePai
    			echo $this->protexida; // Herdada da clasePai
    		}
    }
    
    $obxeto2 = new claseFilla();
    $obxeto2->metodoBaleiro(); 	 // Herdado da clasePai
    $obxeto2->imprimirPropiedades();
    

    Na clase filla podense redeclarar propiedades ou métodos, e dicir, pódense volver a definir. Nese caso na clase filla empregaranse as propiedades ou métodos ahí definidos e non os da clase pai.

    Se nun método creado na clase filla, se quere chamar a algún método da clase pai faise mediante a palabra reservada parent::

    Cando se executa o constructor da clase filla (o crear – instanciar obxetos da clase filla) non se executa de xeito automático o constructor da clase pai. Se queremos que si se execute incluirase no código do constructor da clase filla unha chamada o constructor da clase pai ( parent::__construct() )

    En PHP unha clase só pode herdar dun clase, e dicir unha clase só pode ter unha clase pai, non se admite a herdanza multiple.

    POO: Accedendo ao pai e ao fillo

    PHP No Comments »

    Hai situacións nas que no interior dunha clase quérese acceder a métodos ou propiedades desa mesma clase ou da clase pai (da que herdou). Para isto temos unha serie de palabras reservadas:

  • $this: Cando no código dunha clase se quere facer unha referencia a unha propiedade non estática ou a un método non estático desa mesma clase emprégase a palabra reservada $this seguida dunha frecha -> e o nome da propiedade sen o $, ou o nome do método.
    class clasePai
    {
        public $publica = 'Publica';
        protected $protexida = 'Protexida';
        private $privada = 'Privada';
    
        function imprimirPropiedades()
        {
            echo $this->publica;
            echo $this->protexida;
            echo $this->privada;
            $this->metodoBaleiro();
        }
    
        function metodoBaleiro(){
    			echo "Baleiro";
        }
    }
    $obxeto1 = new clasePai();
    $obxeto1->imprimirPropiedades();
    
  • self: Cando no código dunha clase se quere facer unha referencia a unha propiedade estática ou a un método estático desa mesma clase emprégase a palabra reservada self seguida do operador :: e o nome da propiedade ou do método. Tamén se pode empregar en lugar da palabra self o propio nome da clase
    class clasePai
    {
        public static $publica = 'Publica';
        protected static $protexida = 'Protexida';
        private static $privada = 'Privada';
    
        function imprimirPropiedades()
        {
            echo self::$publica;
            echo clasePai::$protexida;
            echo self::$privada;
            self::metodoBaleiro();
            clasePai::metodoBaleiro();
        }
    
        static function metodoBaleiro(){
    			echo "Baleiro";
        }
    }
    $obxeto1 = new clasePai();
    $obxeto1->imprimirPropiedades();
    
  • parent:Cando no código dunha clase se quere facer unha referencia a unha propiedade estática ou a un método estático da clase pai (da que herdou a actual) emprégase a palabra reservada parent seguida do operador :: e o nome da propiedade ou do método. Tamén se pode empregar en lugar da palabra parent o propio nome da clase pai
    class claseFilla extends clasePai
    {
    
        function imprimirPropiedades()
        {
            echo parent::$publica;
            echo parent::$protexida;
            echo clasePai::$protexida;
            parent::metodoBaleiro();
            clasePai::metodoBaleiro();
        }
    }
    
    $obxeto2 = new claseFilla();
    $obxeto2->imprimirPropiedades();
    
  • POO: O que se pode ver e o que non – visibilidade

    PHP No Comments »

    Un concepto importante na programación orientada a obxetos é o da visibilidade de propiedades e métodos. A visibilidade fai referencia ao lugar onde se poden empregar ou non as propiedades e métodos definidos nunha clase. Temos tres modificadores de visibilidade:

  • public: visibilidade pública, que significa que as propiedades e métodos pódense empregar tanto dende o interior da clase onde se definen, como desde o interior de clases que herden destas, como dende o código onde se creen obxetos desa clase
  • protected: visibilidade protexida, que significa que as propiedades e métodos pódense empregar tanto dende o interior da clase onde se definen, como desde o interior de clases que herden destas, pero NON dende o código onde se creen obxetos desa clase
  • private: visibilidade privada, que significa que as propiedades e métodos pódense empregar SO dende o interior da clase onde se definen
  • class clasePai
    {
        public $publica = 'Publica';
        protected $protexida = 'Protexida;
        private $privada = 'Privada';
    
        function imprimirPropiedades()
        {
            echo $this->publica;
            echo $this->protexida;
            echo $this->privada;
        }
    }
    
    $obxeto1 = new clasePai();
    echo $obxeto1->publica;     // Funciona
    echo $obxeto1->protexida;  // Produce un fatal error
    echo $obxeto1->privada;    // Produce un fatal error
    $obxeto1->imprimirPropiedades(); // Funciona
    

    Como se pode ver, as tres propiedades son accesibles dende un método dentro da propia clase (imprimirPropiedades), sexa cal sexa a súa visibilidade, pero só a propiedade pública é accesible dende o código onde se crea o obxeto ($obxeto1->publica), nin a protexida nin a privada son accesibles (de feito producen un fatal error se se tenta).

    class claseFilla extends clasePai
    {
        function imprimirPropiedades()
        {
            echo $this->publica;
            echo $this->protexida;
            echo $this->privada;
        }
    }
    
    $obxeto2 = new claseFilla();
    echo $obxeto2->publica;    // Funciona
    echo $obxeto2->protexida; // Produce un fatal error
    echo $obxeto2->privada;    // Produce un fatal error
    $obxeto2->imprimirPropiedades();   // Funciona e amosa a variable publica e a protexida herdadas da clasePai
    

    A claseFilla é unha clase que herda da clasePai, e que polo tanto herda tanto as propiedades e métodos públicos como os protexidos, non así os privados que non son accesibles dende a claseFilla. No código anterior, o método imprimirPropiedades da claseFilla pode acceder as propiedades publica e protexida herdadas da clasePai, pero non a propiedade privada que non existe porque non se herdou (non produce erro, simplemente non está definida).

    A visibilidade para os métodos é similar ao visto para as propiedades.

    Cando non se establece visibilidade para propiedades ou métodos, a visibilidade e pública (a visibilidade por defecto é public).

    POO: Constructores e destructores

    PHP No Comments »

    Na teoría da POO, chámase constructor a un método que se executa cando se crea un obxeto da clase, e destructor a un método que se executa cando se destrúe un obxeto da clase.

    A finalidade dun constructor é inicializar propiedades, abrir conexións a recursos a empregar na clase, … , e calquera outra operación que sexa necesario realizar antes de empregar os métodos dun obxeto desa clase. E a do destructor e a de cerrar conexión a recursos, ou recuros empregados na clase, ou calquera outra operación que sexa necesario facer antes de que o obxeto desapareza.

    En PHP5 o método constructor será aquel que teña por nome __construct e o destructor aquel que teña por nome __destruct.

    En PHP4 o constructor tiña por nome o nome da clase, pero cando se tiña que cambiar o nome da clase, tíñase que cambiar tamén o nome do constructor, por isto, en PHP5 cambiouse o nome dos constructores a un estandar para todas as clases (__construct). Por razóns se compatibilidade con versións anteriores, se non existe un constructor chamado __construct PHP busca un co nome da clase.

    A definición do constructor ou do destructor é como a de calquera outro método (so tendo en conta a limitación no nome).

    class unhaClase {
        public function __construct() {
          echo "Construíndo";
        }
        public function __destruct() {
          echo "Destruíndo";
        }
    }
    $obxeto1 = new unhaClase();
    

    Como se dixo antes, se non se atopa o constructor __construct, buscase un como nome da clase, polo que isto, aínda que non se recomenda o seu uso, por compatibilidade funciona:

    class unhaClase {
        public function unhaClase() {
          echo "Construíndo 2";
        }
    }
    $obxeto1 = new unhaClase();
    

    E unha clase que teña un constructor versión PHP5 e un versión PHP4 tamén funciona aínda que so se empregará en PHP5 o constructor __construct.

    class unhaClase {
        public function __construct() {
          echo "Construíndo";
        }
        public function unhaClase() {
          echo "Construíndo 2";
        }
    }
    $obxeto1 = new unhaClase();
    

    So se pode ter un método constructor. Se se queren ter varios, por cuestións de número e tipo de parámetros, hai que ter un só, sen parámetros, e no código do constructor identificar o número e tipo de parámetros segundo interese. Ter varios constructores produce un erro (non se pode redeclarar un método dentro da mesma clase).

    class unhaClase {
        public function __construct() {
          echo "Construíndo con ";
          echo func_num_args()." parámetros: ";
          foreach (func_get_args() as $param)
    	echo $param. ", ";
        }
    }
    $obxeto1 = new unhaClase();
    $obxeto2 = new unhaClase(1);
    $obxeto3 = new unhaClase(1,2);
    

    POO: Como empregar propiedades e métodos estáticos

    PHP No Comments »

    A idea de que unha propiedade sexa estática é que comparte valores para todos os obxetos da clase, ou dito doutro xeito, o seu valor non depende do obxeto concreto, senon que é o mesmo para toda a clase, polo que non fai falla ter un obxeto para poder acceder o seu valor (chega con coñecer o nome da clase).

    Dito isto, se temos esta clase, e facemos os seguintes accesos :

    class unhaClase {
        public $propiedade1 = 10;
        public static $propiedade2 = 20;
    }
    
    $obxeto1 = new unhaClase();
    echo $obxeto1->propiedade1; // Funciona ben
    echo $obxeto1->propiedade2; // Non funciona - Notice
    echo unhaClase::$propiedade1; // Non funciona - Fatal error
    echo unhaClase::$propiedade2; // Funciona ben
    

    Temos que debemos acceder a propiedade a través dun obxeto se esta non é estatica, e a través do nome da clase se é estatica. Se sendo estática, accedemos a través dun obxeto, non produce un erro (so un notice), pero non funciona ben. Se accedemos a unha propiedade non estática a través do nome da clase, producese un fatal error e non segue a execución (pois PHP necesita coñecer o obxeto concreto para saber o valor da propiedade, que non é igual para todos os obxetos da clase).

    A idea de que un método sexa estático, é que non depende das propiedades dun obxeto, é dicir, que é mais ben como unha función.

    Seguindo coa mesma clase e accedendo aos seus métodos:

    class unhaClase {
        public $propiedade1 = 10;
        public static $propiedade2 = 20;
    
        public function metodo1() {
          echo "Metodo 1";
        }
        public static function metodo2() {
          echo "Metodo 2";
        }
        public function metodo3() {
          echo $this->propiedade1;
        }
    }
    
    $obxeto1 = new unhaClase();
    $obxeto1->metodo1();   // Funciona ben
    $obxeto1->metodo2();   // Funciona ben
    $obxeto1->metodo3();  // Funciona ben
    
    unhaClase::metodo1();  // Funciona ben
    unhaClase::metodo2();  // Funciona ben
    unhaClase::metodo3();  // Non funciona - Fatal error
    

    Se accedemos os métodos a través dun obxeto, funcionan ben sexan estáticos ou non. Se accedemos a estes mesmos métodos a través do nome da clase, funcionaran ben se están declarados como estáticos e o son, como no caso de metodo2, ou se non están declarados como estáticos pero si o son (é dicir, se non depende de propiedades non estáticas do obxeto ou de métodos non estáticos do obxeto, ou dito doutra forma, se no seu código non se fai referencia a $this), como no caso de metodo1, pero producirase un fatal error, se non son estáticos, como no caso de metodo3.

    POO: Propiedades constantes

    PHP No Comments »

    Nunha clase podense definir propiedades que sexan constantes, é dicir, que o seu valor non cambie nunca. Para elo emprégase a palabra reservada const e definense do seguinte xeito.

    Primeiro a palabra reservada const, seguida do nome da constante (que non leva $ e segue as mesmas normas de nomeamento que as constantes PHP), o operadores de asignación e o valor asiganado a dita constante.

    class unhaClase {
    	const constante1 = "cadea";
    	const constante2 = 5;
    	const constante3 = TRUE;
    }
    

    Hai que ter en conta:

  • As constantes non levan o modificador de visibilidade, son públicas
  • As constantes non levan o modificar static (pois xa son estáticas e teñen o mesmo valor para todos os obxetos desa clase)
  • Accedese a elas, como a unha propiedade estática da clase, é dicir, polo nome da clase seguido do símbolo :: e o nome da constante

    echo unhaClase::constante1;  // Imprime cadea
    

    POO: Os métodos dunha clase

    PHP No Comments »

    Os métodos dunha clase, representan as operacións que se poden facer sobre obxetos desa clase. Son similares as funcións (de feito defínense igual), e teñen acceso as propiedades da clase, e dos obxetos desa clase.

    Para definir un método o primeiro que hai que indicar é a súa visibilidade (public, protected ou pirvate), e no caso de que non se indique entenderase que é publica (public). Definir un método como público significa que é visible dende fora da propia clase, é dicir, que cando instanciemos un obxeto, podemos chamar ese método. Se se define como protexido (protected), ese método é accesible só dende dentro da propia clase (e dicir pode ser chamado dende o código doutros métodos da mesma clase), e dende outras clases que herden (dende o código de métodos doutras clases que herden desta), é dicir, non podemos chamar a ese método dende un obxeto, pero si o poden facer métodos dese obxeto ou doutros obxetos que sexan de clases que herdaron da anterior.

    Despois da visibilidade vai se o método é estático ou non (que se define coa palabra reservada static no caso de que sexa estático e sen poñer nada noutro caso). Que sexa estático significa que se pode chamar sen instanciar unha clase, é dicir, que non emprega propiedades do obxeto (que dependen dun obxeto concreto) e polo tanto funciona como unah función normal.

    Despois da visibilidade ven a palabra reservada function, o nome do método, que segue as mesmas normas que os nomes das funcións, e a lista de parámetros do método (se os ten), que se definen igual que os dunha función.

    class unhaClase {
        public function metodo1() {
          // Codigo do método
        }
        protected static function metodo2($parametro) {
          // Codigo do método
        }
        private final static function metodo3($parametro) {
          // Codigo do método
        }
        protected  static final  function metodo4($parametro1, $parametro2) {
          // Codigo do método
        }
    }
    

    Podese empregar o modificar final (antes da palabra reservada function) para indicar que o método é final, é dicir, que non pode ser sobreescrito (volto a definir) por unha clase que herde desta. É o xeito de evitar que con clases que herden da que fixemos nós, cambien o código dun dos nosos métodos.

    POO: As propiedades dunha clase

    PHP No Comments »

    As propiedades dunha clase gardan o estado e as características do obxeto. En realidade son variables que gardan valores: e poden ser públicas, protexidas ou privadas, estáticas ou dinámicas e incluso constantes.

    Para definir unha propiedade o primeiro que hai que indicar será a súa visibilidade (public, protected ou private), e no caso de que non se indique entenderase que é publica (public). Definir unha propiedade como pública significa que é visible dende fora da propia clase, é dicir, que cando instanciemos un obxeto, podemos acceder directamente a esa propiedade. Se se define como protexida (protected), esa propiedade é accesible só dende dentro da propia clase, e dende outras clases que herden, é dicir, non podemos acceder directamente a esa propiedade cando instanciemos un obxeto, pero si poden acceder métodos dese obxeto ou doutros obxetos que sexan de clases que herdaron da anterior.

    Despois da visibilidade vai se a propiedade é estática ou non (que se define coa palabra reservada static no caso de que sexa estática e sen poñer nada noutro caso). Que sexa estática significa que comparte valor para todos os obxetos desa clase, é dicir, que se se modifica o seu valor nun obxeto instancia desa clase, modificase o seu valor nos outros obxetos instancia desa mesma clase.

    Despois de se é estática ou non, vai o nome da propiedade, que se define coas mesmas regras que as de definición das variables.

    E opcionalmente, por último, se ten asignado un valor inicial, asígnaselle, co operador de asignación igual seguido do valor. Recordar que só se poden asignar valores constantes (de tipos escalares ou arrays) á propiedades na súa definición. Non se poden asignar nin variables, nin métodos de clases, nin funcións.

    class unhaClase {
        public $propiedade1 ;
        protected static $propiedade2;
        private $propiedade3 = 5;
        public $propiedade4 = "cadea";
        protected $propiedade5 = TRUE;
    }
    

    Coas propiedades non se pode empregar o modificar final (so se pode empregar con métodos e clases).

    POO: Como empregar unha clase, instanciando obxetos

    PHP No Comments »

    Para empregar unha clase (para empregar ese molde) temos que instanciar un obxeto de dita clase (empregar o molde para facer un obxeto con ese molde). Para instanciar un obxeto emprégase a palabra reserva new seguida do nome da clase e os parámetros que se pasen ao constructor de dita clase (se os ten). new devolve unha referencia a un obxeto da clase instanciada, que poderemos gardar nunha variable.

      $obxeto = new unhaClase();
    

    Recordar que en PHP5 os obxetos, a diferenza doutros tipos de datos, empréganse por referencia, o que quere decir, que si asignamos este obxeto a outra varibale, en troques de facerse unha copia do dato, e gardala na nova variable, a nova variable apuntará ao mesmo dato (neste caso un obxeto) que a máis antiga.

     $obxeto1 = new unhaClase();
     $obxeto2 = $obxeto1; //Os dous obxetos son o mesmo, e cambios nunha variable afectan á outra.
    

    Deseñado por Norick - WPMU Theme pack by WPMU-DEV.
    Entries RSS Comments RSS Iniciar sesión