5

我四处搜索,但找不到关于在 PHP 类中使用 $this 的明确答案(如果有的话)。我仍在尝试使用 OOP 方法,并希望确保我使用的是最佳实践。

所以我的问题是关于你应该如何以及何时定义变量以及何时应该使用 $this 来引用它们。

假设我有以下课程....

class Foo {

private $pin;
private $stat;

public function get_stat($pin) {
            $this->stat = shell_exec("blah read $pin");
            return $this->stat;
    }
}

所以在上面的函数中,我将 var $pin 传递给了类方法。这工作得很好,而不必使用 $this->pin ...但是下面的代码似乎更像是做同样事情的正确方法.....

class Foo {

private $pin = 0;
private $stat = 0;

public function get_stat($pin) {
            $this->pin = $pin;
            $this->stat = shell_exec("blah read $this->pin");
            return $this->stat;
    }
}

此外,我已将 $pin 和 $stat 变量设置为 = 0。我认为这可以只是一个默认值,或者我可以像第一个示例中那样定义它们 private $pin; 和私人 $stat;.

回到我的问题,关于如何在类方法中使用成员和 $this 的最佳实践是什么?每个示例的优点或缺点是什么?

4

3 回答 3

6

使用任何类成员时都必须使用 $this。使用局部变量时不能使用它。如果没有必要,你应该避免使用类成员,就像$this->pin你的第二个例子一样。

于 2013-04-02T00:20:53.780 回答
1

“最佳实践”取决于您的需求。在您的示例中,看起来 pin 是静态的。您最初可以设置它,甚至不将其传递给方法。

private $pin = 'abc123';

public function get_stat() {
    $this->stat = shell_exec("blah read $this->pin");
    return $this->stat;
}

仅当您需要类中的方法可以访问它们时,设置类变量才有意义。在您的示例中, key 和 stat 都可能在许多方法中使用,因此将它们定义为类变量并使用 and 访问它们$this->key$this->stat合理且合乎逻辑的。如果像 stat 这样的东西仅用于特定方法或根据特定数据集进行更改,使 stat 成为许多对象的属性而不是类的公共属性,那将是没有意义的。

正如 Sven 指出的那样,使用$this->pinwhen$pin传递给类是不理智的。将其分配为类变量并$this->pin在引脚不变且对实例通用的情况下使用会更合乎逻辑,在这种情况下,您不需要将任何内容传递给该方法。例如,密钥不太可能更改的 API 请求。如果可以是任何东西,例如来自数据库的结果、用户输入或其他任何来源不明的东西,则传递$key给该方法是有意义的。$key

我不知道这是否会有很大帮助,但如果您打算根据一般或抽象传递的任何内容更改 pin 或 stat 的值,这里有一个使用 getter 和 setter 的示例。 Getter 和 Setter?

于 2013-04-02T00:40:46.097 回答
-1

如果你想坚持 OOP 的良好实践,那么你应该为你的实例变量设置 setter 和 getter。例如,这是您的代码的修订版:

class Foo {

    // common practice to begin private variables and methods with an underscore
    private $_pin = 0;
    private $_stat = 0;

    // this is called a setter because we are setting a value
    // note the lack of a return
    public function setStat($stat) {
        // we use $this-> because we are referencing THIS instance of THIS class/object
        // and in doing so we refer to our private $_stat instance variable.
        $this->_stat = $stat;
    }

    // this is called a getter because we are getting a value
    // not how we are NOT setting values here.
    public function getStat() {
        return $this->_stat;
    }

}

所以总的来说,$this当你引用这个类的实例(也称为对象)时,你会使用它。拥有一个类的好处是您可以拥有一个类定义的多个对象。例如:

class Person {

    public $name, $age, $gender;

    public function setName($name) {
        $this->name = $name;
    }
    public function setAge($age) {
        $this->age = $age;
    }
    public function setGender($gender) {
        $this->gender = $gender;
    }
    public function getName() {
        return $this->name;
    }
    public function getAge() {
        return $this->age;
    }
    public function getGender() {
        return $this->gender;
    }

}

// outside the class
$john = new Person();
$john->setName('John Doe');
$john->setAge(22);
$john->setGender('male');
var_dump($john);

var_dump显示:

object(Person)#1 (3) { 
    ["name"]=> string(8) "John Doe" // $this->name
    ["age"]=> int(22)               // $this->age
    ["gender"]=> string(4) "male"   // $this->gender
}

希望这可以帮助!

于 2013-04-02T00:33:42.757 回答