Facebook Google+


'static' dentro de una funcion de php
#1
Buenas, alguien me podría indicar para que sirve colocar 'static' dentro de una función de php ? gracias amigos
 
Reply
#2
Es una palabra reservada, cuando se utiliza dentro de un método hace referencia a un atributo o método estático. 
    
Código PHP:
class Example {

    public static 
$attr 'value';

    public static function 
one() { echo static::two(); }

    public static function 
two() { return static::$attr; }

}

Example::one(); 
    
Similar a utilizar "self" o el nombre de la clase:
  
Código PHP:
public static function two() { return self::$attr; } 
  
Código PHP:
public static function two() { return Example::$attr; } 
[Imagen: 1489128820_fbsnVWR5Pg5WrzX.png]
 
Reply
#3
En funciones como tal, permite que la funcion "recuerde" el valor entre distintas llamadas, por ejemplo en la siguiente funcion no vuelvo a cargar y procesar el diccionario sino solo chequeo si la variable fue inicializada y con eso se que ya no tengo que repetir el proceso.

Código PHP:
    /*
        Singulariza un término en base a un diccionario    
    */
    
function singularize($word,$path_dict)
    {
        static 
$_singulars null;
        
        if (
$_singulars==null)
          
$_singulars process_ini($path_dict);              
                              
        
$found false;         
        foreach (
$_singulars as $row)
        {            
            if (
$word == $row['fields'][0]){
              
$nameucfirst($row['fields'][1]);
              
$found true;                           
              break;
            }
          
           if ((
$pos= @stripos($word$row['fields'][0],strlen($word) -strlen($row['fields'][0])))){                        
             
$tmp  ucfirst($word);
             
$name =  substr_replace($tmp,$row['fields'][1],$pos);
             
$found true;        
             break;
          }
        }  
        
        if (!
$found){          
          
$name =  no_ending_s(ucfirst($word));           
        }
        
        return 
$name;        
    } 
 
Reply
#4
(03-09-2017, 07:06 PM)master escribió: En funciones como tal, permite que la funcion "recuerde" el valor entre distintas llamadas, por ejemplo en la siguiente funcion no vuelvo a cargar y procesar el diccionario sino solo chequeo si la variable fue inicializada y con eso se que ya no tengo que repetir el proceso.
  
¡Buena @master! No conocía ese funcionamiento de static en funciones. En métodos de clase tiene menos sentido utilizarlo, pero en funciones me parece bastante útil.
[Imagen: 1489128820_fbsnVWR5Pg5WrzX.png]
 
Reply
#5
(03-09-2017, 07:42 PM)Josantonius escribió:
(03-09-2017, 07:06 PM)master escribió: En funciones como tal, permite que la funcion "recuerde" el valor entre distintas llamadas, por ejemplo en la siguiente funcion no vuelvo a cargar y procesar el diccionario sino solo chequeo si la variable fue inicializada y con eso se que ya no tengo que repetir el proceso.

  
¡Buena @master! No conocía ese funcionamiento de static en funciones. En métodos de clase tiene menos sentido utilizarlo, pero en funciones me parece bastante útil.

Je je ... primero lo aprendí en lenguaje "C" de un post de @MAFUS y se me ocurrió investigar y oh sorpresa en PHP es igual xD
 
Reply
#6
Estuve leyendo este hilo y todo es correcto. Solo me gustaría aclarar que static aun que pareciera funcionar igual que self, tiene un uso muy diferente, Static se calcula en tiempo de ejecución en cambio self es en tiempo de "compilación", por lo tanto el valor de self no cambiara, esto parace no tener mayor problema hasta que usas herencia ahí es cuando te das cuenta de la utilidad que tiene static.

Les pondre un ejemplo sencillo.

Código PHP:
class Record {
    
    protected static 
$tableName 'base';

    public static function 
getTableName() {
        return 
self::$tableName;
    }
}

class 
User extends Record {
    protected static 
$tableName 'users';
}

var_dump(User::getTableName());  // returns "base" 

Si se dan cuenta cuando llamo el método getTableName obtengo el valor establecido por la clase padre, y esto es lo que esperado debido a que self toma el valor de la clase padre en el momento en el que se interpreta el código, por lo cual no cambia cuando User invoca el método getTableName.

Este problema lo resuelves muy facil usando static

Código PHP:
class Record {
    
    protected static 
$tableName 'base';

    public static function 
getTableName() {
        return static::
$tableName;
    }
}

class 
User extends Record {
    protected static 
$tableName 'users';
}

var_dump(User::getTableName());  // returns "users" 

Usando static obtenemos el valor esparado ya que ahora se resolvio el nombre de la clase en tiempo de ejecución
Depend on abstractions, not on concretions.
Laraveles

 
 
Reply
#7
Realmente buen aporte companero! y muy interesante el ejemplo
 
Reply
  


Salto de foro:


Browsing: 1 invitado(s)