我有一个带有构建视图的函数的视图类
class view {
//...
public function build() {
$view = $this;
$data = $this->resources->data;
function s($value) {
return \classes\tools\html\html::specialChars($value);
}
require $this->viewFile;
}
//...
}
查看一些视图文件
<?php var_dump($view);
// works fine, variables passed ok ?>
<?= s($data->someUnsafeString) ?>
<?php //Fatal error: Call to undefined function s() ?>
我可以在每个视图文件中定义函数s
,但我真的不想这样做。
我可以将函数作为变量$s=function(){..}
传递,但我不太喜欢
我可以直接在视图中调用静态函数,但即使这样比我更喜欢这个:
<?= html::s($data->someUnsafeString) ?>
这可能吗?或任何其他建议?
答案 0 :(得分:4)
你可能误解了你在那里做的事情。函数不是在PHP中作用域。您function s(..)
内的view::build
仅仅声明了常规的全局功能。在内部执行功能并不是什么特别的事情。您可以在PHP中有条件地声明函数,例如:
if (!function_exists('s')) {
function s(..) ..
}
所以只需将该函数声明放入单独的文件中,并根据需要include
;无需在每个文件中一次又一次地定义它。
答案 1 :(得分:4)
如果您的项目有Front Controller
(一个文件 - 入口点),则
然后你可以通过这个文件在这个或必需(#require
)的公共命名空间中声明你的函数。
通用命名空间是没有命名空间或
的代码namespace {
function s() {
}
}