【问题标题】:Call to undefined function App\Http\Controllers\ [ function name ] [duplicate]调用未定义的函数 App\Http\Controllers\ [函数名] [重复]
【发布时间】:2015-12-28 11:37:27
【问题描述】:

在我的控制器中,我创建了一个函数getFactorial

public static function getFactorial($num)
{
    $fact = 1;
    for($i = 1; $i <= $num ;$i++)
        $fact = $fact * $i;
    return $fact;
}

那我就这样用了

public function codingPuzzleProcess()
{

    $word     = strtoupper(Input::get('word'));
    $length   = strlen($word);
    $max_value = ($length * 26);
    $characters = str_split($word);

    $num = 1 ;
    $index = 1;

    sort($characters);

    foreach ( $characters as $character) {
        $num += getFactorial($index) * $index;
        $index ++;
    }

    return Redirect::to('/coding-puzzle')
        ->with('word', $word )
        ->with('num', $num )
        ->with('success','Submit successfully!');

}

由于某种原因,我不断收到此错误

Call to undefined function App\Http\Controllers\getFactorial()

有人可以教我如何解决这个错误吗?

提前非常感谢。


CodeController.php

<?php

namespace App\Http\Controllers;
use View, Input, Redirect;

class CodeController extends Controller {


    public function codingPuzzle()
    {
        return View::make('codes.puzzle');
    }

    public static function getFactorial($num)
    {
        $fact = 1;
        for($i = 1; $i <= $num ;$i++)
            $fact = $fact * $i;
        return $fact;
    }


    public function codingPuzzleProcess()
    {

        $word     = strtoupper(Input::get('word'));
        $length   = strlen($word);
        $max_value = ($length * 26);
        $characters = str_split($word);

        $num = 1 ;
        $index = 1;

        sort($characters);

        foreach ( $characters as $character) {
            $num += getFactorial($index) * $index;
            $index ++;
        }

        return Redirect::to('/coding-puzzle')
            ->with('word', $word )
            ->with('num', $num )
            ->with('success','Submit successfully!');

    }


}

【问题讨论】:

  • 在哪个类中定义了getFactorial
  • CodeController 类。
  • static::getFactorial($index)。您应该阅读 OOP PHP 编程。
  • self::getFactorial($index) 应该也可以。

标签: php laravel laravel-5


【解决方案1】:

假设您在 CodeController 中定义了 static getFactorial 函数

那么这就是你需要调用静态函数的方式,因为静态属性和方法存在于类中,而不是存在于使用类创建的对象中。

CodeController::getFactorial($index);

----------------更新----------------

为了最佳实践,我认为您可以将此类函数放在单独的文件中,以便更轻松地进行维护。

这样做

app目录下创建一个文件夹,命名为lib(你可以取一个你喜欢的名字)。

此文件夹需要自动加载才能将app/lib 添加到composer.json,如下所示。并运行composer dumpautoload 命令。

"autoload": {
    "classmap": [
                "app/commands",
                "app/controllers",
                ............
                "app/lib"
    ]
},

然后lib 中的文件将自动加载。

然后在lib里面创建一个文件,我把它命名为helperFunctions.php

里面定义了函数。

if ( ! function_exists('getFactorial'))
{

    /**
     * return the factorial of a number
     *
     * @param $number
     * @return string
     */
    function getFactorial($date)
    {
        $fact = 1;

        for($i = 1; $i <= $num ;$i++)
            $fact = $fact * $i;

        return $fact;

     }
}

并在应用程序中的任何位置调用它

$fatorial_value = getFactorial(225);

【讨论】:

  • 首先感谢您的回答。静态是唯一的方法吗?
  • 嗯,我认为将这种函数放在一个类中不好,我会更新答案
  • 感谢您的更新,并为更好的方法提供建议。
  • 我更新了更多细节,请看一下,如果您设置正确或有任何问题,请告诉我?
  • 您好,感谢您提供此解决方案。 function_exists 有什么用?
【解决方案2】:

如果它们在同一个控制器类中,则为:

foreach ( $characters as $character) {
    $num += $this->getFactorial($index) * $index;
    $index ++;
}

否则需要新建一个类的实例,并调用方法,即:

$controller = new MyController();
foreach ( $characters as $character) {
    $num += $controller->getFactorial($index) * $index;
    $index ++;
}

【讨论】:

    猜你喜欢
    • 2022-11-15
    • 2019-11-17
    • 2020-02-26
    • 2017-08-23
    • 2017-10-16
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多