2
class Car {


    function __construct() {
//        echo 'car con';
    }

    function setInfo($car_arr) {
            foreach ($car_arr as $key => $value) {
                $this->{$key} = $value;
            }

    }

}

私は以下のようにアクセスしようとします

$car1 = new Car();
$car1->setInfo('make', 'Toyota')->setInfo('model', 'scp10');

それは私に以下のエラーを与えました

Call to a member function setInfo() on a non-object

$car1->setInfo('make', 'Toyota')->setInfo('model', 'scp10');その自動車クラス set $make = 'Toyota' の後にsetInfo() メソッド呼び出しを変更するにはどうすればよい ですか?

次のようにこのオブジェクトを印刷するにはどうすればよいですか

make = Toyota
model = scp10
4

7 に答える 7

1

すべての回答を 1 つにまとめるには (@EaterOfCorpses を除く):

<?php
class Car {
  private $data = array();

  function setInfo(array $carInfo) {
    foreach ($carInfo as $k => $v) {
      $this->data[$k] = $v;
    }
    return $this;
  }

  function __set($key, $val) {
    $this->data[$key] = $val;
  }
  function __get($key) {
    return $this->data[$key];
  }
}

$car = new Car();
$car->setInfo(['make' => 'Toyota', 'warranty' => '5 years']);

return $this一度にすべてのプロパティを設定する場合は、理由がないことに注意してください。

編集して追加: 楽しみのために、Mark Ba​​ker のマジック ゲッター/セッターのアイデアも含めます。

于 2013-03-21T10:57:39.780 に答える
1

return $this;チェーンのような呼び出しを行うには、メソッドの最後に追加する必要があります。

于 2013-03-21T10:53:03.870 に答える
1

setInfo コードを次のように自分自身を返すように変更します。

function setInfo($car_arr,$car_val=null) {

    if(is_array($car_arr)){
        foreach ($car_arr as $key => $value) {
            $this->{$key} = $value;
        }
    }else if(is_string($car_arr) && $car_val != null){
        $this->{$car_arr} = $car_val;
    }
    return $this;
}

それ自体を返すため、関数をチェーンできるようになりました。

また、好きなように呼び出したい場合 ( like $this->setInfo("make","Ford"))、else onis_arrayを追加し、上記のコードに示すようにオプションのパラメーターを追加する必要があります

于 2013-03-21T10:53:16.320 に答える
0

それは呼ばれますfluent interface

追加

return $this;

setInfo() メソッドの最後の行として

于 2013-03-21T10:53:27.810 に答える
0

配列構文を使用します。$car1->setInfo(array('make', 'Toyota'))

于 2013-03-21T10:53:44.440 に答える
0

関数で $this を返すことができます (php 5.4 の場合):

function setInfo($car_arr) {

   ...

   return $this;
}
于 2013-03-21T10:54:00.450 に答える
0

一度だけ使用してください$car1->setInfo('make', 'Toyota')。これは、車を作成してから info を設定し、次に info を info に設定したいのですが、info を info に設定できないためです。

于 2013-03-21T10:53:14.027 に答える