是否可以将传递函数传递给包含的文件?

时间:2014-11-15 20:25:26

标签: php

我有一个带有构建视图的函数的视图类

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) ?>

这可能吗?或任何其他建议?

2 个答案:

答案 0 :(得分:4)

你可能误解了你在那里做的事情。函数不是在PHP中作用域。您function s(..)内的view::build仅仅声明了常规的全局功能。在内部执行功能并不是什么特别的事情。您可以在PHP中有条件地声明函数,例如:

if (!function_exists('s')) {
    function s(..) ..
}

所以只需将该函数声明放入单独的文件中,并根据需要include;无需在每个文件中一次又一次地定义它。

答案 1 :(得分:4)

如果您的项目有Front Controller(一个文件 - 入口点),则 然后你可以通过这个文件在这个或必需(#require)的公共命名空间中声明你的函数。

通用命名空间是没有命名空间或

的代码
namespace {
  function s() {
  }
}