私はあなたの中にはインターフェイスや抽象を想定しているものもありますが、状況の一部しか処理しないことは知っています。ここではそれらが壊れる例があります。PHPでカスタムクラスをキャストする最善の方法は何ですか
は、私たちが同じインターフェイスを実装するクラスを持っており、いくつかの状況で
class car extends fourwheeler implements ipaygas{
protected $tank1;
//interface
public function payGas($amount){}
}
class sportscar extends fourwheeler implements ipaygas{
protected $tank1;
protected $tank2;
//interface
public function payGas($amount){}
}
interface ipaygas{
function payGas($amount);
}
インタフェースを同じベースを延長すると仮定あなただけの「payGasを()」を実行することをお勧めしますと、あなたが必要とするすべてです。しかし、あなたが満たすべき条件があるときは、あなたはどうしますか?
例:ガスを支払う前に、(1)車のタイプを確認する、(2)スポーツカーにプレミアムガスを使用する、(3)スポーツカーの第2タンクを満たす必要がある場合。
これは私が何をしたいですが、私は実際の型キャストでこれをどのように操作を行うことができませ
function pumpAndPay(iPayGas $car){
if(gettype($car) == "car"){
fillTank($car,(car) $car->tank1);
}else{
fillTank($car,(sportscar) $car->tank1);
fillTank($car,(sportscar) $car->tank2);
}
}
できますか? PHPで可能ですか?
(回答に基づいて)アップデート:私の「本当の」場合 ...私は、異なるペイント、ボディ、インテリア、gas_type、cleaner_type、色、などとそれぞれに様々な車種をチェックする必要が想像を...
abstract class AVechicle{}
abstract class ACar extends AVechicle{}
abstract class ATruckOrSUV extends AVechicle{}
abstract class ABike extends AVechicle{}
class Car extends ACar{}
class SportsCar extends ACar{}
class SUV extends ATruckOrSUV{}
class Truck extends ATruckOrSUV{}
class Bike extends ABike{}
class Scooter extends ABike{}
class GasStation{
public function cleanVehicle(AVehicle $car){
//assume we need to check the car type to know
//what type of cleaner to use and how to clean the car
//if the car has leather or bucket seats
//imagine we have to add an extra $2/h for sports cars
//imagine a truck needs special treatment tires
//or needs inspection
}
public function pumpAndPay(AVehicle $car){
//need to know vehicle type to get gas type
//maybe we have a special for scooters only, Green Air campaign etc.
}
public function fullService(AVehicle $car){
//need to know if its a truck to do inspection FIRST
$this->cleanVehicle($car);
$this->pumpAndPay($car);
//bikes get 10% off
//cars get free carwash
}
}
インタフェースと抄録だけが唯一のこれまでのところに行くだろう...
これらの 'のvar tank1;'宣言は、 '$ tank1を保護する必要があります;' - ドル記号が必要とされ、あなたが入る必要がありますそれらを「私的」または「保護された」ものに隠す習慣があります。 @dan-leeのように、 'fillTank'はおそらくインスタンスメソッドであるべきです。 – halfer
また、あなたの例でタンク変数を再作成しようとしているようですが、それはあなたが望むものではないと思います。特定のクラスの新しいインスタンスをインスタンス化する方法を作成し、共通のデータを一方から他方にコピーすることによって、ふるい分けの再作成を行うことができますが、私はあなたがそれをとにかく必要とは思わないでしょう。 – halfer
@halfer変数について申し訳ありません...私はそれをすばやく行いました。私はあなたがデータをコピーすることによって何を意味するのか理解していますが、実際のキャスティングが私に値を与えるときに余分な操作(classAの読み込み、classAの小道具のコピー、クラスBへの小道具のコピー) –