tipos metodos example clases php design-patterns oop static

metodos - static php



¿Es posible crear clases estáticas en PHP(como en C#)? (6)

Además de la respuesta de Greg, recomendaría establecer el constructor en privado para que sea imposible crear una instancia de la clase.

Entonces, en mi humilde opinión, este es un ejemplo más completo basado en el de Greg:

<?php class Hello { /** * Construct won''t be called inside this class and is uncallable from * the outside. This prevents instantiating this class. * This is by purpose, because we want a static class. */ private function __construct() {} private static $greeting = ''Hello''; private static $initialized = false; private static function initialize() { if (self::$initialized) return; self::$greeting .= '' There!''; self::$initialized = true; } public static function greet() { self::initialize(); echo self::$greeting; } } Hello::greet(); // Hello There! ?>

Quiero crear una clase estática en PHP y hacer que se comporte como lo hace en C #, entonces

  1. Se llama automáticamente a Constructor en la primera llamada a la clase
  2. No se requiere creación de instancias

Algo de este tipo ...

static class Hello { private static $greeting = ''Hello''; private __construct() { $greeting .= '' There!''; } public static greet(){ echo $greeting; } } Hello::greet(); // Hello There!


Generalmente prefiero escribir clases regulares no estáticas y usar una clase de fábrica para instanciar instancias únicas (sudo estáticas) del objeto.

De esta manera constructor y destructor funcionan como de costumbre, y puedo crear instancias adicionales no estáticas si lo deseo (por ejemplo, una segunda conexión de base de datos)

Utilizo esto todo el tiempo y es especialmente útil para crear manejadores personalizados de sesión en el almacén de bases de datos, ya que cuando la página finaliza, el destructor envía la sesión a la base de datos.

Otra ventaja es que puede ignorar el orden al que llama cosas, ya que todo se configurará según demanda.

class Factory { static function &getDB ($construct_params = null) { static $instance; if( ! is_object($instance) ) { include_once("clsDB.php"); $instance = new clsDB($construct_params); // constructor will be called } return $instance; } }

La clase DB ...

class clsDB { $regular_public_variables = "whatever"; function __construct($construct_params) {...} function __destruct() {...} function getvar() { return $this->regular_public_variables; } }

En cualquier lugar que desee usar, simplemente llame ...

$static_instance = &Factory::getDB($somekickoff);

Entonces simplemente trate todos los métodos como no estáticos (porque lo son)

echo $static_instance->getvar();


Puedes tener clases estáticas en PHP pero no llaman al constructor automáticamente (si tratas de llamar a self::__construct() obtendrás un error).

Por lo tanto, debería crear una función initialize() y llamarla en cada método:

<?php class Hello { private static $greeting = ''Hello''; private static $initialized = false; private static function initialize() { if (self::$initialized) return; self::$greeting .= '' There!''; self::$initialized = true; } public static function greet() { self::initialize(); echo self::$greeting; } } Hello::greet(); // Hello There! ?>


objeto no se puede definir estáticamente, pero esto funciona

final Class B{ static $var; static function init(){ self::$var = new A(); } B::init();


puedes tener esas clases "estáticas". pero supongo que falta algo importante: en php no tienes un ciclo de aplicación, por lo que no obtendrás ningún elemento estático real (o singleton) en toda tu aplicación ...

ver Singleton en PHP


final Class B{ static $staticVar; static function getA(){ self::$staticVar = New A; } }

la estructura de b se llama un controlador de Singeton también puede hacerlo en una

Class a{ static $instance; static function getA(...){ if(!isset(self::$staticVar)){ self::$staticVar = New A(...); } return self::$staticVar; } }

este es el uso $a = a::getA(...);