PHP bir sınıfa değişkenlerin değişken sayısını geçmek

6 Cevap php

Ben farklı sınıfları örneğini dizeleri bir değişken sayıda geçmesi gerekiyor. Ben her zaman dizinin boyutu üzerinde anahtarı yapabilirsiniz:

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

Bunu yapmak için daha iyi bir yolu olmalı. Ben dizeleri bir dizi ("variable1", "variable2", 'variable3 ", ...) varsa, nasıl el her olasılığı hesaba katmadan bir sınıf örneğini?

6 Cevap

Eğer bu şekilde yapmak gerekir, deneyebilirsiniz:

$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());
    }
}
// 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);
}

Nasıl kullanılır:

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

Düzenleme: Eğer $ a = dizi ile bu işlevi kullanmak istiyorsanız ("variable1", "variable2", 'variable3 ", ...)

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

Örneğin, sınıfa değişken değişken sayısını geçmek için bir dizi kullanabilirsiniz:

<?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);

 ?>

Output

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

Ayrıca kolayca bilgileri kaydetmek için __get and __set magic methods kullanabilirsiniz.

O yansıma sizin için şapkadan bu bir indirebiliriz görünüyor. Bu sizin için the PHP call_user_func_array notes nezaket geliyor. Aşağıdaki kodu dizinin içeriği ile kurucuyu çağırarak bir sınıf oluşturur.

<?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');

?>

Bakın here. Yöntem 2 yardım mı? Ayrıca, belki de kurucu anahtarı hareket ederek kodun geri kalanından bu gizlemek mümkün olacaktır (if bu pratik değildir).

Fabrika tasarım deseni de bakabilirsiniz:

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