【问题标题】:calling nested function php codeigniter调用嵌套函数php codeigniter
【发布时间】:2014-05-25 21:02:20
【问题描述】:

我正在尝试在其他function 下调用functionnested 考虑一个例子:

function _get_stats() {
    function _get_string() {
        $string = 'Nested Function Not Working';
        return $string;
    }
 }

 public function index() {
    $data['title'] = $this->_get_stats() . _get_string();
    $this->load->view('home', $data);
 }

现在当我在网络浏览器中运行页面时,blank 页面会显示出来。

任何建议或帮助都会对我有很大帮助.. 提前致谢

【问题讨论】:

  • 试试这一行$data['title'] = $this->_get_stats() . $this->_get_string(); 我从来没有发现使用嵌套函数有任何意义......(不是闭包)。
  • 您能解释一下为什么要这样做吗?我看不出这有什么好处……
  • @Kryten 我只是想知道嵌套函数在 php 中是如何工作的。
  • 我明白了。谢谢!现在我也更好地理解了它们的工作原理:-)

标签: php function codeigniter nested-function


【解决方案1】:

函数并不是真正嵌套的,但是调用_get_stats() 会导致_get_string 被声明。 PHP 中没有嵌套函数或类之类的东西。

调用_get_stats()两次以上会报错,说函数_get_string()已经存在,不能重新声明。

_get_stats() 之前调用_get_string() 会引发错误,指出函数_get_string() 不存在`。

在您的情况下,如果您真的想这样做(这是一种不好的做法),请执行以下操作:

protected function _get_stats() {
    if (!function_exists("_get_string")){
        function _get_string() {
            $string = 'Nested Function Not Working';
            return $string;
        }
    }
}

public function index() {
    $this->_get_stats(); //This function just declares another global function.
    $data['title'] = _get_string(); //Call the previously declared global function.
    $this->load->view('home', $data);
}

但是 您正在寻找的可能是method chaining。在这种情况下,您的方法必须返回一个包含所需函数的有效对象。

例子:

protected function getOne(){
  //Do stuff
  return $this ;
}

protected function getTwo(){
  //Do stuff ;
  return $this ;
}

public function index(){
  $this
    ->getOne()
    ->getTwo()
  ;
}

【讨论】:

  • 请您解释一下为什么这是一种不好的做法?
  • 因为弄乱函数声明很糟糕,代码将无法维护。
【解决方案2】:

如果你有一个空白页面,它可能是一个 500“服务器错误”响应,即 PHP 代码中的致命错误。

_get_string 将在 PHP 执行到达其声明时定义,即在 _get_stats 中执行此声明时。

index() 中,_get_string 在您调用它时可能尚未声明。

由于嵌套函数仍然定义在全局命名空间中(例如与 JS 相反),您可能需要移动 _get_string 声明。

【讨论】: