php中没有create array的对象访问

时间:2013-03-21 10:51:37

标签: php arrays

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

如何在汽车类设置$ make =' Toyota'之后更改setInfo()方法调用$car1->setInfo('make', 'Toyota')->setInfo('model', 'scp10');

我怎样才能打印这个对象 波纹管

make = Toyota
model = scp10

7 个答案:

答案 0 :(得分:1)

您需要在方法的末尾添加return $this;以进行类似链的调用。

答案 1 :(得分: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;
}

现在你可以链接这些函数,因为它自己返回。

如果您想按照自己的意愿调用它(例如$this->setInfo("make","Ford")),则需要在is_array上添加其他内容并添加可选参数,如上面的代码所示

答案 2 :(得分: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的魔术吸气剂/设定者想法,只是为了它的乐趣。

答案 3 :(得分:0)

您应该只使用$car1->setInfo('make', 'Toyota')一次。那是因为您创建了一辆汽车,然后设置了信息,然后您想将信息设置为信息,但您无法将信息设置为信息。

答案 4 :(得分:0)

它被称为fluent interface

添加

return $this;

作为setInfo()方法的最后一行

答案 5 :(得分:0)

使用数组语法:$car1->setInfo(array('make', 'Toyota'))

答案 6 :(得分:0)

你可以在你的函数中返回$ this(如果你有php 5.4):

function setInfo($car_arr) {

   ...

   return $this;
}