代码之家  ›  专栏  ›  技术社区  ›  Tyler Carter

__get()和_set()的最佳实践[已关闭]

  •  3
  • Tyler Carter  · 技术社区  · 16 年前

    由此产生 question __get() __set() 为了访问私有变量,我想了解它们的一般用法。我想知道何时何地使用重载函数的最佳时机,以及您在哪里使用过重载函数(如果有)。

    http://us2.php.net/manual/en/language.oop5.magic.php

    4 回复  |  直到 9 年前
        1
  •  3
  •   Community Mohan Dere    6 年前

    惰性模型getter(使用uu get())

    我不记得在我的应用程序中经常使用PHP的神奇方法,但我记得有一种情况 __get() 非常有用。

    __得到()

    后来我进一步研究了它,并以同样的方式加载了惰性组件。

    动态模型方法(使用_call())

    find() findAll() findBy<FieldName>() findAllBy<FieldName>() .

    notes(id, date, title, body)
    

    findById() , findByTitle()

    蛋糕是用巧克力做的 __call() 查找() 芬德尔() 使用根据方法名称和参数动态创建的条件。这是一个非常简单的实现,可以给你带来很多好处。

        2
  •  2
  •   Jake    16 年前

    我使用_get()和_set()访问私有数组的元素,即:

    class Something {
        private $data;
    
        public function __set($key, $value) {
            //put validation here
            $this->data[$key] = $value;
        }
    
        public function __get($key) {
            if (!array_key_exists($this->data, $key)) {
                 throw new Exception("Invalid member $key.");
            } else {
                 return $this->data[$key];
            }
        }
    }
    

    因此,通过一些验证,例如$person->age=“asdf”将立即抛出一个异常(如果age是公共成员则可以)

        3
  •  0
  •   Nathan    16 年前

    一些示例:

    class formatedContainer {
        private $holder;
        protected $mode = "formated";
    
        public function __set($var, $value) {
            $formated = chunk_split($value, 4, "-");
            if(substr($formated, -1) == "-") 
                $formated = substr($formated, 0, strlen($formated) - 1);
            $this->holder[$var] = array('formated' => $formated, 'plain' => $value);
        }
    
        public function __get($var) {
            return $this->holder[$var][$this->mode];
        }
    
        public function getPlain() {
            $this->mode = "plain";
        }
    
        public function getFormated() {
            $this->mode = "formated";
        }
    }
    
    $texts = new formatedContainer();
    $texts->myText = md5(uniqid());
    $texts->anotherText = md5("I don't change!");
    
    //Prints something like: 440e-6816-b2f5-7aa5-9627-9cc8-26ef-ef3b
    echo $texts->myText;
    
    $texts->getPlain();
    
    //Prints something like: 8559d37c5a02714dca8bd1ec50a4603a
    echo "<br/>" . $texts->anotherText;
    

    有点没用,但我想你会有主意的。}

        4
  •  0
  •   grantwparks    16 年前

    网上有很多例子,使用 __get() __set() 与私有“属性数组”结合使用。在我的类定义中,我希望有一个有趣的转折点,那就是能够真正声明公共属性,并且仍然使用这些神奇的拦截器——用于更多的自文档化代码,并使我的IDE能够完成代码,等等。通常,如果声明了这些属性, __得到() __集合() 不会接到电话。我发现如果我 unset() 在我的类构造函数中具有相同的属性,我可以充分利用这两个方面。

    推荐文章