web-dev-qa-db-ja.com

PHP foreachループでオブジェクト型として変数をキャストする

次のコード内で、$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();
}

オブジェクトタイプとしてforeachループ内で変数$existing_personalityをどのように "キャスト"します(これは正しい単語だと思います)。

これを実行して、$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();

}
30
Luke

それはあなたが使っているIDEに大きく依存します。

NetbeansとIntelliJでは、コメントで_@var_を使用できます。

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

IDEは、$ variableがクラス名であることがわかり、_->_の後にヒントが表示されます。

自分のIDEでも試してみることができます。

また、getPersonalities()メソッドで_@return_アノテーションを作成して、戻り値が_ClassName[]_であることを示すこともできます。これは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;

}
_
72
Krycke

phpStormを使用している人のために、これをここに投入すると思いました。

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

例:

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

                $obj->thisMethodShouldBeAvailableInPHPStormNow();

            }

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

乾杯!

8
lordvig

私はこの投稿が古いことを知っていますが、これは誰かを助けるかもしれないと思います:

PhpStormでは、この方法で、おそらく他の人でも動作します。

/**
 * @param ClassName[] $variables
 */
public function loopFunction($variables){
    foreach ($variables as $variable) {
        echo $variable->functionName();
    }
}
4
Daniel Guerrero

いつでも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;
    }
3
CommaToast

IDEによって異なる方法で取得される可能性のあるコメントではなく、コードで実際の型宣言が必要な場合は、_ array_* などのarray_walk関数を使用できます。

array_walk($quiz_object->personalities, function (Personality $p) {
    echo $existing_personality->GetQuizMakerPersonalityHTML();
});
1
jleeothon