【问题标题】:Laravel - Calling member function of class using $this keyword in controllerLaravel - 在控制器中使用 $this 关键字调用类的成员函数
【发布时间】:2019-01-02 20:07:29
【问题描述】:

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

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关键字as调用这个函数

$event->slug_str = $this->generateBarcodeNumber();

这是错误:

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

谢谢!

【问题讨论】:

  • 您的代码中调用的barcodeNumberExists 函数在哪里?
  • 在你的公共函数 generateBarcodeNumber 中你也不会返回任何东西。我只是返回 mt_rand(1000000000, 9999999999);

标签: php laravel class


【解决方案1】:

$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();
}

【讨论】:

  • 很好的解释先生。所以如果我们在调用类的成员函数之前不使用$this,那么它会通过PHP中的命名空间调用该函数吗?顺便说一句,我编辑了这个问题,现在它变得有意义了。
  • @xkrlaix 是的,你是对的。因为php支持非类成员的函数,所以我们使用$this来避免冲突和混淆。
猜你喜欢
  • 2019-05-26
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
相关资源
最近更新 更多