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

PropertyObject类帮助

php
  •  0
  • Searock  · 技术社区  · 16 年前

    我刚接触过PHP,目前正在阅读Wrox Professional PHP5。

    有人能给我解释一下下面的代码吗?

    <? php
    
    abstract class PropertyObject
    {
    //Stores name/value pairs that hook properties to database field names
    protected $propertyTable=array();
    
    //List of properties that have been modified.
    protected $changedProperties=array();
    
    //Actual data from the database.
    protected $data;
    
    //Any validation errors that might have occured.
    protected $errors=array();
    
    public function __construct($arData)
    {
         $this->data=$arData;
    }
    
    function __get($propertyName)
    {
         if(!array_key_exits($propertyName,$this->propertyTable))
         {
              throw new Exception("Invalid property \"$propertyName\" !");
         }
    
         if(method_exists($this,'get'.$propertyName))
         {
              return call_user_func(array($this,'get'.$propertyName));
         }
         else
         {
              return $this->data[$this->propertyTable[$propertyName]];
         }
    }
    
    function __set($propertyName,$value)
    {
         if(!array_key_exits($propertyName,$this->propertyTable))
         {
              throw new Exception("Invalid property \"$propertyName\" !")
         }
    
         if(method_exits($this,'set'.$propertyName))
         {
         return call_user_func(array($this,'set'.$propertyName),$value);
         }
         else
         {
         //If the value of the property really has changed and it's not already in the changedProperties array, add it.
    
              if($this->propertyTable[$propertyName] !=$value && !in_array($propertyName,$this->changedProperties))
              {
                   $this->changedProperties[]=$propertyName;
              }
    
              //Now set the new value
              $this->data[$this->propertyTable[$propertyName]]=$value;
    
         }
    }
    
    }
    ?>
    

    我不能理解评估器获取和设置方法中的代码。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Artefacto    16 年前

    这个 __get 当请求对象的属性但未声明或未专门分配(用于动态属性)时,调用magic方法。本实施方案:

    • 首先尝试查看逻辑属性是否作为名为的实际声明属性中的条目存在。 $propertyTable .
    • 如果它不存在,它会抛出一个异常,因此离开方法,
    • 如果它存在并且另外存在一个名为 'get'.$propertyName (即, "get" 与请求属性名连接),调用该方法并返回其值。
    • 如果它存在,但没有这样的方法,则返回带有键的条目的值 $propertyName 在申报财产中 财产表 .

    考虑到这个,我想你可以 __set 出来。见 Magic Methods 在PHP手册中。

        2
  •  1
  •   sleepynate    16 年前

    这是设置DB存储类的一种非常常见的方法。所发生的是基于PropertyObject(因为PropertyObject是抽象的)实例化一个对象。

    class MyObj extends PropertyObject {    
    }
    $m = new MyObj();
    

    它继承了 __get() 和 __set() 方法。任何时候通过 -> 运算符 γ-() 和 α-集() 分别调用方法。

    $m->foo;          #calls MyObject::__get('foo');
    $m->bar = 'baz';  #calls MyObject::__set('bar','baz');
    

    这个 γ-() 方法首先检查属性表中是否定义了一个键(此处为数据库中的字段建模),如果不存在,则抛出异常。 然后, get() 将查看是否有一个预先定义了“get”的函数。所以,假设 foo 是一把钥匙 propertyTable , γ-() 看看我们是否定义了一个方法 getfoo ,如果有的话,为我们调用它,并返回它的值。

     //if(method_exists($this,'get'.$propertyName))
     //{
     //     return call_user_func(array($this,'get'.$propertyName));
     //}
    $m->foo;  # checks if MyObj::getfoo is defined, and if so, calls it
    

    最后,如果有钥匙 福 在 属性表 但没有名为 盖福 ,它只返回数组位置的值 $m->data 其键是中数组位置的值 属性表 谁的钥匙是 福

    α-集() 定义方法大致相同,但不返回存储在 data 数组检查是否有一个预先结束的“set”,并检查对象上设置的值是否与 数据 数组,如果是,则在设置新值之前将属性名添加到ChangedProperties数组中。

    推荐文章