2017-09-28 8 views
0

私はPHPオブジェクト指向プログラミングの研究を始めました。
私は一般的にPHPの経験が限られています。PHP配列の戻り値のみ

次のように私はPHPのコードを持っている:

A "カーズ" クラス:

class Cars { 
    static $car_specs = array("wheel_count", "name", "color"); 
    static function set_car_detail() { 
     self::$car_specs["wheel_count"] = 4; 
     self::$car_specs["name"] = "default"; 
     self::$car_specs["color"] = "generic"; 
    } 
    static function get_car_detail() { 
     return self::$car_specs; 
    } 
} 

、その後、私は出力にこのしようとしています:

Cars::set_car_detail(); 
echo implode(',', Cars::get_car_detail()); 

をエコーは次のとおりです。

wheel_count,name,color,4,default,generic 

ただし、取得しようとしている:

4,default,generic 

foreachの試みも同様の応答をもたらしました。 私は何が間違っているのか理解したい。

+2

これはあなたの代わりにも1列+への静的 –

+0

可能な複製のための必要性をすべてのプロパティを入れていないのゲッター/セッターを使用する必要がありますOOP-されていません[PHP - 2つの配列(同じ長さ)を1つの結合にマージしますか?](https://stackoverflow.com/questions/1200885/php-merge-two-arrays-same-length-into-one-associative) – War10ck

+0

なぜですかあなたは別の機能で詳細を設定しますか?将来、それらの価値を渡す予定ですか?それ以外の場合は、まだ水和された配列を作成しない理由は理解できません。 – War10ck

答えて

1

あなたが投稿したコードは、クラスではありません。それはファンキーな名前を持つグローバル関数と変数の単なる束です。静的なプロパティやメソッドはOOPでないので避けてください。また、公共の財産やゲッター/セッターを避けるようにしてください。

Carクラスの骨格は次のようになります。

class Car { 
    private $wheel_count; 
    private $name; 
    private $color; 

    public function __construct($wheel_count, $name, $color) 
    { 
     $this->wheel_count = $wheel_count; 
     $this->name = $name; 
     $this->color = $color; 
    } 

    public function paint($new_color) 
    { 
     $this->color = $new_color; 
    } 

    public function describe() 
    { 
     return sprintf('%d wheels, %s %s', $this->wheel_count, $this->color, $this->name); 
    } 
} 

オブジェクトのプロパティは、プライベートです。カプセル化は、OOPの重要な概念の1つです。それらはコンストラクタで設定されます。コンストラクタの役割は、オブジェクトを初期化して動作させることです。コンストラクタがすべてのオブジェクトのプロパティを初期化し、何もしない(コンストラクタ内では何もしません)。

クラスに適したアクションのメソッドを作成します。例えば、車の車輪の数は決して変化しないので、異なる数の車輪を設定する方法を書いている点はない。しかし車の色が変わることがあり、paint()メソッドがそれを処理します。

「ゲッター」(つまり、プロパティの値を返す以外の何もしないメソッド)を記述しないでください。クラスに属するコードの一部は、クラスの外のどこかに書かれています(そして、何回も、どこでも、どこでも、変更なしで複製されます)。可能で適切な場合は、オブジェクトのプロパティを使用して有用な値を生成するメソッドを記述します(有用な値を他の場所で計算できるようにゲッターを書くのではなく)。

これは、以下に説明Carクラスを使用する方法です。

$car1 = new Car(4, 'Mazda', 'red'); 
$car2 = new Car(8, 'big truck', 'blue'); 

echo($car1->describe()); 
# 4 wheels, red Mazda 

$car1->paint('green'); 
echo($car1->describe()); 
# 4 wheels, green Mazda 
+0

ありがとうございます。あなたの返信は最も有益でした。 提供されるクラスが実際にクラスではないことに同意します...私の焦点は、静的な変数と関数がどのように働くかというその時間でした。 –

+0

静的プロパティは、複雑な名前(および可視性制約)を持つグローバル変数です。彼らは継承されません。 'self :: $ car_specs'を使って' Cars'を拡張するクラスからstatic変数( 'Cars :: $ car_specs')にアクセスできますが、子クラスのプロパティを宣言しない限り、' self: :$ car_specs'は 'Cars :: $ car_specs'と同じです。これは混乱と間違いを招く反直感的な動作です。静的メソッドは、複雑な名前(および可視性制約)を持つグローバル関数です。 – axiac

0

自明機能は、あなたが値を持つ配列を初期化していること

static function get_car_detail() { 
     return array_values(self::$car_specs); 
    } 
+2

'implode'は既に配列の値だけで動作しています。問題はここにありません – iainn

2

のために特別にありますが、おそらくあなたは、キーとそれを初期化したい:

static $car_specs = array(
    "wheel_count" => null, 
    "name" => null, 
    "color" => null 
); 
+0

これはどういうわけか、わかりません。 キーだけで配列を初期化した後に値を追加すると、悪い習慣をしていると思いますか? –

+0

@ AviE.Koenig:確かに、あなたは正しいです。ちょうどそれは "私は間違っている"という質問のための可能な答えの一つです。 – Walrus

1

あなたが既に持っているので、 keyの値の配列では、それぞれのキーに対応する配列valuesを作成し、array_combine()を使用してください。

class Cars { 
    static $car_specs; 

    static function set_car_detail() { 
     $keys = array("wheel_count", "name", "color"); 
     $values = array(4, "default", "generic"); 

     self::$car_specs = array_combine($keys, $values); 
    } 

    static function get_car_detail() { 
     return self::$car_specs; 
    } 
} 

Cars::set_car_detail(); 
echo implode(',', Cars::get_car_detail());