【问题标题】:How this class and sub methods use works?此类和子方法如何使用?
【发布时间】:2010-09-22 07:14:48
【问题描述】:

我一直在浏览一些php源码,想知道下面的类和子方法是如何使用的:

<?php
$me = new Person;
$me->name("Franky")->surname("Chanyau")->phone("+22", "456 789");
?>

我对 OOP 有相当扎实的了解,所以我不想要 101。我只需要知道如何使上述代码成为可能。

【问题讨论】:

标签: php oop class


【解决方案1】:

方法链是可能的,通过

return $this;

在方法结束时。

这里解释: phpandstuff: Method Chaining Plus Magic Setters

这些方法通常设置一个实例变量,然后返回 $this。

public function phone($param) {
  $this->phone = $param;
  return $this;
} 

【讨论】:

  • 好的,那么是否也可以使用方法链,但不是返回 $this,而是返回您创建的另一个对象?
  • @Franky 这是可能的,但严格来说,方法链接返回主机对象。一旦你开始返回不同的对象,你就进入了 Fluent Interface 的方向(创建一个 DSL)。这两者经常混淆。
  • 是的,您可以返回另一个对象。但从那时起,你不能链接对象 1 的方法,只能链接对象 2 的方法。--edit:不知道你为什么要这样做。
  • 那是一些深刻的东西。不过我喜欢学习新事物。我会尝试一些代码并尽快回复您。
  • @Ross - 方法做什么并不重要,只要它返回当前实例($this),您可以附加其他方法。当然,一个返回值的普通 getter 函数不会真正起作用,因为它不返回 $this
【解决方案2】:

方法 name() surname()phone() 返回一个 Person 实例。你可以通过

return $this;

这些方法很可能是这样的:

public function name($name) {
    $this->name = $name;
    return $this;
}

【讨论】:

    【解决方案3】:

    就像其他人说的,它是一个流畅的接口http://en.wikipedia.org/wiki/Fluent_interface#PHP 基本思想是一个类的方法总是返回对象本身

    class Car {
        private $speed;
        private $color;
        private $doors;
    
        public function setSpeed($speed){
            $this->speed = $speed;
            return $this;
        }
    
        public function setColor($color) {
            $this->color = $color;
            return $this;
        }
    
        public function setDoors($doors) {
            $this->doors = $doors;
            return $this;
        }
    }
    
    // Fluent interface
    $myCar = new Car();
    $myCar->setSpeed(100)->setColor('blue')->setDoors(5);
    

    (通过维基)

    【讨论】:

    • 不是。 仅仅是方法链和流利的接口之间存在概念上的区别。按照 Fowler 的定义,方法链接返回宿主对象。 Fluent Interface 旨在创建 DSL。 Fluent 接口可以使用方法链(以及其他技术),但方法链不是 Fluent 接口。一个流畅的接口的例子是Zend_Db_Table: $table-&gt;select()-&gt;from('foo')-&gt;where('bar = baz')-&gt;assemble();
    • 你是对的,不是每次我使用方法链接它都是一个流畅的界面,但我不会说那是他想要完成一个流畅的界面还是只是方法链接.. .
    【解决方案4】:

    这叫做方法链。基本上每个类函数都会返回对象本身($this),以便用户可以在返回的对象上调用更多函数。

    public function name() {
        //other stuff...
        return $this;
    }
    

    http://www.talkphp.com/advanced-php-programming/1163-php5-method-chaining.html

    http://www.electrictoolbox.com/php-method-chaining

    【讨论】:

      【解决方案5】:

      这个想法是,如果我们返回 $this,那么我们可以将对象方法调用链接在一起。这是解决方案:

       <?php 
      
          class Person
          {
              private $strName;
              private $strSurname;
              private $ArrPhone = array();
      
              public function name($strName)
              {
                  $this->strName = $strName;
                  return $this; // returns $this i.e Person 
              }
      
              public function surname($strSurname)
              {
                  $this->strSurname = $strSurname;
                  return $this; // returns $this i.e Person
              }
      
              public function phone() 
              {   $this->ArrPhone = func_get_args(); //get arguments as array
                  return $this; // returns $this i.e Person
              }
      
              public function __toString()
              {
                  return $this->strName." ".$this->strSurname.", ".implode(" ",$this->ArrPhone);
              }
          }
      
          $me = new Person;
          echo $me->name("Franky")->surname("Chanyau")->phone("+22", "456 789");
      
      ?>
      

      【讨论】:

        【解决方案6】:

        正确答案,但要使代码正常工作,您应该编写:

        $me = new Person();
        

        而不是

        $me = new Person;
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-13
        • 1970-01-01
        • 2018-10-08
        • 1970-01-01
        • 1970-01-01
        • 2017-03-03
        相关资源
        最近更新 更多