1

次のような基本的なオブジェクトが与えられた場合 (AS3 での作業に基づく)、それ$friendは解釈できます$this->friendが、PHP パーサーは関数$friendにローカライズされた初期化されていない変数としてしか認識しませんholler。を使用せずにメンバー変数にアクセスする方法はあります$this->か? 私の目標は、可能な限り無駄のない構文を発見することです。

class MyBuddy
{
   private $friend = true;

   public function holler()
   {
       if ( $friend ) // <- parser won't resolve $friend to a member variable
          return 'Heeeeey Buuuuuday!';
       else
          return null;
   }
}

更新:与えられた回答を検討した後、最も簡潔で理解しやすいアプローチは、関数の先頭にある関数レベル変数への参照によってインスタンス変数を渡すことです。これは、詳細なインスタンス変数を参照する関数にとって適切なソリューションです。

// Demonstrating a simple cache which abbreviates $this->thingCollection 
// to $things for the function body
public function getThing( $id, $qty )
{
   $things = &$this->thingCollection; // <-- pass by reference

   if ( empty($things) )
      $things = [];

   if ( empty($things[$id]) )
      $things[ $productId ] = [];

   if ( empty($things[ $id ][ $qty ]) )
      $things[ $id ][ $qty ] = get_thing_from_database( $id, $qty );

   return $things[ $id ][ $qty ];
}
4

3 に答える 3

2

理解に苦しむことになるので、開発者がコードを保守する巧妙な回避策を発明しないでください。PHP が行う方法は $this を使用することであり、言語の規則を受け入れる必要があります。

于 2013-03-14T18:52:44.400 に答える
1

問題は、php がそれらを同じものと見なさないため、特定のメソッドがそのプロパティ名を持つローカル変数を持つことができることです。例えば:

class MyBuddy
{
   private $friend = true;

   public function holler($friend)
   {
       if ($this->friend == $friend ) // <- parser won't resolve $friend to a member variable
          return 'Heeeeey Buuuuuday!';
       else
          return null;
   }
}

define("HELL_NAW", false);
define("MMM_HMMM", true);

$hombre = new MyBuddy();
echo $hombre -> holler(HELL_NAW);

$l_jessie = new MyBuddy();
echo $l_jessie -> holler(MMM_HMMM);

したがって、あなたが求めているものを得るには、次のようにすることができます:

 public function holler()
   {
       $friend = $this ->friend;
       if ($friend )
          return 'Heeeeey Buuuuuday!';
       else
          return null;
   }

しかし、それはリーンの反対と言えるかもしれません。しかし、それはまた、PHPがあなたの責任原則を念頭に置いて設定されていないというポイント(およびアレックスの)を示しています.誰の目にも美的に見える。

一方、php には魔法のメソッド __get()があり__set()、それらの処理方法を定義することで、未定義またはアクセスできないプロパティを参照できます。存在しないため、参照する必要はあり$this->friendません。メソッドの引数を参照するだけです (これは便利ですが、これもクラスター ベイトを確認するだけです)。

于 2013-03-14T19:14:57.970 に答える
0

私はほとんど自分で投稿したので、あなたの質問に同情します。これは、実行したいことがより読みやすいケースですが、クラス レベルのオブジェクトを対象とする場合に $this-> の標準的な使用を期待する別の PHP 開発者には当てはまりません。

于 2013-03-14T19:00:11.140 に答える