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 を使用する必要があります。ローカル変数を使用する場合は使用しないでください。2 番目の例のように、クラス メンバーが必要でない場合は使用しない$this->pinでください。

于 2013-04-02T00:20:53.780 に答える
1

「ベストプラクティス」はニーズによって異なります。あなたの例では、ピンが静的であるように見えます。最初にそれを設定するだけで、メソッドに渡すことさえできません。

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は、データベースからの結果、ユーザー入力、またはソースが特に知られていないものなど、何でもかまいません。

これが役立つかどうかはわかりませんが、一般的または抽象的に渡されたものに基づいてピンまたは統計の値を変更する場合にゲッターとセッターを使用する例を次に示します。 ゲッターとセッター?

于 2013-04-02T00:40:46.097 に答える
-1

OOP の優れたプラクティスに固執したい場合は、インスタンス変数のセッターとゲッターが本当に必要です。たとえば、コードのリビジョンは次のとおりです。

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 に答える