2017-12-14 6 views
0

私はそれを継承するいくつかのクラスを持つ基本クラスを持っています。変数型の変更phpDoc

class Pet{ 
    ... 
} 
class Dog extends Pet{ 
    ... 
} 
class Cat extends Pet{ 
    ... 
} 

それから私は、これらのクラスは、私が受け取ることになりますいくつかのJSONオブジェクトに基づいています

class Person{ 
    /** @var Pet */ 
    public $pet; 
} 

このクラスを消費し、別のクラスを持っています。 JSONオブジェクトには、DogオブジェクトまたはCatオブジェクトを含めることができます。私はswitchステートメントを実行して、それが実行時にどれであるか把握し、適切に処理します。しかし、私はそれが猫であるか犬であるかにかかわらず、PHPDocを介してタイプヒントを得たいと思います。私は実行時にタイプがPetからDogに変更されたことを指定する方法を理解することができませんでした。これはうまくいきませんでした。それはまだ普通の古いPetオブジェクトだと思っています。

$pet = json_decode($jsonObj); 
if($pet->type == "dog"){ 
    /** @var Dog */ 
    $pet = $pet; 
} 

PHPDocを使用して実行時に型をサブタイプに変更するにはどうすればよいですか?

答えて

1

あなたはinstanceofを使用して、以下を使用することができます。

if ($pet instanceof Dog) { 
    $dog = $pet; 
    //now the IDE and runtime knows it is a Dog. 
} elseif ($pet instanceof Cat) { 
    $cat = $pet; 
    //now the IDE and runtime knows it is a Cat. 
} 

のみのDocblockを使用して別の方法を:

if ($pet->type === "dog") { 

    /** @var Dog $dog */ 
    $dog = $pet; 
    //now the IDE knows it is a Dog (at runtime this could be a Cat too). 

} elseif ($pet->type === "cat") { 

    /** @var Cat $cat */ 
    $cat = $pet; 
    //now the IDE knows it is a Cat (at runtime this could be a Dog too). 

}