使用Magic方法了解Simple类

时间:2016-07-23 23:08:28

标签: php

我刚刚开始关注PHP上的OOP视频系列,并在一节课后进行了以下课程。起初没有__get__set,因为他向我们展示了如何处理公共变量。但为了示范,讲师将public $postal_code更改为protected $_postal_code. 基本上他所展示的是他可以改变我们使用

设置的原始邮政编码
$adress->postal_code = "M422 3555";

进入" ADDED PROTECTED VALUE"通过这种方法

 protected function _postal_code_guess(){
        return 'ADDED PROTECTED VALUE';

现在我理解的两个主要问题是我们的__get__set方法如何知道$name是什么?如果我在get或set方法中的任何内容之前echo $name,它会告诉我它代表postal_code。但那是为什么呢?它在哪里设定了这个价值?

我有点困惑的另一件事是$output.=",".$this->postal_code;行仍在运作。因为我们将原始的公开$postal_code更改为受保护的$_postal_code; Doe-sent,这意味着我们应该更改

$output.=",".$this->postal_code;

$output.=",".$this->_postal_code;

TLDR

1.我们的代码如何知道$name是什么?

  1. 为什么我们仍然允许$output.=",".$this->postal_code;,即使我们的变量已更改为protected _postal_code
  2. 以下是所有代码

    class Adress{
    
        public $country;
        public $province;
        public $city;
        public $adress;
        protected $_postal_code;
    
        // primary key of an adress
        protected $_adress_id;
        protected $_time_created;
        protected $_time_updated;
    
        function __get($name){
    
            if(!$this->_postal_code){
                $this->_postal_code = $this->_postal_code_guess();
            }
    
            // attempt to return a protected property by name
            $protected_property_name = "_".$name;
            if(property_exists($this,$protected_property_name)){
                return $this->$protected_property_name;
            }
    
            trigger_error("Undefined property via __get".$name);
            return null;    
        }
    
        function __set($name,$value){
            if('postal_code' == $name){
                $this->$name = $value;
                return;
            }
    
            trigger_error('Undefined or unallowed propert via __set()');
    
        }
    
        protected function _postal_code_guess(){
            return 'ADDED PROTECTED VALUE';
        }
        function display(){
            $output = '';
    
            $output.=$this->country;
            $output.="<br/>";
            $output.=$this->province;
            $output.=' '.$this->city;
    
    
      $output.=" ".$this->adress;
        $output.=",".$this->postal_code;
        return $output;
    }
    

    }

    这是我们运行它的demo.php文件

    <?php
    require 'index.php';
    $adress = new Adress;
    $adress->country = "Canada";
    $adress->province = "Ontario";
    $adress->city = "Toronto";
    $adress->adress ="4324323 Bob Street";
    $adress->postal_code = "M422 3555";
    echo '<tt><pre>'.var_export($adress,TRUE).'</tt></pre>';
    echo $adress->display();
    echo '<h2>Test Protected Variables</h2>';
    unset($adress->postal_code);
    echo $adress->display();
    

1 个答案:

答案 0 :(得分:0)

官方PHP手册中有decent description of __get() and __set() magic methods

$this->postal_code仅适用于__get()方法,在您的示例中,该方法动态尝试查找已删除下划线的属性。它不是任何默认的PHP行为,只是特定于您的代码。