PHP:遍历所有对象方法(调用对象中的所有方法)


PHP: Iterate through all object methods (call all methods in object)

在PHP中,有没有办法以编程方式调用对象的所有方法?

我有一个充满包含 HTML 片段的方法的对象:

class Example {
   public function introduction(){
     ?>
     <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
     <?php
  }
  public function step_one(){
     ?>
     <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
     <?php
  }
  Etc...
}

有没有办法在循环中按顺序调用所有这些方法?还是我必须直呼他们的名字?

如果您不知道该类中将有多少个方法,但您知道每个方法的名称基础。然后,您可以像这样循环访问它们:

<?php
class Example {
   public static function loop() {
    self::introduction();
    $name = "step_one";
    $int = 2;
    $formater = new NumberFormatter("en", NumberFormatter::SPELLOUT);
    while (true) {
        if (method_exists(get_class(), $name)) {
            self::$name();
            $number = $formater->format($int);
            $name = "step_" . $number;
            $int ++;
        }
        else {
            break;
        }
    }
   }
   public static function introduction(){
     ?>
     <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
     <?php
  }
  public static function step_one(){
     ?>
     <p>1Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
     <?php
  }
    public static function step_two(){
     ?>
     <p>2Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
     <?php
  }
    public static function step_three(){
     ?>
     <p>3Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
     <?php
  }
}
Example::loop();
?>

或者,您可以按声明顺序循环访问它们,如下所示:

<?php
class Example {
   public function loop() {
    $methods = get_class_methods(get_class());
    foreach ($methods as $method) {
      if ($method != "loop") {
        $this->$method();
      }
    }
   }
   public function introduction(){
     ?>
     <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
     <?php
  }
  public function step_one(){
     ?>
     <p>1Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
     <?php
  }
    public function step_two(){
     ?>
     <p>2Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
     <?php
  }
    public function step_three(){
     ?>
     <p>3Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
     <?php
  }
}
$a = new Example();
$a->loop();
?>

感谢 C.Liddell 为我指明了正确的方向。这是我最终在我的构造函数中所做的:

public function __construct(){
  $methods = get_class_methods($this);
  foreach($methods as $method) :
    if($method === '__construct') :
      continue;
    endif;
    $this->$method();
  endforeach;
}