I am passing a variable by reference to a class method with the intention that it will be set to a member of that same class (based on a selector to the function). Although this doesn't appear to violate the rules of PHP's deprecated call-time pass-by-reference, I must be missing something, because it doesn't work.
I've dumbed down my code to illustrate the issue:
<?php
class Database
{
static $USER_TABLE = 1;
static $INVOICE_TABLE = 2;
static $PRODUCT_TABLE = 3;
var $users;
var $invoices;
var $products;
function __construct()
{
$this->users []= array ('id'=>0, 'first_name'=>'John', 'last_name'=>'Doe');
$this->products []= array('id'=>0, 'user_id'=>'0', 'printer'=>'HP','computer'=>'Toshiba');
$this->invoices []= array('id'=>0, 'user_id'=>'0', 'total_items'=>2, 'total_cost'=>700);
}
function getTable($table_name, &$table)
{
switch ($table_name)
{
case Database::$USER_TABLE: $table = $this->users; break;
case Database::$INVOICE_TABLE: $table = $this->invoices; break;
case Database::$PRODUCT_TABLE: $table = $this->products; break;
}
}
function addEntry($table_name, $info_array)
{
$this->getTable($table_name, $table); // THIS FAILS! WHY?
//$table = &$this->users; // THIS WORKS
if ($table !== null)
{
$id = 0;
if (count($table))
$id = ((int)$table[count($table)-1]['id'])+1;
$entry['id'] = $id;
foreach ($info_array as $k => $v)
{
$entry [$k]= $v;
}
$table []= $entry;
}
}
}
$db = new Database;
$db->addEntry(Database::$USER_TABLE, array('first_name'=>'Jane', 'last_name'=>'Plain'));
var_dump($db);
?>
The alternative is just to take the switch case out of getTable(...) and paste that to the top of all of my functions that would have called it, but that type of code duplication is not desirable.
Any insight is appreciated!
$this->getTable($table_name, $table);, what value does$table_nameactually have? I think that, since yourswitch($table_name)has no default case, then simple$tabledoes not get assigned.$db->addEntry(Database::$USER_TABLE, array('first_name'=>'Jane', 'last_name'=>'Plain'));(at the bottom of my code posting) the addEntry functoin passes along that first parameter (Database::$USER_TABLE) as $table_name, triggering the first case in the switch.