关于php:调用未定义的函数AppHttpControllers [函数名]

Call to undefined function AppHttpControllers [ function name ]

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
public static function getFactorial($num)
{
    $fact = 1;
    for($i = 1; $i <= $num ;$i++)
        $fact = $fact * $i;
    return $fact;
}

那么,我就这样用它

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?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!');

    }


}


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

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

1
CodeController::getFactorial($index);

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

为了最佳实践,我认为您可以将此类函数放在单独的文件中,这样您就可以更容易地维护这些函数。

这样做

app目录中创建一个文件夹,并将其命名为lib(您可以使用自己喜欢的名称)。

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

1
2
3
4
5
6
7
8
"autoload": {
   "classmap": [
               "app/commands",
               "app/controllers",
                ............
               "app/lib"
    ]
},

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

然后在lib中创建一个文件,我将其命名为helperFunctions.php

在里面定义函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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;

     }
}

在应用程序中的任何地方称之为

1
$fatorial_value = getFactorial(225);


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

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

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

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