2011-07-06 20 views
6

¿Cómo puedo instanciar una clase que está teniendo constructor privado.?¿Cómo puedo instanciar una clase que está teniendo constructor privado

No quiero usar ninguna función dentro de la clase para crear su propia instancia.

clase Ex es:

class Test extends Test2 implements Test3 { 
    private function __construct() { 
    } 

    function doDisplay() { 
    } 

    function Docall() { 
    } 
} 
+0

Um, ¿por qué etiquetó este C++? – BoltClock

+0

Acabo de usar porque OOP no es patente con ningún lenguaje de programación. – Sahal

+2

Diferentes idiomas implementan OOP de forma diferente, y no hay S en OOP. – BoltClock

Respuesta

5

No se puede crear una instancia de un objeto de una clase cuyo constructor es private (fuera del plan de estudios).

Si tiene la intención de utilizar su función, debe tenerlos como static y utilizarlos para satisfacer sus necesidades. Asegúrate de que la función sea pública.

Por ejemplo:

<?php 

class something 
{ 
    private function __construct() 
    { 
     echo "something"; 
    } 

    public static function display($msg) 
    { 
     echo $msg; 
    } 
} 

something::display("Testing..."); 

?> 

Véase el ejemplo de trabajo: http://codepad.org/VoYeyk8W

+1

Aquí creo que no estamos creando una instancia de clase, no es posible crear instancias –

+2

Exactamente, ese es el punto aquí, no se puede instanciar una clase, pero aún se puede llamar a un método 'estático'. –

6

Usted no puede invocar un constructor privado desde cualquier lugar, pero dentro de la propia clase, por lo que tiene utilizar un método estático accesible externamente para crear instancias.

Además, si Test2 tiene un constructor que no es privado, no puede hacer que Test::__construct() sea privado.

+0

Por qué quería hacer esto es porque, quería crear objetos solo en alguna fábrica. No quiero que otros creen objetos directamente para esta clase. ¿Hay alguna otra forma en que pueda manejar esto? – Sahal

+0

Bueno, las clases siempre son accesibles globalmente en PHP donde las incluyas. Puede tener un constructor público que acepte la fábrica como argumento, y si no es el objeto de fábrica que lo crea, genere una excepción. – BoltClock

0

Bueno, si no quieres utilizar un método (estático) dentro de la clase para crear una instancia supongo que la respuesta a tu pregunta simplemente es: no puedes.

1

Quien diseñó esta clase no quiere que instales una directamente, no puedes hacer lo que quieres hacer. Lo más probable es que el autor original tuviera una buena razón para hacer esto, tal vez era la gestión de memoria o quería controlar el ciclo de vida o detener los problemas con el enhebrado, podría haber muchas razones.

La única respuesta obvia es reescribir las fuentes para que funcionen de la manera que desee en lugar de intentar entrar en el diseño de otra persona. O podrías construir un contenedor alrededor de esta clase que oculte la parte que no te gusta para que el resto del código no tenga que saberlo.

+0

¿Puede explicarme cómo se relaciona con la gestión de la memoria y el pisado? – Sahal

1

Usted puede instanciar que utilizan la reflexión (PHP> = 5,4)

class Test { 

    private $a; 

    private function __construct($a) 
    { 
     $this->a = $a; 
    } 
} 

$class = new ReflectionClass(Test::class); 
$constructor = $class->getConstructor(); 
$constructor->setAccessible(true); 
$object = $class->newInstanceWithoutConstructor(); 
$constructor->invoke($object, 1); 

Funciona, pero hay que tener en cuenta que este no era un uso para el que se diseñó la clase, y que podría tener algunos efectos secundarios imprevistos.

+0

Buen truco con la reflexión. Esta respuesta debe ser aceptada. – user1636505

Cuestiones relacionadas