2010-04-25 14 views
10

Necesito pasar un número variable de cadenas para instanciar diferentes clases. Siempre puedo hacer un cambio en el tamaño de la matriz:Pase el número de variable variable a una clase en PHP

switch(count($a)) { 
case 1: 
    new Class(${$a[0]}); 
    break; 
case 2: 
    new Class(${$a[0]}, ${$a[1]}); 
    break; 
etc... 

Tiene que haber una mejor manera de hacerlo. Si tengo una matriz de cadenas ("variable1", "variable2", 'variable3" , ...), ¿cómo puedo instanciar una clase sin tener en cuenta de forma manual para cada posibilidad?

Respuesta

3

Si tiene que hacerlo de esta manera, puede intentar:

$variable1 = 1; 
$variable2 = 2; 
$variable3 = 3; 
$variable4 = 4; 

$varNames = array('variable1', 'variable2', 'variable3', 'variable4'); 
$reflection = new ReflectionClass('A'); 
$myObject = $reflection->newInstanceArgs(compact($varNames)); 

class A 
{ 
    function A() 
    { 
     print_r(func_get_args()); 
    } 
} 
+0

Ah, eso es muy interesante. Eso es exactamente lo que estaba buscando. ¡Gracias a todos por su ayuda! – user325282

+0

De nada. Me alegro de poder ayudar. – webbiedave

1
<?php 

new Example($array); 

class Example 
{ 
    public function __construct() 
    { 
     foreach (func_get_args() as $arg) 
     { 
      // do stuff 
     } 
    } 
} 
+0

¿Por qué este downvoted? –

+1

-100, no lo hará, eso no es lo que OP está buscando. –

+0

Me parece que sí. –

-1

Look here. ¿El método 2 ayuda? También, tal vez moviendo el interruptor al constructor (si es que es práctico) usted podría ocultar esto del resto del código.

0

Puede usar una matriz para pasar el número variable de variable a la clase, por ejemplo:

<?php 

class test 
{ 
    private $myarray = array(); 

    function save($index, $value) 
    { 
     $this->myarray[$index] = $value; 
    } 

    function get($index) 
    { 
    echo $this->myarray[$index] . '<br />'; 
    } 
} 

$test = new test; 
$test->save('1', 'some value here 1'); 
$test->save('2', 'some value here 2'); 
$test->save('3', 'some value here 3'); 

$test->get(1); 
$test->get(2); 
$test->get(3); 

?> 

salida

some value here 1 
some value here 2 
some value here 3 

También es posible usar el __get and __set magic methods para guardar información fácilmente.

+0

¿por qué votar abajo ?????????????????????????? – Sarfraz

+1

No creo que la pregunta era cómo crear setters y getters ... –

+1

@byronh: También puede usar setter y getter para establecer un número variable de información para la recuperación posterior fácilmente. – Sarfraz

1
// Constructs an instance of a class with a variable number of parameters. 

function make() { // Params: classname, list of constructor params 
$args = func_get_args(); 
$classname = array_shift($args); 
$reflection = new ReflectionClass($classname); 
return $reflection->newInstanceArgs($args); 
} 

Modo de empleo:

$MyClass = make('MyClass', $string1, $string2, $string3); 

Editar: si desea utilizar esta función con el $ a = array ("variable1", "variable2", 'variable3" , ...)

call_user_func_array('make', array_merge(array('MyClass'), $a)); 
0

parece que la reflexión puede tirar de éste hacia fuera del sombrero para usted. esto viene a ti por cortesía de the PHP call_user_func_array notes. el siguiente código creará una clase llamando al constructor con el contenido de la matriz.

<?php 
// arguments you wish to pass to constructor of new object 
$args = array('a', 'b'); 

// class name of new object 
$className = 'ClassName'; 

// make a reflection object 
$reflectionObj = new ReflectionClass($className); 

// use Reflection to create a new instance, using the $args 
$command = $reflectionObj->newInstanceArgs($args); 
// this is the same as: new myCommand('a', 'b'); 

?> 
-1

echar un vistazo al patrón de diseño de fábrica:

class Factory { 
    public static function CreateInstance($args) { 
    switch(func_get_num_args()) { 
     case …: 
     return new ClassA(…); break; 
     case …: 
     return new ClassB(…); break; 
    } 
    } 
} 
Cuestiones relacionadas