PHP类成员和方法

时间:2013-04-02 00:17:38

标签: php oop class

我已经四处搜索但在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传递给了class方法。这很好用而不必使用$ 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 vars设置为= 0.我认为这只是一个默认值,或者我可以像第一个示例私有$ pin一样定义它们。和私人$ stat;。

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

3 个答案:

答案 0 :(得分:6)

使用任何类成员时必须使用$ this。使用局部变量时,不得使用它。如果没有必要,您应该避免使用类成员,例如第二个示例中的$this->pin

答案 1 :(得分:1)

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

private $pin = 'abc123';

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

如果您需要通过类中的方法访问类变量,那么设置类变量才有意义。在您的示例中,key和stat都可能在许多方法中使用,因此将它们定义为类变量并使用$this->key$this->stat访问它们是明智且合乎逻辑的。如果stat这样的东西只用在特定的方法中,或者根据特定的数据集改变,使stat成为许多对象的属性而不是类的公共属性,那就没有意义了。

正如Sven所指出的那样,当$this->pin传递给班级时使用$pin并不理智。将它指定为类变量更合乎逻辑,如果引脚没有更改并且对实例是通用的,则使用$this->pin,在这种情况下,您不需要向方法传递任何内容。例如,类似于密钥不太可能发生变化的API请求。如果$key可以是任何内容,例如来自数据库的结果,用户输入或其他未明确知道源的内容,则将$key传递给方法是有意义的。

我不知道这是否会有多大帮助,但如果您打算根据通常或抽象地传递的任何内容更改pin或stat的值,则可以使用getter和setter。 Getter and Setter?

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

希望这有帮助!