当前位置: 首页 > 知识库问答 >
问题:

不应该静态调用非静态方法

段干祺
2023-03-14

我正在使用存储库模式并尝试建立模型之间的关系。当我尝试运行存储()方法(在控制器中),该方法试图使用用户()方法(与方模型建立关系)时,我收到以下错误消息

非静态方法不应该静态调用::user(),假设$this来自不兼容的上下文

我不明白为什么在尝试运行user()relationship方法时会出现此错误,但所有其他方法(包括$this-

以下是相关代码:

// PartiesController.php
public function __construct(Party $party){
  $this->party = $party
}

public function store(){
  $data = Input::all();
  $user = Sentry::getUser(); 
  $this->party->user()->create($data);
}

// Party.php
class Party extends Eloquent{
  public function user(){
    return $this->belongsTo('User');
  }
}

// User.php
use Cartalyst\Sentry\Users\Eloquent\User as SentryUserModel;

class User extends SentryUserModel implements UserInterface, RemindableInterface {
  public function party(){
    return $this->hasMany('Party');
  }
}

// PartyRepository.php
namespace repositories\Party;

interface PartyRepository{
  public function all();

  public function findByID($id);

  public function create($input);

  public function user();
}

// EloquentPartyRepository.php
namespace repositories\Party;
use Party;

class EloquentPartyRepository implements PartyRepository{
  public function all(){
    return Party::all();
  }

  public function create($input){
    return Party::create($input);
  }

  public function user(){
    return Party::user();
  }
}

共有2个答案

罗祺
2023-03-14

我已经解决了这个问题。感谢@watcher和@deczo的反馈。两者都非常有用,并且与此错误消息相关。

最后,我只需要更改一行。我在 store() 函数中顺序错误地进行了方法调用。这是相关代码。

// PartiesController.php
public function store(){
  $data = Input::all();
  $user = Sentry::getUser(); 
  $user->party()->create($data);
}

在我的例子中,要删除非静态错误并将用户模型正确插入到模型中,我只需要进行上述更改。

我提到了http://laravel.com/docs/eloquent/#inserting-适当序列的相关模型。

宋瀚海
2023-03-14

这个问题是因为您在静态上下文中调用了非静态方法。您可能已经习惯了Laravel做这些事情的方式(例如< code>User::find()等等)。但实际上,这些并不是静态调用(一个类实例实际上是在幕后解析的,并且在该实例上调用< code>find()方法)。

在您的情况下,它只是一个简单的静态方法调用。PHP会允许这样做,除了在方法中引用<code>$this</code>而PHP不知道如何处理它。根据定义,静态方法调用不知道类的任何实例。

我的建议是将模型类的实例注入到存储库的构造函数中,如下所示:

//Class: EloquentPartyRepository
public function __construct(Party $party) 
{
    $this->party = $party;
}

public function user($partyId) 
{
    return $this->party->find($partyId)->user();
}

发送给构造函数的Party实例不应该是数据库中的记录,而应该是Particle的空实例(即newParty()),尽管我相信如果只是将其添加到构造函数中,IoC应该能够利用依赖注入并为您提供实例。

这里有一个等效的实现,它添加了一个byId方法:

//Class: EloquentPartyRepository
public function __construct(Party $party) 
{
    $this->party = $party;
}

public function byId($partyId)
{
    return $this->party->find($partyId);
}

public function user($partyId) 
{
    if($party = $this->byId($partyId)) {
        return $party->user();
    }

    return null;
}
 类似资料:
  • 我最近对 PHP 5.4 进行了更新,但收到有关静态和非静态代码的错误。 这是错误: 这是第371行: 我希望有人能帮忙。

  • 我有一个简单的模式,有一个索引方法从数据库中获取数据 模态:国家 现在我想从控制器调用这个函数: 控制器: 为此,我以这种方式创建了一个正面: 创建了一个提供者 在config/app.php中注册了提供程序 创建了门面 在config/app.php中注册别名 第1步-提供商: php artisan make:提供者NationServiceProvider 第2步:在config/app.p

  • 我一直试图用我的验证代码进行php pear验证,但我收到的都是严格标准错误--问题是什么?我如何修复它? 电子邮件验证.php

  • PHP严格标准:不应在第33行的/web/sites/blah/somescript.PHP中静态调用非静态方法pear::iserror() 我在MDB2上看到了类似的错误。稍后再详细介绍。 somescript.php: 问题 是否有不同的方法来调用而不会产生错误?

  • 我正在尝试在varGrant CentOS VM上本地运行一个codegniter站点。我已经下载了所有文件,并设置了yaml/host文件等。 我在屏幕上看到这个错误。 遇到 PHP 错误 严重性:8192 消息:非静态方法 MY_Loader::d efine_module() 不应静态调用,假设$this来自不兼容的上下文 文件名:controllers/Front _ controller

  • 我正在努力得到一个用户的基础上,他的id或电子邮件后,他登录通过一个表单。这个函数是在user.class.php中定义的,我想在另一个名为profile.php的php文件中调用它,但它仍然给我带来语法错误,我不知道如何修复它。 错误:不推荐使用:不应静态调用非静态方法User::GetUserId()注意:未定义变量:email in 使用getters和setters,函数 下面是profi