Я передаю переменную по ссылке на метод класса с намерением установить для него член того же класса (на основе селектора функции). Хотя это, похоже, не нарушает правила устаревшей передачи PHP по времени обращения, я должен что-то упустить, потому что это не работает.
Я остановился на своем коде, чтобы проиллюстрировать проблему:
<?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);
?>
Альтернативный вариант — просто взять случай переключения из getTable (…) и вставить его в начало всех моих функций, которые его вызвали бы, но такой тип дублирования кода нежелателен.
Любое понимание приветствуется!
Было бы намного проще иметь getTable
на самом деле вернуть таблицу:
function getTable($table_name)
{
switch ($table_name)
{
case Database::$USER_TABLE: return $this->users; break;
case Database::$INVOICE_TABLE: return $this->invoices; break;
case Database::$PRODUCT_TABLE: return $this->products; break;
}
}
А затем просто позвоните по следующему номеру:
$table = $this->getTable($table_name);
Других решений пока нет …