¿Bajo qué circunstancias deberíamos hacer que un constructor de clase sea privado? [duplicate]

4 minutos de lectura

avatar de usuario
aficionado a la tecnología

Posible duplicado:

En una clase PHP5, ¿cuándo se llama a un constructor privado?

Estuve leyendo sobre programación orientada a objetos recientemente y me encontré con este escenario de constructor privado. Hice una búsqueda en Google, pero no pude encontrar nada relevante para PHP.

En PHP

  • ¿Cuándo tenemos que definir un constructor privado?
  • ¿Cuál es el propósito de usar un constructor privado?
  • ¿Cuáles son los pros y los contras de usar un constructor privado?

  • Esta pregunta demuestra un escenario en el que podría querer esto: en una clase PHP5, ¿cuándo se llama a un constructor privado?

    – DCoder

    23 de septiembre de 2012 a las 14:31


  • Es privado constructor. Cambia tu búsqueda y deberías encontrar lo que necesitas.

    – Jason McCreary

    23 de septiembre de 2012 a las 14:33

  • ¿Puede agregar algún enlace o descripción del término? “escenario de contratista privado” ¿representa? También en el título pides Constructor, pero luego en la pregunta hablas de Contratista Privado.

    – hakré

    23 de septiembre de 2012 a las 16:06

  • En el título pregunto específicamente “Cuándo debemos hacer que el constructor sea privado”. Contiene la palabra “constructor privado”.

    – Aficionado a la tecnología

    23 de septiembre de 2012 a las 16:12


avatar de usuario
benmorel

Hay varios escenarios en los que es posible que desee que su constructor sea privado. La razón común es que, en algunos casos, no desea que el código externo llame a su constructor directamente, sino que lo obligue a usar otro método para obtener una instancia de su clase.

patrón único

Solo desea que exista una única instancia de su clase:

class Singleton
{
    private static $instance = null;

    private function __construct()
    {
    }

    public static function getInstance()
    {
        if (self::$instance === null) {
            self::$instance = new self();
        }

        return self::$instance;
    }
}

método de fábrica

Desea proporcionar varios métodos para crear una instancia de su clase y/o desea controlar la forma en que se crean sus instancias, porque se necesita cierto conocimiento interno del constructor para llamarlo correctamente:

class Decimal
{
    private $value; // constraint: a non-empty string of digits
    private $scale; // constraint: an integer >= 0

    private function __construct($value, $scale = 0)
    {
        // Value and scale are expected to be validated here.
        // Because the constructor is private, it can only be called from within the class,
        // so we can avoid to perform validation at this step, and just trust the caller.

        $this->value = $value;
        $this->scale = $scale;
    }

    public static function zero()
    {
        return new self('0');
    }

    public static function fromString($string)
    {
        // Perform sanity checks on the string, and compute the value & scale

        // ...

        return new self($value, $scale);
    }
}

Ejemplo simplificado de la BigDecimal implementación de ladrillo/matemáticas

  • El enfoque de fábrica también es útil si desea prevenir no se cree una instancia de un objeto, por ejemplo, si faltan uno o más parámetros, puede devolver un valor nulo en lugar de un objeto no válido/en lugar de generar excepciones.

    – Óptimos

    25 mayo 2018 a las 17:48

avatar de usuario
baba

¿Cuándo tenemos que definir un constructor privado?

class smt 
{
    private static $instance;
    private function __construct() {
    }
    public static function get_instance() {
        {
            if (! self::$instance)
                self::$instance = new smt();
            return self::$instance;
        }
    }
}

¿Cuál es el propósito de usar un constructor privado?

Asegura que solo puede haber una instancia de una clase y proporciona un punto de acceso global a esa instancia y esto es común con The Singleton Pattern.

¿Cuáles son los pros y los contras de usar un constructor privado?

  • ¿Son realmente tan malos los Singleton?

  • ¿Qué tienen de malo los singletons?

avatar de usuario
onda de luna99

El constructor privado se utiliza principalmente en patrón únicoen el que no desea que se cree una instancia de su clase directamente, pero desea acceder a ella a través de su getInstance() método.

Así estás seguro de que nadie puede llamar __construct() fuera de la clase misma.

  • Debes mencionar que no es recomendable.

    – El fantasma de Madara

    23 de septiembre de 2012 a las 14:44

El constructor privado se utiliza en dos condiciones.

  1. Cuando se usa un patrón Singleton En este caso, solo hay un objeto y el objeto será creado generalmente por un getInstance() función
  2. Cuando se utiliza una función de fábrica para generar objetos. En este caso, habrá varios objetos, pero el objeto se creará mediante una función estática, por ejemplo.

    $token = Token::generar();

Esto generará un nuevo objeto Token.

Los constructores privados están aquí para implementar el patrón singleton la mayor parte del tiempo o si desea forzar una fábrica. Este patrón es útil cuando desea asegurarse de tener solo una instancia del objeto. se implementa así:

class SingletonClass{
    private static $instance=null;
    private function __construct(){}

    public static function getInstance(){
        if(self::$instance === null){
            self::$instance = new self; 

        }
        return self::$instance;
}

¿Ha sido útil esta solución?