我正在开发一个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()。”但乐趣应该是一种匿名方法!
答案 0 :(得分:2)
甚至更短,在我看来更优雅的解决方案:
function getCell($row) {
return "{$this->alg}{$this->fun->__invoke($row)}</td>";
}
答案 1 :(得分:1)
没关系。我找到了一个丑陋但最终有效的解决方案:
$func = $this->fun;
return "{$this->alg}{$func($row)}</td>";
答案 2 :(得分:1)
我不确定你要完成什么,但是你最好不要使用魔术方法http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods吗?
答案 3 :(得分:1)
一种方法是:
call_user_func($this->fun, $row)
我认为这是一个风格问题,但是使用call_user_func()
或call_user_func_array()
的大量时间被认为比$func()
语法更清晰,在某些情况下(比如这个),必要。它还可以让您更轻松地立即发现动态呼叫。
答案 4 :(得分:1)
你不能通过class属性使用anynomious函数。
function getCell($row) {
# This line works
$fun = $this->fun;
return $this->alg . $fun($row) . "</td>";
}
使你的脚本运行:),在php 5.3.1上测试
答案 5 :(得分:0)
我认为你需要
$this->$fun($row)
而不是
$this->fun($row)
前者调用存储在成员变量$fun
中的函数指针,而后者调用成员函数fun()
,如上所述,它不存在。