40

次のコード内には、オブジェクト$quiz_object->personalitiesの配列が含まれていPersonalityます。

// Loop through each personality that exists for the quiz
foreach($quiz_object->personalities AS $existing_personality)
{

    // Show all of the existing personalities
    echo $existing_personality->GetQuizMakerPersonalityHTML();
}

$existing_personalityforeach ループ内の変数をオブジェクト型として「キャスト」するにはどうすればよいですか (正しい言葉だと思います) 。

$existing_personality->と入力すると、そのオブジェクト タイプで使用できるパブリック関数のリストを取得できるように、これを実行したいと考えています。

アップデート

現時点では、Zend Studio はループPersonality内でオブジェクトの配列をループしていることを認識しておらず、標準変数であると認識しているだけです。ただし、これは型であり、私のコードは完全に機能します。foreach ループ内の変数に関する IDE ヒントが必要なだけです。

明確にするために、次の場合、他のすべてのオブジェクトのヒントが表示されます。

$personality_object = new Personality();

// I get the IDE hints here
echo $personality_object->MyFunction();

しかし、foreach でループを開始するとすぐに、Zend はオブジェクトの配列をループしていることを認識できません。

これは、パーソナリティの配列がPersonalityオブジェクト内で最初に定義される方法です。

class Personality
{

    // Array of Personality objects
    public $personalities = array();

}
4

5 に答える 5

104

使用している IDE に大きく依存します。

@varNetbeans と IntelliJでは、コメントで使用できます。

/* @var $variable ClassName */
$variable->

IDE は $variable がクラス ClassName であり、. の後にヒントがあることを認識し->ます。

独自の IDE でも試すことができます。

戻り値が になることを示す@returnアノテーションをメソッドで作成することもできます。これは ClassName オブジェクトの配列を意味します。getPersonalities()ClassName[]

/**
 * Returns a list of Personality objects
 * @return Personality[]
 */
function getPersonalities() {
    return $this->personalities;
}

これは、IDE がこのタイプのヒントをどのように解釈しているかにも依存します。

これを foreach ループで使用するには、次のようにします。

/* @var $existing_personality Personality */
foreach( $quiz_object->personalities as $existing_personality ){
}

または 2:

foreach( $quiz_object->getPersonalities() as $existing_personality ){
}

IDE が十分に親切であれば、どちらも IDE ヒンティングを有効にする必要があります。

追加の注意として、これを独自のクラス内で使用する場合は、クラス変数を宣言するときに同じシグネチャを使用できます。

class MyClass
{ 

    /** 
    * @var ClassName[] $variable List of ClassName objects. 
    */ 
    var $variable;

}
于 2012-09-13T16:10:18.190 に答える
13

phpStormを使用している人のために、これをそこに投げ込むと思っただけです.

オブジェクトのメソッドを自動入力するように IDE を取得する方法は、オブジェクトが存在し、$var がそのオブジェクトのインスタンスであることを確認する前に簡単な if チェックを含めることであることがわかりました。

例:

            foreach ($objArray as $obj) {
            if (is_object($obj) && $obj instanceof DataObject) {

                $obj->thisMethodShouldBeAvailableInPHPStormNow();

            }

より良い方法を探しているときにこの質問を見つけましたが、上記は私にとってはうまくいきます。

乾杯!

于 2014-02-05T01:21:30.507 に答える
3

foreach 内からいつでも別の関数を呼び出し、関数宣言でクラスを宣言できます。これには、このコードを別の場所で再利用できるという利点もあります。たとえば、getPriceFromProduct以下の関数内で、$product のクラスを Product として宣言する方法がわかります。

もちろん、このようにする必要がないのはいいことだと思いますが、うまくいきます。

class ProductBundle {

  private $products; //buy this
  public function get_products() { return $this->products; }
  public function add_product($product) { $this->products[] = $product; }

  public function get_price() {
        $products = $this->get_products();
        $prices = array();
        foreach($products as $product) {
            $prices[] = $this->getPriceFromProduct($product);
        }
        return array_sum($prices);
    }

    private function getPriceFromProduct(Product $product) {
        $price = $product->get_price();
        return $price;
    }
于 2014-10-16T22:55:16.500 に答える