这可能是不可能的,但我想在我重新编写整个过程之前我会问:
我有一个对象类,它可以接收“件”,这也是对象。工作原理如下:
class myObject {
//Receives an associative array of "Piece" objects
function __construct($objects) {
foreach( $objects as $k=>$v ) {
$this->{$k} = $v;
}
}
}
很明显,我省略了很多代码,但我希望这能给你一个想法。基本上,我有很多不同的“块”对象可以做不同的事情,如果我将它们的数组传递给
myObject
然后
我的对象
成为一个非常灵活和有用的班级做各种不同的事情。
所以,我可以用这个来创建一个
Book
对象和包含“author piece”和“isbn piece”的片段,这些片段将知道如何验证数据等,因此我可能已经
$book
对象设置为成员变量时
author
和
isbn
.
这很好,因为我可以做如下的事情:
echo $book->author; //all Pieces have a __toString() method.
echo $book->author->firstName;
$book->author->showBio();
$book->author->contactForm();
等等。
现在说到重点。这个系统工作得很好,其中一个让它变得很好的原因是我可以挑选我喜欢的任何一个片段,把它们粘在一个物体上,把它们绑在一起。
但问题是,我不希望其他人稍后使用代码尝试:
$book->author = "John Doe";
_,因为这样,它们只会有一个值而不是author对象。我希望给他们一个错误,并指示他们改为这样做:
$book->author->setName("John Doe");
因此,因为我事先不知道任何单个物体中可能存在什么样的碎片(而关键是能够自由地立即组装任何物体),所以我不能仅仅设置
private $author
在类声明中。
我试着和
__get()
和
__set()
有一点,但是我不能让它在不损害对象的功能的情况下工作,就像现在一样。
所以,就像我说的,我知道这可能是不可能的,但在我放弃之前,我想我会问。是否有一种方法可以在对象创建后保护它的属性,而不在类定义中声明它?