venerdì, agosto 30, 2013

PHP - Passaggio di parametri


Questo post fa parte di una serie preparata qualche anno fa per delle lezioni su PHP.

Passaggio di parametri

Quando si richiama una funzione è possibile passarle dei parametri. Gli esempi che seguono possono essere applicati anche, ovviamente, alle funzioni membro delle classi.
Tutti gli esempi vengono presentati con il relativo test Lime, in modo da abituarsi all'idea dello Unit Testing, di cui abbiamo parlato.

Passaggio per valore

function foobar($a)
{
  $a++;
  return $a;
}

$t=new lime_test(1, new lime_output_color());
$t->is(foobar(5), 6, 'foobar() returns the value incremented by one');

Impostazione di un valore di default


function foobar($a=4)
{
  $a++;
  return $a;
}

$t=new lime_test(2, new lime_output_color());

$t->is(foobar(5), 6, 'foobar() returns the value incremented by one');
$t->is(foobar(), 5, 'foobar() takes 4 as default, and returns 5');

Controllo dei parametri


function foobar($a)
{
  if (!is_integer($a))
  {
    throw new Exception('Function foobar accepts only integers as parameter');
  }
  $a++;
  return $a;
}

$t=new lime_test(3, new lime_output_color());

$t->is(foobar(5), 6, 'foobar() returns the value incremented by one');
try
{
  $n=foobar('abc');
  $t->fail('foobar() does not throw an exception with a string parameter');
}
catch(Exception $e)
{
  $t->pass('foobar() throws an exception with a string parameter');
}

try
{
  $n=foobar(1.2);
  $t->fail('foobar() does not throw an exception with a float parameter');
}
catch(Exception $e)
{
  $t->pass('foobar() throws an exception with a float parameter');
}

Oggetti come parametri


Il controllo del tipo è automatico per gli oggetti, se si indica esplicitamente a che classe devono appartenere:

class BazBar
{
  private $v;
  public function __construct($v)
  {
    $this->v=$v;
  }
  public function getV()
  {
    return $this->v;
  }
  
  public function incV()
  {
    $this->v++;
    return $this;
  }
}

class ExtraBazBar extends BazBar
{
}

function foobar(BazBar $a)
{
  $a->incV();
  return $a->getV();
}

$t=new lime_test(2, new lime_output_color());

$t->is(foobar(new BazBar(5)), 6, 'foobar() accepts a BazBar object');

$t->is(foobar(new ExtraBazBar(5)), 6, 'foobar() accepts an ExtraBazBar object');

Array di parametri


function foobar($parameters=array())
{
  $v=$parameters['value']+$parameters['inc'];
  return $v;
}

$t=new lime_test(1, new lime_output_color());

$t->is(foobar(array('value'=>5, 'inc'=>1)), 6, 'foobar() accepts an array of parameters');

Passaggio per riferimento


function foobar(&$v)
{
  $v++;
  return $v;
}

$t=new lime_test(1, new lime_output_color());

$k=5;
foobar($k);
$t->is($k, 6, 'foobar() changes the value of the variable passed as parameter');

Altre cose utili


In alcuni casi potrebbe essere utile fare ricorso alle funzioni func_num_args()func_get_args(), ecc. Consultare le relative pagine del manuale.

Nessun commento:

Posta un commento