【问题标题】:PHP assign object instance to a static property not working [duplicate]PHP将对象实例分配给静态属性不起作用[重复]
【发布时间】:2013-03-25 12:04:08
【问题描述】:

我正在使用 Laravel,但 new 关键字出现错误。我还是 OOP 概念的新手,我做错了什么?

错误:

Line 3: syntax error, unexpected 'new' (T_NEW) 

代码:

class User extends Eloquent{

    public static $user = new Fb();

    public function mySnippets(){
        return Snippet::all()->where('author','=',self::$user->getUser());
    }

}

谢谢!

【问题讨论】:

  • 这很重要。至于非静态属性,您需要在每个对象中创建一个新的属性实例。因此,您可以在构造函数中分配它。至于静态属性,您希望所有对象都具有相同的实例(并且您希望它们在没有创建对象的情况下可用)。因此,您不能使用相同的解决方案。
  • @Aufziehvogel 答案略有不同,但这两个问题都是由于没有注意到manual page 中的以下内容:“此声明可能包含初始化,但此初始化必须是常量值。” IMO 的最佳答案将涵盖这两种情况并证明欺骗声明的合理性。

标签: php oop laravel


【解决方案1】:

除了其他答案,

我还是 OOP 概念的新手,我做错了什么?

基本上都是。你有全局状态和静态方法,这很糟糕。仅仅使用静态类来包装事物并不意味着您使用 OOP 范式。

class User extends Eloquent
{
    public static $user = new Fb();

    public function mySnippets(){
        return Snippet::all()->where('author','=',self::$user->getUser());
    }

}

这是错误的。 在 OOP 方面,应该和这个类似:

class User extends Eloquent
{
    private $fb;

    public function __construct(FB $fb)
    {
       $this->fb = $fb;
    }

    public function mySnippets()
    {
      return Snippet::all()->where('author', '=', $this->user->getUser());
    }
}

//Usage:

$fb = new FB();
$user = new User($fb);

var_dump($user->mySnippets());

【讨论】:

  • 感谢您的评论:D
【解决方案2】:

你不能在属性声明中使用 new。因此,您必须在需要时进行设置。由于您可能希望在静态上下文中使用它,因此构造函数可能不合适(仅当您在类上使用 new 时才会调用它,并且每个对象中都有不同的 Fb 实例)。

这样更好:

public static function getUser() {
   if (self::$user == null) self::$user = new Fb();
   return self::$user;
}

然后总是通过

检索静态属性
self::getUser()

【讨论】:

  • 嗨,感谢您的回答。但是有一个问题:if 语句是单例模式的开始吗?我的意思是,我不能省略它吗?谢谢
  • 它的教学方式不是单例模式(意味着整个班级将被创建一次),但它是“单例”的,它确保您只分配一次新的对象到一个变量(并一直保留它)。如果您删除了 if 条件,则每次都会有一个不同的 Fb 实例(丢失之前调用的操作等)。
  • 这很好用,但这是一种不好的做法,应该始终避免。
【解决方案3】:

你只能用基本类型初始化成员变量。

您必须在类声明之后分配给静态变量,或者提供一个类级别的init 方法或类似的方法来进行分配。

class User extends Eloquent {
  public static $user = null;

}

User::$user = new Fb();

【讨论】:

  • 是的,他可以做到这一点。但他不应该。 User::$user = new FB(); 只是一种不好的做法,会破坏封装。您可能知道,静态类是假 OOP。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-03
  • 2013-05-23
  • 1970-01-01
  • 2012-10-18
  • 2014-04-05
  • 1970-01-01
相关资源
最近更新 更多