代码之家  ›  专栏  ›  技术社区  ›  Andrew

在不事先知道对象名称的情况下保护对象属性

  •  0
  • Andrew  · 技术社区  · 15 年前

    这可能是不可能的,但我想在我重新编写整个过程之前我会问:

    我有一个对象类,它可以接收“件”,这也是对象。工作原理如下:

    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() 有一点,但是我不能让它在不损害对象的功能的情况下工作,就像现在一样。

    所以,就像我说的,我知道这可能是不可能的,但在我放弃之前,我想我会问。是否有一种方法可以在对象创建后保护它的属性,而不在类定义中声明它?

    1 回复  |  直到 11 年前
        1
  •  3
  •   halfdan    15 年前

    这绝对不是不可能的。你应该改写魔法 __get 和设置功能

    这样地:

    class myObject {
      protected $data = array();
    
      public function __construct($objects) {
        foreach( $objects as $k=>$v ) {
          $this->data[$k] = $v;
        }
      }
    
      /* your code */
    
      public function __get($name) {
        if(array_key_exists($name, $this->data)) {
          return $this->data[$name];
        }
        return null;
      }
    
    推荐文章