Method Chains PHP OOP

后端 未结 3 972
自闭症患者
自闭症患者 2020-12-03 17:52

Commonly, in a lot of frameworks, you can find examples of creating a query using the query builder. Often you will see:

$query->select(\'field\');
$query         


        
相关标签:
3条回答
  • 2020-12-03 18:19

    This is called Fluent Interface -- there is an example in PHP on that page.

    The basic idea is that each method (that you want to be able to chain) of the class has to return $this -- which makes possible to call other methods of that same class on the returned $this.

    And, of course, each method has access to the properties of the current instance of the class -- which means each method can "add some information" to the current instance.

    0 讨论(0)
  • 2020-12-03 18:20

    Basically, you have to make every method in the class return the instance:

    <?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');
    
    ?>
    

    This is often used as pure eye candy but I suppose it has its valid usages as well.

    0 讨论(0)
  • 2020-12-03 18:28
    class c
    {
      function select(...)
      {
        ...
        return $this;
      }
      function from(...)
      {
        ...
        return $this;
      }
      ...
    }
    
    $object = new c;
    
    0 讨论(0)
提交回复
热议问题