Я занимаюсь разработкой мини-рамки PHP, один из которых методы строит таблицу HTML из массива объектов:Вопрос об анонимных методов в качестве членов класса
class HTMLTableField {
private $hdr;
private $alg;
private $fun;
function __construct($descr, $align, $apply) {
# fun must be an anonymous function
$this->hdr = '<th>' . htmlentities($descr) . "</th>\n";
$this->alg = "<td style=\"text-align: {$align}\">";
$this->fun = $apply;
}
function getHeader() {
return $this->hdr;
}
function getCell($row) {
# This line fails
return "{$this->alg}{$this->fun($row)}</td>";
}
}
function gen_html_table($rows, $fields) {
# $fields must be an array of HTMLTableField objects
echo "<table>\n<thead>\n<tr>\n";
foreach ($fields as $field)
echo $field->getHeader();
echo "</tr>\n</thead>\n<tbody>\n";
foreach ($rows as $row) {
echo "<tr>\n";
foreach ($fields as $field)
echo $field->getCell($row);
echo "</tr>\n";
}
echo "</tbody>\n</table>\n";
}
Однако, когда поток управления gen_html_table
достигает
echo $field->getCell($row);
Я получаю сообщение об ошибке: «Вызов неопределенного метода HTMLTableField :: fun().» Но удовольствие должно быть анонимным методом!
Да, это то, что я только что сделал. Но это не очень элегантно. – pyon
Мне нравится читать его больше, чем 'call_user_func()'. к сожалению, нет лучшего способа. –
Да, 'call_user_func()' заставляет чувствовать, что отражение не было родным для PHP, а скорее взломали его. – pyon