如何在PHP的静态函数中给公共变量赋值?

3

我尝试了$this->,但无法给$first_name和$last_name变量赋值。不删除函数静态特性,也不将静态特性插入到变量中,如何输出full_name()?以下是代码:

<?php

class User  {

    public $first_name;
    public $last_name;

  public function full_name() {
    if(isset($this->first_name) && isset($this->last_name)) {
    return $this->first_name . " " . $this->last_name;
    } else {
    return "No name!";
    }
   }

  public static function verify() {

    $this->first_name = "firstname";
    $this->last_name =  "last_name";
   }
  }

$user = new User();
User::verify();
echo $user->full_name()

?>

7
不行。静态方法没有上下文,所以除非你传入一些东西,否则没有什么可以验证的。当然有解决办法,比如将你的对象设为单例。但在你的用户示例中这并没有太多意义。 - Mike B
2个回答

7
你无法这样做。为什么不将 verify 设为成员函数,然后像下面这样调用:
$user->verify();

另一种选择是将用户传递到验证函数中,像这样:

public static function verify( $user ) {
   $user->first_name = 'firstname';
   $user->last_name = 'last_name';
}

并这样调用:
User::verify($user)

4

除了使用单例模式之外,你不能真正地在静态函数中访问非静态成员变量或调用非静态成员函数,这有点违背了静态函数的初衷。

基本思想是一个静态函数不需要实例,而你要做的却需要。我建议在非静态setter函数或构造函数中验证数据。或者如果必须要这样做,可以添加一个名为verify的公有方法来进行验证,但它不是静态的。
请思考一下:静态函数不需要实例,那么如果没有实例(因此也没有"$this"),你要验证什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接