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');在该汽车类设置 $make = 'Toyota' 之后,我如何更改 setInfo() 方法调用 ,就像那样

我怎样才能像下面这样打印这个对象

make = Toyota
model = scp10
4

7 回答 7

1

You need to add return $this; in the end of your method for chain-like calls.

于 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 回答
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 的魔术 getter/setter 想法,只是为了好玩。

于 2013-03-21T10:57:39.780 回答
0

You should use $car1->setInfo('make', 'Toyota') only once. That's because you create a car, then set info, and then you want to set info to info, but you can't set info to info.

于 2013-03-21T10:53:14.027 回答
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 回答