2013-04-02 13 views
5

私はPHPクラス内で$ thisを使用しているときに検索しましたが、確定した回答があればそれを見つけることができませんでした。私はまだOOPのアプローチを使用して私の頭を包み込み、ベストプラクティスを使用していることを確認したいと思っています。PHPクラスのメンバーとメソッド

私の質問は、どのようにいつvarsを定義すべきか、また、$ thisを使って参照する必要があるときです。

は、私は以下のクラスを持っていると言う....

class Foo { 

private $pin; 
private $stat; 

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

したがって、上記の機能では、私はクラスメソッドに渡されたのvar $ピンを持っています。これは、の$ this - を使用することなく、正常に動作します>ピンが...しかし、以下のコードはまた

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に設定します。これはデフォルト値にすることもできますし、private $ pinの最初の例のように定義することもできます。プライベート$ stat;

私の質問に戻ると、どのようにクラスメソッドでメンバと$ thisを使用する方法のベストプラクティスですか?各例の長所と短所は何でしょうか?

+1

私は[codereview.stackexchange](http://codereview.stackexchange.com/)でこれに関してかなり良い答えを得ました。それをチェックしてください[ここ](http://codereview.stackexchange.com/a/23857/20878) – jnthnjns

+0

リンクASOKありがとう!これで、クラス内のプロパティを参照するために$ this ...のみを使うべき理由が理解できます。私はクラスの外でそれらにアクセスすることとの関係をかなり理解できませんでした。 – user2233942

+0

絶対にエスケープされていない値でシェルを呼び出してください! 'shell_exec(" blah read $ pin ");はコードインジェクションに広くオープンしています。 escapehellarg() – Sven

答えて

6

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

+0

Svenに感謝します。要するに、私が$を使う唯一の時間は、私がクラスのメンバーと一緒に仕事をする必要がある時です。他に必要なことはありませんか? – user2233942

+0

私はそれを「不要」と呼んでいません。ローカル変数を扱うときには '$ this'を使わないでください。 – Sven

+0

文字列に変数を直接使用することは避けてください。 –

-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 
} 

は、この情報がお役に立てば幸い!

+0

いいえ、申し訳ありませんが、私は同意しません。 "getStat"のgetter/setterの例が間違っています。あなたのコードはgetStat()を呼び出すgetStat()で無限ループであり、その考え方は間違っています。渡されたパラメータで何かを行い、結果を返すメソッドをオブジェクトに持たせることは良いことです。他の例は全く異なる例です。なぜなら、内部に機能を持たない値記憶域を持つゲッター/セッターを示しているからです。 – Sven

+0

あなたの意見を共有してくれてありがとう – djthoms

+0

残りのコードについて私の意見が何であっても、 'getStat()'の無限ループはまだあります。 – Sven

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が指摘しているように、$pinがクラスに渡されたときに$this->pinを使用すると、正気ではありません。ピンを変更せずにインスタンスに共通の場合は、それをクラス変数として割り当て、$this->pinを使用する方が論理的です。この場合、メソッドに何も渡す必要はありません。たとえば、キーが変更されない可能性のあるAPIリクエストなどです。 $keyをこのメソッドに渡すと、$keyは、データベース、ユーザー入力、またはソースが具体的にわからない場合の結果など、何でもよい場合に意味があります。

これは多くの助けになるかどうかわかりませんが、一般的に渡されたものや抽象的なものに基づいてピンや統計の値を変更する場合は、ゲッタとセッタを使用する例があります。 Getter and Setter?

+0

これは実際に役立つカイでした。あなたとSvenが指摘しているように、$ this-> pinはクラスに渡されてからは不要です。私の切断は、クラスの内側と外側の間の関係(何も存在しないように見える)です。 – user2233942

0

varを絶対に使用しないでください。それは非難される公衆の形です。 プロパティでpublicを使用しないようにするには、クラス内のすべてのプロパティの値を制御する必要があります。

関連する問題