Laravel-在控制器中使用$ this关键字调用类的成员函数

时间:2019-01-02 20:07:29

标签: php laravel class

我在Laravel中有一个Event类作为Controller类。这是名称空间。

Object.getOwnPropertyDescriptor(FUNC,"what do i put here?");

这是类的起始代码和构造函数。

namespace App\Http\Controllers\Admin;

这是函数名称和定义

class EventController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */

    public function __construct()
    {
        $this->middleware('auth');
    }

我正在使用 function generateBarcodeNumber() { $number = mt_rand(1000000000, 9999999999); // better than rand() // call the same function if the barcode exists already if (barcodeNumberExists($number)) { return generateBarcodeNumber(); } // otherwise, it's valid and can be used return $number; } function barcodeNumberExists($number) { // query the database and return a boolean // for instance, it might look like this in Laravel return User::whereBarcodeNumber($number)->exists(); } 关键字作为另一个函数调用该函数

$this

这是错误:

  

调用未定义函数App \ Http \ Controllers \ Admin \ barcodeNumberExists()

谢谢!

1 个答案:

答案 0 :(得分:0)

$this是类实例变量。 并且它在静态范围内不可用。

class AcmeEvent
{
    public slug_str;
}

class AcmeBarcodeEventGenerator 
{
    public function generateEvent()//: AcmeEvent
    {
        $e = new AcmeEvent();
        $e->slug_str = $this->generateBarcodeNumber();

        return $e;
    }

    public function generateBarcodeNumber()//: int
    {
        return mt_rand(1000000000, 9999999999);
    }
}

$generator = new AcmeBarcodeEventGenerator();
$e = $generator->generateEvent();
die(var_dump($e)); // Will stop executing script and dump the event instance.

如果要在类范围之外使用类函数(方法),请像这样使用它。

$e = new AcmeEvent();
$e->slug_str = (new AcmeBarcodeEventGenerator())->generateBarcodeNumber();

die(var_dump($e)); // Will stop executing script and dump the event instance.

请参见this question & answer


您似乎正在调用一个名为barcodeNumberExists的函数。它不是类方法的调用。 PHP表示您正在调用未定义的函数。这是你的问题。如果是方法名;对此明确。像:$this->barcodeNumberExists()。除此以外; php fill尝试在名称空间而不是类中查找函数。您来自Java吗?


在问题编辑后添加。

public function generateBarcodeNumber() {
    $number = mt_rand(1000000000, 9999999999); // better than rand()

    // call the same function if the barcode exists already
    if ($this->barcodeNumberExists($number)) {
        return $this->generateBarcodeNumber();
    }

    // otherwise, it's valid and can be used
    return $number;
}

private function barcodeNumberExists($number) {
    // query the database and return a boolean
    // for instance, it might look like this in Laravel
    return User::whereBarcodeNumber($number)->exists();
}