PHP将对象实例分配给静态属性不起作用

时间:2013-04-03 17:15:14

标签: php oop laravel

我正在使用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());
    }

}

谢谢!

3 个答案:

答案 0 :(得分:3)

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

可能会更好:

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

然后始终通过

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

答案 1 :(得分:2)

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

您必须在类声明后分配静态变量,或者提供执行赋值的类级init方法等。

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

}

User::$user = new Fb();

答案 2 :(得分: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());