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->幻灯片值,但我不希望能够“触摸”原始对象。
答案 0 :(得分:2)
如果我理解正确您正在寻找clone:
$editable = clone $slider->get_slide(5);
$editable->id = 6;
$editable->name = 'new_name';
答案 1 :(得分:0)
为此,您需要在OOP用语中使用名为getters
的内容。这只是一种方法,它唯一的任务就是返回私人/受保护的财产
属性为private
或protected
的事实是为了限制它在对象/类本身之外被操纵。任何人都可以随时更改所有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;