PHP神奇方法

PHP神奇方法,php,magic-methods,Php,Magic Methods,我的问题围绕着各种神奇的方法 这是一个小例子: $context = new Context('Entities.xml'); $user_array = $context->Users; $user = $context->Users->find(array('name' => 'John Smith')); 第二行返回一个包含所有用户对象的数组。第三行仅返回名为John Smith的用户的用户对象 我想知道这是否可能,棘手的是我不知道上下文类的属性。它们是从用户实例

我的问题围绕着各种神奇的方法

这是一个小例子:

$context = new Context('Entities.xml');
$user_array = $context->Users;
$user = $context->Users->find(array('name' => 'John Smith'));
第二行返回一个包含所有用户对象的数组。第三行仅返回名为John Smith的用户的用户对象

我想知道这是否可能,棘手的是我不知道上下文类的属性。它们是从用户实例化时提供的xml文件生成的,可以通过magic Getter和Setter访问

上下文示例不完整,仅给出一个想法:

class Context {
   private $path, $entities;

   public function __construct($path) {
      $this->path = $path;
   }

   public function __get($name) {
      return $entities[$name];
   }

   public function __set($name, $arg) {
      $entities[$name] = $arg;
   }
}

因为我真的需要一个解决方案,所以我实现了以下解决方案

上下文类的getter返回处理结果的ResultLayer类

例如:

class ResultLayer implements IteratorAggregate {
    public $data = array();
    private $entity, $context;

    public function __construct($context, $entity) {
        $this->context = $context;
        $this->entity = $entity;
    }

    public function getIterator() {
        return new ArrayIterator($this->data);
    }

    public function get($index) {
        return $this->data[$index];
    }

    public function toArray() {
        return $this->data;
    }

    public function find($properties) {
        return $this->context->getEntity($this->entity, $properties);
    }
}
我已经实现了IteratorAggregate接口,因此您可以使用foreach循环,例如遍历$Context->Users,这使代码更具可读性

如果有人有更好的方法,我仍然愿意接受。非常感谢您的帮助