获取PHP对象属性,但无法更改原始对象属性

时间:2016-10-05 10:31:46

标签: php oop

class Slider {
    private $slides;

    private $dublicate;

    public function get_slide($id) {

        foreach ( $this->slides as $slide ) {
            if ( $slide->id === $id ) {
                $this->dublicate = $slide;
                return $this->dublicate;
            }
        }

        return false;
    }

    public function add_slide($slide) {
        $this->slides[] = $slide;
    }

    public function get_slides() {
        return $this->slides;
    }
}

class Slide {
    public $id;

    public $name;
}

$slider = new Slider();

$slide = new Slide();
$slide->id = 5;
$slide->name = 'old_name';

$slider->add_slide($slide);

var_dump($slider->get_slides());

$editable = $slider->get_slide(5);
$editable->id = 6;
$editable->name = 'new_name';

var_dump($slider->get_slides());

首先var_dump给出了这个结果:

array(1) {
  [0]=>
  object(Slide)#2 (2) {
    ["id"]=>
    int(5)
    ["name"]=>
    string(8) "old_name"
  }
}

和第二个var转储:

array(1) {
  [0]=>
  object(Slide)#2 (2) {
    ["id"]=>
    int(6)
    ["name"]=>
    string(8) "new_name"
  }
}

因此,您可以看到原始$ slider-> slides数组的值已更改。如何获得$ slider->幻灯片值,它与原始值没有“连接”?

我需要$ slider->幻灯片值,但我不希望能够“触摸”原始对象。

4 个答案:

答案 0 :(得分:2)

如果我理解正确您正在寻找clone

$editable = clone $slider->get_slide(5);
$editable->id = 6;
$editable->name = 'new_name';

答案 1 :(得分:0)

为此,您需要在OOP用语中使用名为getters的内容。这只是一种方法,它唯一的任务就是返回私人/受保护的财产 属性为privateprotected的事实是为了限制它在对象/类本身之外被操纵。任何人都可以随时更改所有public方法,因为这正是public关键字的含义。

总之,将您的课程更改为以下内容:

class Slide {
    private $id;
    private $name;

    /**
      * @return string The name of the slide.
      */
    public get_name () {
        return $name;
    }

    /**
      * @param string $name The new display name of the slide.
      */
    public function set_name ($name) {
        // Normally one has some validation logic here, to ensure valid input.
        $this->name = $name;
    }
}

完成后,您可以使用以下内容clone对象:

$original = new Slides ();
$ediable = clone $original;
$editable->set_name ('New name');

答案 2 :(得分:0)

您只需要保护对象属性,为它们创建getter函数,而不是创建setter。这样你就可以获得房产但不能改变它的价值。简单的例子:

class Something{
    protected $some;
    protected $thing;

    public function __construct($some, $thing){
        $this->some = $some;
        $this->thing = $thing;
    }

    public function getSome(){
       return $this->some;
    }
    public function getThing(){
       return $this->thing;
    }
}

在初始化对象时,您可以在构造函数中设置属性,然后您可以触摸这些属性,但可以获取它们。

答案 3 :(得分:0)

你可以替换return this-> dublicate;返回克隆$ this-> dublicate;