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

方法链PHP OOP

  •  12
  • Layke  · 技术社区  · 14 年前

    通常,在许多框架中,您可以找到使用查询生成器创建查询的示例。你经常会看到:

    $query->select('field');
    $query->from('entity');
    

    但是,在某些框架中,您也可以这样做

    $object->select('field')
           ->from('table')   
           ->where( new Object_Evaluate('x') )
           ->limit(1) 
           ->order('x', 'ASC');
    

    你是怎么做这种链子的?

    3 回复  |  直到 12 年前
        1
  •  18
  •   Pascal MARTIN    14 年前

    这个叫 Fluent Interface ——有一个 example in PHP 在那一页上。

    基本思想是每种方法 (你想用链子锁起来) 必须返回的类 $this --这样就可以在返回的 $此 .

    当然,每个方法都可以访问类的当前实例的属性——这意味着每个方法都可以向当前实例“添加一些信息”。

        2
  •  7
  •   Álvaro González    14 年前

    基本上,必须使类中的每个方法返回实例:

    <?php
    
    class Object_Evaluate{
        private $x;
        public function __construct($x){
            $this->x = $x;
        }
        public function __toString(){
            return 'condition is ' . $this->x;
        }
    }
    class Foo{
        public function select($what){
            echo "I'm selecting $what\n";
            return $this;
        }
        public function from($where){
            echo "From $where\n";
            return $this;
        }
        public function where($condition){
            echo "Where $condition\n";
            return $this;
        }
        public function limit($condition){
            echo "Limited by $condition\n";
            return $this;
        }
        public function order($order){
            echo "Order by $order\n";
            return $this;
        }
    }
    
    $object = new Foo;
    
    $object->select('something')
           ->from('table')
           ->where( new Object_Evaluate('x') )
           ->limit(1)
           ->order('x');
    
    ?>
    

    这经常被用作纯眼糖,但我想它也有其有效的用途。

        3
  •  2
  •   just somebody    14 年前
    class c
    {
      function select(...)
      {
        ...
        return $this;
      }
      function from(...)
      {
        ...
        return $this;
      }
      ...
    }
    
    $object = new c;